《疯狂的JAVA讲义》笔记-第8章集合
-
Iterator、ListIterator接口Iterator迭代时是将元素的值返回,并不是将元素本身返回,所以迭代时无法更改元素的值。但是可以删除ListIterator则拥有增删改查以及向前迭代的功能
-
HashSetHashMap类- 通过Hash算法来确保key 或者元素不能重复的类,一般不要进行更改。因为更改了内容可能会导致错误,如
equals()返回相等以及hashCode()相同, 取出或删除的时候无法定位。 - 如果两个元素
hashCode()相等但是equals()返回false则需要在一个“桶”里装多个元素,会导致性能的下降。听说JDK8通过红黑树解决了这个麻烦
- 通过Hash算法来确保key 或者元素不能重复的类,一般不要进行更改。因为更改了内容可能会导致错误,如
-
LinkedHashSet、TreeSetLinkedHashSet在使用hasCode()定位元素的同时,使用链表来维护集合顺序(以插入顺序为序),所以迭代遍历很快,插入稍慢,可满足要求有一定顺序的集合需求TreeSet也是有序的,但是是按元素的实际值大小进行排序。
-
EnumSet- 占用内存小 ,性能好
- 要求同一个
EnumSet里都是统一的枚举类。
-
ArrayList- 变长的数组,自动扩容
- 最好在添加大量数据前,使用
ensureCapacity(int minCapacity)方法来避免多次重分配内存。initCapacity = 10
-
Map性能- 尽量不要用
TreeMap,如果要用,可通过使用LinkedHashMap并确保插入key-value对时有序即可 - 一般情况下,使用
HashMap,小范围内可以使用EnumMap,要严格使用==的可以使用IdentityHashMap,内存吃紧的时候可以使用WeakHashMap
如何保证
HashMap不因扩容而浪费性能,可参照如何保证HashMap不重建Hash表 - 尽量不要用
-
Collecitons工具类- 返回不可变类的三个方法
emptyXxx(): 返回一个空的Xxx对象SingletonXxx(Xxx): 返回只有一个对象的不可变对象unmodifiable(xxx): 返回对象的不可变对象
- 返回不可变类的三个方法
-
综合
- 线程不安全的集合,可以通过
Xxx x = Collections.synchronizedXxx(new Xxx())如List l = Collections.synchronizedList(new ArrayList())来获取线程安全的集合,当然性能会降低。 - 如果要使用集合,则推荐使用
HashSet,除非需要根据 元素实际值进行排序才使用TreeSet
- 线程不安全的集合,可以通过
-
各种集合的性能对比
- 底层使用数组为实现的,随机访问性能最好。底层使用链表为实现的,插入删除性能最佳。
- 迭代则使用链表更快
- 应用场景
- 当遍历时,
LinkedList使用迭代器,其他使用随机访问的方式 - 如果经常需要插入删除,则使用
LinkedList;如果

- 当遍历时,
本文是《疯狂JAVA讲义》第8章集合的笔记。介绍了集合接口迭代特性,类的Hash算法及相关问题,如JDK8用红黑树解决性能问题。还提及不同集合的顺序特性、内存占用和性能,以及工具类方法、线程安全处理和集合性能对比,给出应用场景建议。
1839

被折叠的 条评论
为什么被折叠?



