Java集合扩容是Java集合框架中一个重要的机制,用于在集合元素数量超过当前容量时自动增加容量,以保证集合能够继续存储更多的元素。不同的集合实现类有不同的扩容机制和扩容策略。以下是一些常见Java集合的扩容机制:
1. ArrayList
默认初始容量:10
扩容策略:当向ArrayList中添加元素,且当前元素个数超过了数组长度时,就会触发扩容操作。ArrayList的扩容机制是通过ensureCapacityInternal
方法实现的,该方法会根据需要调用grow
方法进行扩容。扩容后的新容量是原容量的1.5倍加1(也有说法是原容量的0.5倍加1,但1.5倍加1的描述更为常见)。例如,如果原容量是10,扩容后的新容量将是16。
2. Vector
默认初始容量:10
扩容策略:Vector的扩容机制与ArrayList类似,但扩容后的新容量是原容量的2倍。如果用户指定了容量增量,则按指定的增量进行扩容。Vector是线程安全的,但性能上可能比ArrayList差一些。
3. HashSet
默认初始容量:16
扩容策略:HashSet是基于HashMap实现的,因此其扩容机制与HashMap类似。当向HashSet中添加元素,且元素个数超过了负载因子(默认为0.75)乘以容量时,就会触发扩容操作。扩容后的新容量是原容量的2倍。例如,如果原容量是16,且负载因子为0.75,那么当元素个数超过12时就会触发扩容,扩容后的新容量将是32。
4. HashMap
默认初始容量:16(在JDK 1.8及以后版本中,当第一次put元素时才会真正扩容为16)
扩容策略:HashMap的扩容机制是当元素个数超过了负载因子(默认为0.75)乘以容量时,就会触发扩容操作。扩容后的新容量是原容量的2倍。HashMap在扩容时,会重新计算每个元素的哈希值,并根据新的容量确定元素在数组中的位置。这个过程可能会改变元素在数组中的顺序。
5. LinkedHashMap
扩容策略:LinkedHashMap的扩容机制与HashMap类似,也是当元素个数超过了负载因子与容量的乘积时触发扩容操作,扩容后的新容量是原容量的2倍。LinkedHashMap在扩容时会保留元素的插入顺序或访问顺序(取决于构造函数的参数)。
总结
Java集合的扩容机制是集合框架中非常重要的一部分,它保证了集合在元素数量增加时能够自动调整容量,从而避免了因容量不足而导致的性能问题。不同的集合实现类有不同的扩容策略和扩容增量,了解这些机制有助于我们更好地使用Java集合框架。在实际编程中,根据实际需求选择合适的集合类型,并合理利用其扩容机制,可以提高代码的质量和效率。