1、 HashMap底层原理
HashMap是无序的,底层是hash表(数组+单项链表+红黑树)
LinkedHashMap是由有序的;数组+双向链表
Hash表在jdk8前是数组+链表,数组+链表+红黑树
HashMap有加载因子0.75,默认长度为16,自动桶数(数组大小)一倍扩容(超过12扩容,小于8恢复)
链表长度大于8从链表到红黑树,小于8从红黑树到链表
2、 HashTable底层原理
底层:hash表结构(数组+链表),使用无参构造创建对象时,默认长度11的数组,加载因子0.75,Hashtable<Object, Object> hashtable = new Hashtable<>();
3、 HashMap与HashTable区别
1) HashMap是非线程安全的,在多线程环境下,HashMap会产生线程安全问题;而HashTable中的大部分方法都使用synchronized关键字来确保线程同步,因此HashTable是线程安全的,不过性能比HashMap低些。
2) HashMap继承了AbstractMap,HashTable继承了Dictionary抽象类,两者都实现了Map接口
3) HashMap的初始容量为16,HashTable的初始容量为11
4) HashMap扩容机制为扩容两倍,而HashTable扩容机制为两倍-1
5) HashTable不会转换红黑树