1.扩容
加载因子的系数小于等于1,意指 即当 元素个数 超过 容量长度*加载因子的系数 时,进行扩容。
eg:加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
Class | 初始大小 | 加载因子 | 扩容倍数 | 底层实现 | 是否线程安全 | 同步方式 |
---|---|---|---|---|---|---|
ArrayList | 10 | 1 | 1.5倍+1 | Object数组 | 线程不安全 | - |
Vector | 10 | 1 | 2倍 | Object数组 | 线程安全 | synchronized |
HashSet | 16 | 0.75f | 2倍 | HashMap<E,Object> | 线程不安全 | - |
HashMap | 16 | 0.75f | 2倍 | Map.Entry(双列集合) | 线程不安全 | - |
Hashtable | 11 | 0.75f | 2倍+1 | Hashtable.Entry数组 | 线程安全 | synchronized |
摘自:https://www.huaweicloud.com/articles/a0477284714da867d6e4dca38d73fa2a.html
https://blog.csdn.net/weixin_42184707/article/details/81530131
2.内存泄漏(溢出)
2.1. Q:在Java中怎么可以产生内存泄露?
A:Java中,造成内存泄露的原因有很多种。典型的例子是一个没有实现hasCode和equals方法的Key类在HashMap中保存的情况。最后会生成很多重复的对象。所有的内存泄露最后都会抛出OutOfMemoryError异常,下面通过一段简短的通过无限循环模拟内存泄露的例子说明一下。
package com.test;
import java.util.HashMap;
import java.util.Map;
import static java.lang.Thread.sleep;
/**
* @author riemann
* @date 2019/04/21 0:03
*/
public class TestHashMapMemoryLeak {
public static void main(String[] args) {
Map<Key, String> map = new HashMap<Key, String>(1000);
int count = 0;
while (true) {
map.put(new Key("dummyKey"), "value"