ch08_Java集合
参考学习源码:github源码_Java集合
8.1 Java集合概述
为了保存数量不确定的数据、以及保存具有映射关系的数据,Java提供了集合类。
8.2 Collection和Iterator接口
1)当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的
remover()方法删除上一次next()方法返回的集合元素才可以;否则将引发java.util.ConcurrentModificationException异常。
8.3 Set集合
1)HashSet 按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
特点:
a.不能保证元素的排序;
b.HashSet不是同步的;
c.集合元素可以是null。
注意:把一个对象放入HashSet中,如果需要重写该对象的equal方法,则应该也要重写HashCode方法。规则是:如果两个对象通过equals方法比较返回true,则这两个对象的hashcode值也应该相同。
当向HashSet中添加可变对象时,必须十分小心。如果修改HashSet集合中的对象,有可能导致该对象与集合中的其它对象想等,从而导致HashSet无法准确访问该对象。
- LinkedHashSet使用了链表记录集合元素的添加顺序。
- TreeSet采用红黑树的数据结构来存储集合元素。
- 自然排序
如果试图把一个对象添加到TreeSet时,则该对象的类必须实现Comparable接口,否则程序将会抛出异常。compareTo(Object obj). - 定制排序
Comparator接口。该接口中包含一个 int compare(T o1,T 02)方法。
注意:如果希望TreeSet能正常运作,TreeSet只能添加同一种类型的对象。
- EnumSet在内部以位向量的形式存储。
- Set的三个实现类HashSet,TreeSet,EnumSet都是线程不安全的。通常可以通过Collections工具类的synchronizedSortedSet方法来包装该Set集合。此操作最好在创建时进行,以防止对Set集合的意外非同步访问。
8.4 List集合
- List判断两个对象相等的标准是只要通过equals方法比较返回true即可。
- ArrayList和Vector的显著区别:ArrayList是线程不安全的,Vector是线程安全的。Stack继承Vector,同样是线程安全,性能较差,需要使用栈操作,推荐使用ArrayDeque。
- ArrayDeque既实现了List接口,也实现了Deque接口。
- Arrays里有个asList(Object…a)可以把一个数组或者指定格式的对象转换成一个List集合。这个List集合是Arrays的内部类ArrayList的实例。
8.5 Queue集合
- ArrayDeque 不仅可以作为栈使用,也可以作为队列使用;
- Queue代表了队列,Deque代表了双端队列(既可以作为队列使用,也可以作为栈使用)。对于ArrayList,Vector应该使用随机访问来遍历集合,对于LinkedList应该使用迭代器来遍历集合。
- 若有多个线程需要同时访问List集合中的元素,开发者可考虑使用Collections将集合包装成线程安全的集合。
8.6 Map集合
- Linked使用双向链表来维护key-value对的次序,迭代顺序与key-value对的插入顺序保持一致。
- Properties类是Hashtable的子类,属性文件里的属性名和属性值都只能是字符串类型,所以ProPerties里的key,value都是字符串类型。
- EnumMap不允许使用null作为key,但允许使用null作为value。
- TreeMap底层采用红黑树来管理key-value对。
- Hash表里可以存储元素的位置被称为"桶"(bucket)。
8.8 操作集合的工具类: Collections
8.9 烦琐的接口:Enumeration
Java之所以保留Enumeration接口,主要是为了照顾以前那些古老的集合。应该尽量避免使用,多使用Iterator迭代器。