一些容器类的构造函数有默认的参数,用来控制容器的初始容量,建议是尽可能准确地预测容量需求,根据需求创建指定大小的容器,而不是使用默认的容量,这样可以有效减少内存的浪费,以及扩容所带来的开销。
总结一下就是除了在首次申请空间以及超过上限的情况下,基本都是直接翻倍申请新的空间,然后还涉及到原有key的rehash问题,所以扩容的开销也是蛮大的,在resize的过程中,空间占用的峰值会达到原有空间3倍,所以设置合理的capacity和loadFactor可以在很大程度上提高性能。
所有有自动扩容功能的非链表实现的容器基本都有这个过程,下面总结一下常见的一些容器的默认初始容量和扩容策略:
容器类:初始长度/扩容倍数
- ArrayList:10/1.5
- ArrayDeque:8/2
- BitSet:64/2
- HashMap:16/2
- HashSet/TreeSet:同HashMap(基于HashMap实现,value为空Object)
- Hashtable:11/2
- WeakHashMap:同HashMap
- PriorityQueue:11/Double size if small; else grow by 50%
- StringBuilder:16/按需
网友评论