1、类的基本结构
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
|-HashSet
|-TreeSet
Map
├Hashtable
├HashMap
└WeakHashMap
2、基本概念
0)Collection : 顶层接口,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。public interface Collection<E> extends Iterable<E>
1)Set(集合):集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类(TreeSet)能对集合中的对象按特定方式排序。
2)List(列表):集合中的对象按索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象。
3)Map(映射):集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复。
3、实现类的重要区别
1)ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢;这就是线性表的顺序表的优点和缺点,即查询快,删除、插入较慢。
2)Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,但是在一些安全方法里面他是很有用的。想要把一个List作为同步的线性表时,可以这样使用:Collections.synchronizedList(list);
3)LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!这就是线性表的链表的优点和缺点,即查询慢,但是删除插入快。可以用它作为队列。
4)Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
5)Queue 是一个Collection的子接口,Deque 是1.6 新增的接口继承了Queue接口,他的子类主要就是完成队列的栈的功能,相比之前的采用Stack或List(LinkedList实现了Deque)作为队列与栈效果都要好,而且,Deque 是可以同时作为队列和堆栈,他与List的一个很大区别是他没有Index索引查找元素。所以,如果需要使用队列或堆栈时可以考虑Deque的子类:ArrayDeque
6)Set的实现其实和Map有着重大关系,看源代码你就会发现,Set就是Map的key部分,Map的value则是一个常量替代。
4、其他注意事项
注意,开始学习的时候大家都认为,集合给我们最大的好处就是什么对象都可以存入,如果是数组的话只能存入特定类型的对象,其实这个特点是集合的缺点,这也就是为什么有泛型的出现,对于数组来说,集合的最大有点是集合可以边长存储元素!!如果是一个Object类型的数组不也一样可以存储任何数据类型的对象吗?但是这样又有什么用呢?类型转换是一个危险操作。
5、集合遍历与删除
private void print(Collection<String> list ){ Iterator<String> iter = list.iterator(); while(iter.hasNext()){ String str = iter.next(); if(str.equals("key")){ iter.remove(); } } }
不能采用其他方式的for循环删除元素,否则会发生异常:java.util.ConcurrentModificationException