常用的Map有HashMap, TreeMap, ConcurentHashMap, HashTable
HashMap 数据结构- 数组+链表+红黑树(JDK8增加的)
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认容量
static final int MAXIMUM_CAPACITY = 1 << 30; // 最大容量
static final float DEFAULT_LOAD_FACTOR = 0.75f; // 默认负载因子
static final int TREEIFY_THRESHOLD = 8; // 转红黑树阈值
static final int UNTREEIFY_THRESHOLD = 6; // 红黑树转链表阈值
static final int MIN_TREEIFY_CAPACITY = 64; //转红黑树最小数组长度
- 默认初始容量: 16(2的整数次方)
- 负载因子默认的是0.75f, 当hashmap集合中存储的数据达到 当前数组大小的75%则需要进行扩容
- 扩容阀值: 就是数组的个数乘以负载因子
- 链表转红黑树的边界阈值, 链表长度等于8和数组长度达到64个(但是实际可能长度到11才会转
换为红黑树,因为转红黑树的阈值是8,所以判断链表长度大于8之后但是不满足数组长度大于
等于64,所以还是扩容,等到链表长度达到11时,会进行转换), 红黑树转离链表边界阈值, 当链表长度降到 6 就转换回去,体现了时间和空间平衡的思想,最开始使用链表的时候,空间占用是比较少的(树节点(TreeNodes)所占的空间是普通节点Node的两倍),而且由于链表短,所以查询时间也没有太大的问题。可是当链表越来越长,需要用红黑树的形式来保证查询的效率。
- HashMap是非线程安全的,但是也可以创建线程安全的HashMap: Collections.synchronizedMap(new HashMap
()); - HashMap继承自AbstractMap类
- HashMap是没有contains方法的,而包括containsValue和containsKey方法
- Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;
- hash碰撞: 当存入的key通过hash算法得到的hash值一样,就产生hash碰撞了, 有兴趣的可以看一下解决hash的方法: 什么是Hash冲突?如何解决Hash冲突?_成为一枚软男的博客-CSDN博客_hash冲突
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)