Java中集合类扩容操作案例分析
Java中的集合类,如ArrayList
、HashSet
等,通常在元素数量超过当前容量时会进行扩容操作。以下是一些常见的集合类扩容操作的案例分析:
1. ArrayList
的扩容ArrayList
是基于动态数组实现的,当添加元素时,如果数组没有足够的空间来容纳新元素,就会进行扩容操作。默认情况下,ArrayList
的初始容量为10,每次扩容时,容量大约是原来的1.5倍(具体是原容量的1.5倍向上取整)。
扩容操作示例:
javaArrayList<Integer> list = new ArrayList<>(); //初始容量为10for (int i =0; i <20; i++) {
list.add(i); // 当添加到第11个元素时,会触发扩容操作}
###2. HashSet
的扩容HashSet
是基于HashMap
实现的,所以它的扩容操作与HashMap
类似。当HashMap
中的元素数量超过当前容量与加载因子的乘积时,就会进行扩容操作。默认情况下,HashMap
的初始容量为16,加载因子为0.75。
扩容操作示例:
javaHashSet<Integer> set = new HashSet<>(); //初始容量为16for (int i =0; i <20; i++) {
set.add(i); // 当添加到第13个元素时,会触发扩容操作}
###3. LinkedHashSet
的扩容LinkedHashSet
内部维护了一个链表来保持元素的插入顺序,同时使用HashMap
来存储元素。它的扩容操作与HashMap
相同。
4. HashMap
的扩容HashMap
在元素数量超过当前容量与加载因子的乘积时会进行扩容操作。扩容时,会创建一个新的容量更大的数组,并将旧数组中的元素重新映射到新数组中。
扩容操作示例:
javaHashMap<Integer, String> map = new HashMap<>(); //初始容量为16for (int i =0; i <20; i++) {
map.put(i, "Value" + i); // 当添加到第13个元素时,会触发扩容操作}
###5. LinkedHashMap
的扩容LinkedHashMap
维护了一个双向链表来保持元素的插入顺序或访问顺序,同时使用HashMap
来存储元素。它的扩容操作与HashMap
相同。
总结-扩容操作通常发生在添加元素时,当集合的当前容量不足以容纳更多元素时。
-扩容操作涉及到创建新的数组并重新映射旧数组中的元素,这是一个相对耗时的操作,因此合理地选择初始容量和加载因子可以减少扩容操作的次数,提高性能。
- 不同的集合类有不同的扩容机制和性能特点,选择合适的集合类对于优化程序性能至关重要。
还没有评论,来说两句吧...