HashMap与HashTable的区别
HashMap的线程不安全,效率较高,可以允许空值,存放在第0个位置。
HashTable的线程安全,效率较低,不运行空值,否则报错。
HashMap的原理
HashMap底层使用“数组+链表”。初始容量是16,加载因子是0.75,使用的"Entry"对象封装的键值对。
在jdk8中,HashMap底层使用“数组+链表+红黑树”。初始容量是16,加载因子是0.75,使用的"Node"对象封装的键值对。
hashCode与equals的区别
hashCode比的是哈希编码值,可能它们相等,但是内容不一样。
equals比的是对象内容地址,它们相等的话,hashCode值也要相等。
HashMap的put方法的实现
HashMap在jdk1.7时采用链表加数组的方式实现,使用HashEntry封装键值对。根据key来算出index下标,要是产生HashCode碰撞的话,使用链表来进行存放(jdk1.7中,采用的是头插法,在多线程扩容中可能会产生死锁现象,jdk8中,采用了尾插法)。
HashMap的扩容
HashMap默认数组容量是16,加载因子是0.75。HashMap容量在大于等于12时会开始扩容,在原来的数组容量基础上乘以2。
HashMap的加载因子为什么是0.75
因为加载因子过小的话,会很消耗内存空间,但是冲突的概率会比较小。
加载因子过大的话,冲突的概率会比较大,但是空间利用比较好。于是为了有较好的空间利用性和冲突不是很大的情况下,进行实验,发现0.75是个平衡值,所以使用了它。
--------------------------------------From Clam Person Understanding ------------------------------------------------
--------------------------------------Only Reference For You -------------------------------------------------------------
--------------------------------------Also Hope To Get Your Advice ------------------------------------------------------