Hashtable
- 底层采用数组+链表
- 无论是 key 还是 value 不能为null
- 实现线程是安全的 效率低
- 默认构造函数 已经初始化了
- 初始size 值为 11 扩容 newSize = oldSize * 2 +1
int newCapacity = (oldCapacity << 1) + 1;
HashMap
- 底层采用哈希表(动态数组 +链表(或者红黑树))
- 数组的动态数组保证
- 链表到 红黑树的相互保证
- 存储的是一个K,V对象 每一个都是 map.Entry 对象
- key可以为空
- 初始值为 16
- hashmap中的键值对大于阀值时或者初始化时,就调用resize方法进行扩容;
每次扩展的时候,都是扩展2倍;
TreeMap
TreeMap 底层红黑树
有序的map集合,comparator 基于key排序(默认comparator )
直接看源码吧 害
Entry<K,V> t = root;
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
Comparator<? super K> cpr = comparator;
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
}
compare(key, key)
一次添加数据直接添加到节点是;
递归调用 查找红黑树,
你有比较器的,就会用传入的 ,没有的话 就会用默认的比较器,
Treeset
Treeset 底层依赖TreeMap
public TreeSet() {
this(new TreeMap<E,Object>());
}
HashSet 底层依赖 HashMap
public HashSet() {
map = new HashMap<>();
}
两大集合体系完成他们相辅相成的一套体系
今天在一个实际场景里用hashmap ,遍历出来的顺序一直是乱的所以尝试几种方法之后还是选用了LinkedHashMap
我们都是到HashMap是一种非常常见、非常有用的集合,但在多线程情况下使用不当会有线程安全问题,只要不涉及线程安全问题hsahMap 完全可以满足我们使用,但是他取出来的顺序是无序的这时候就用到了 LinkedHashMap
特点
LinkedHashMap是否允许空 Key和Value都允许空
LinkedHashMap是否允许重复数据 Key重复会覆盖、Value允许重复
LinkedHashMap是否有序 有序
LinkedHashMap是否线程安全 非线程安全
直接看这个来链接吧
https://www.cnblogs.com/xiaoxi/p/6170590.html.