您的位置:首页 > 职场人生

黑马程序员------集合总结*

2013-11-19 20:54 411 查看
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


一、为什么出现了集合

因为面向对象中对事物都是以对象的形式而体现,为了方便对对象的操作,首先要对对象进行存储,而集合就是存储对象的一个很好的容器

二、集合和数组的区别

1、数组长度是固定的;集合长度是可变的

2、数组可以存储基本数据类型和引用数据类型;集合只能够存储对象

3、数组只能怪存储同一类型数据;集合可以存储不同类型的对象

三、集合的体系图






Collection是集合框架中常用的一个接口,其下有两个子接口List和Set

Collection

|--List(列表):集合中元素存放和提取是有序的;元素可以重复,因为该集合体系有索引

|--ArrayList

|--LikedList:

|--Vector:

|--Set(集):集合中元素存放和提取时无序的;元素保证唯一性

|--HashSet:

|--TreeSet:

四、迭代器

1、为什么会出现迭代器

每一个容器都有存和取的方式,而每个容器的底层数据结构不一样,所以存取方式可能也会不一样。因为要想从容器中取出数据,首先要判断容器中是否有这个数据,对于取出这个动作,不足以用一个函数来描述,基于封装思想,把这些方法封装在一个对象中,因此每个容器中都会有一个这样的对象,这时,由于容器中的元素在容器中去更方便,所以把这个对象抽象出来形成类定义在类中,形成类部类,而每个容器都有类部类,这时候再把这些类的共性(判断、取出)抽取出来形成一个接口Iterator。那么如何获取集合的取出对象呢,通过对外提供的一个方法iterator。

2、迭代器的好处

好处一,因为定义了迭代器,以后再有新的容器出现,直接实现这个接口就可以取出数据了

好处二,java使用了迭代器可以使得对容器的遍历操作和其底层完全隔离,达到很好的解耦效果

3、迭代器的创建

Iterator i =集合对象.iterator();

迭代器的引用不是通过new创建的,而是通过集合对象调用iterator方法创建的。

因为Collection容器实现了Iterator接口,所以Collection的子类集合对象都具备迭代器

4、取出方式

第一种,for(Iterator i = 集合对象.iteraotor();i.hasNext()){i.next()}

第二种,Iterator i = 集合对象.iterator(); while(i.hasNext()){e.next()}

注意:迭代器的next方法返回的是Object,所以要进行类型转换

5、ListIterator接口

ListIterator是List集合特有的迭代器,是Iterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。所以在迭代器时,只能用迭代器的方法操作元素。可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作。如果想要其他的操作,如添加、修改等,就需要使用其子接口:ListIterrator。该接口只能通过List集合的ListIterator方法获取。

ListIterator特有的方法

add(obj);//后面增加一个元素

set(obj);//该元素修改为obj

hasPrevious();//判断前面有没有元素

previous();//取前一个元素

五、List集合

List:元素存放时有序的,因为有索引,所以可以重复(不需要hashCode和equals方法保证元素唯一性)

|--ArrayList:底层数据结构是数组结构,采用数组形式来保存对象,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦(索引),线程不同步

|--LinkedLst:底层数据结构是链表结构,把每个对象存放在独立的空间中,每个空间存放着下一个对象的索引,每次需要查找时都需要从第一个索引开始

|--Vector:底层数据结构是数组结构,线程不同,枚举是Vection特有的方法,其作用和迭代器是一样的,因为其名称和方法的名称都过长,所以被ArrayList取代了。

注意:凡是可以操作角标的方法都是该集合体系特有的方法!

ArrayList集合方法:

//指定位置添加元素

al.add(1,"haha");

print(al);

//指定位置添加集合

al.add(1,al1);

print(al);

//指定位置删除元素

al.remove(1);

print(al);

//查找指定位置元素

print(al.get(0));

//修改指定位置的元素

al.set(1,"heihei");

print(al);

//获取对象位置indexOf(Object obj)

print(al.indexOf("heihei"));

//返回指定范围的元素(包头不包尾)

print(al.subList(1,3));

LinkedList集合特有方法:

:以下方法如果列表为空,则抛出异常

addFirst(); //将指定元素插入到此列表的开头

addLast();//将指定元素插入到此列表的结尾

获取但不删除元素

getFirst();

getLast();

获取并删除元素

removeFirst();

removeLast();

:以下方法如果列表为空,则返回null

offerFirst();

offerLast();

//获取不删除

peetFirst();

peetLast();

//获取并删除

pollFirst();

pollLast();

六、Set集合

Set:元素存放时无序的,并且集合中元素具有唯一性,不可以重复

|--HashSet:底层数据结构是哈希表,线程不同步,可以存入null,但因为元素的唯一性,只能够存入一个null值,保证元素唯一性的原理是:使用了hashCode方法和equals方法,当我们使用add方法往集合中添加对象时,在add方法内部会首先调用hashCode方法来计算对象的哈希值,如果返回的哈希值和集合中已经存有的元素哈希值不一致,那么就将该对象添加进集合中,这时因为不同对象的哈希值也可能相同,所以当该对象哈希值和集合中已经存有的元素哈希值相同时,会继续调用equals方法来判断。

|--TreeSet:底层数据机构是二叉树,不可以存入null,保证元素唯一性的原理是:复写了Comparable接口中的compareTo方法,当使用add方法往集合中添加对象时,首先会遍历集合中已经存在的数据,并调用compareTo方法,根据方法的返回值决定是否插入和插入的位置。



1、HashSet集合:

hashCode方法和equals方法;

public int hashCode(){
return this.name.hashCode()+age;
}

public boolean equals(Object obj){
if(!(obj instanceof Student)){
return flase;
}else{
Student s =(Student) obj;
return this.name.equals(obj.name) && this.age==s.age;
}
}


注意:HashSet判断元素是否存在和删除元素时也是调用了hashCode和equals方法

2、TreeSet集合:

保证元素唯一性是调用了Comparable接口中的compareTo方法;

对元素进行排序有两种方式:

1、让元素自身具备比较性,调用Comparable接口中的compareTo方法,通过返回值进行排序,这种方式也称为元素的自然排序,也叫默认排序

public int compareTo(Object obj){
if(obj instanceof Student){
throw new RunTimeException("此对象不是所属Student类");
}else{
Student s = (Student)obj;
//这里根据年龄进行排序,如果年龄相同,在判断姓名,注意,这里比较年龄时要形成Integer类的对象,因为compareTo方法只能怪比较对象
if(0==(new Integer(this.age).compareTo(new Integer(s.age)))){
return this.name.compareTo(s.name);
}
}else{
return new Integer(this.age).compareTo(new Integer(s.age));
}
}
}


2、当元素自身不具备比较性,或是该比较性不是所需要的时候就需要创建比较器,此比较器为一个自定义类实现Comparator接口,并且复写compare方法的对象

class Bijiaoqi implements Cpmparator{
public int compare(Object obj1,Object obj2){
Student s1 =(Student)obj1;
student s2 =(student)obj2;

int dj = s1.getName().compareTo(s2.getName());
if(dj==0){
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
}else{
return dj;
}
}
}


七、Map集合(Map<K,V>)

何时使用Map集合

当数据之间存在映射关系的时候使用Map集合

Map集合与Collection集合的区别

1、Map集合和Collection集合在集合框架中是并列存在的

2、Map集合是一个双列集合,存储的是键值对;Collection集合是一个单列集合,存储的是单个对象

3、Map集合存入键值对的方法是put方法;Collection集合存入对象的方法是add方法

Map集合的特点:

1、存入键值对是一对一对的存入

2、保证键的唯一性

3、Map集合中没有直接取出值的方法,只有通过keySet方法获取到键存到Set集合中,然后再通过创建迭代器来获取相应的值;或者通过entrySet方法获取映射关系存到Set集合中,然后通过创建迭代器取出映射关系,再通过Map.Entry接口实例的getKey方法和getValue方法来获取键和值

Map集合的子类

|--hashtable:底层是哈希表数据结构,不可以存入null键和null值,线程同步,JDK1.0,效率低,已被HashMap取代。

|--hashMap:底层是哈希表数据结构,可以存入null键和null值,因为键的唯一性,所以只能存一个null,线程不同步,JDK1.2,效率高

|--TreeMap:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行排序

Mao集合中的方法:

m.put("01","zs1");

m.put("02","zs2");

/*

* put方法:

* 1、当集合中没有新加入的元素时,返回null

* 2、当集合中已经存在新加入的元素时,返回该值

* 3、第二次加入同样的值,会覆盖前面的值

* */

System.out.println("put:"+m.put("03","zs3"));

System.out.println("put:"+m.put("03","zs33"));

//判断是否包含"01"键

System.out.println("containsKey:"+m.containsKey("01"));

//判断是否有"01"键,有的话返回这个键对应的值,没有的话返回null

//System.out.println("remove:"+m.remove("01"));

//判断是否有“01”键,有的话返回这个键对应的值,没有的话返回null

System.out.println("get:"+m.get("01"));

System.out.println("get:"+m.get(null)); //如果是Hashtable类就不行

//获取Map集合中所有的值(注意:这里values方法的返回类型是Collection。Collection coll = m.values())

System.out.println("values:"+m.values());

八、Map集合的两种取出方式

1、通过keySet方法获取到键存到Set集合中,然后再通过创建迭代器来获取相应的值

//第一种方法,调用keySet方法
Set s = m.keySet();

Iterator i = s.iterator();

while(i.hasNext()){
String str = i.next();
System.out.println(str+"....."+m.get(str));
}


2、通过entrySet方法获取映射关系存到Set集合中,然后通过创建迭代器取出映射关系,再通过Map.Entry接口实例的getKey方法和getValue方法来获取键和值

//第二种方法,调用enteySet方法
Set<Map.Entry> s1 = m.entrySet();

Iterator<Map.Entry> i1 = s1.iterator();

while(i1.hasNext()){
Map.Entry me = i1.next();
String str1 = me.getKey();
String str2 = me.getValue();
System.out.println(str1+"....."+str2);
}


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: