1.HashMap是一种由数组和链表构成的数据结构,用于存储“key-value对”元素,同时继承了数组的查找优点和链表的修改优点。
2.HashMap是非同步的,所以速度很快。并且键和值可以为null。
3.HashMap使用put(key,value)方法存储对象到HashMap中,使用get(key)方法从HashMap中获取对象。
4.HashMap数据结构具体为:首先是一个定长的数组,数组存储的对象是“key-value对”元素,数组中的每个节点又分别是链表的头节点,比如有一个大小为10的数组,那么链表也有10个,这些链表的头节点构成了数组。
5.HashMap存储原理:(1)首先调用hashCode()方法对key计算得到hash值,该hash值代表在数组中的存储位置(数组的下标)。(2)如果当前数组位置还没有存储对象,就将该"key-value对"存储进去,如果当前数组位置已经有存储的"key-value对"元素时,就发生了冲突,冲突的元素之间构成链表,每次新的元素总是放在链表的头节点,也就是放在数组当中,然后该链表其他元素顺延(相当于链表头插法,后来的元素总在最前面)。比如对象A计算的hash值为1,它应该存储在数组下标为1的位置,然后对象B计算的hash值也为1,但是此时数组下标1已经存储了A对象,于是它们之间通过链表的形式连接起来,此时数组下标为1的位置存储B对象,而A对象通过链表的形式连接在B对象的后面。同理如果有C对象和A和B发生冲突,,此时数组下标为1的位置存储C对象,B和A对象则在链表中顺延。
6.HashMap查找原理:(1)首先通过hashCode()方法计算"key-value对"的key得到在数组中的存储位置,然后通过equals()方法得到"key-value对"在链表中的存储位置。
7.所谓HashMap冲突就是对不同的对象调用hashCode()方法计算key得到的hash值(也就是数组下标)相同,这些冲突的对象通过链表连接起来。
8.HashMap总结概括:HashMap由数组和链表组成,链表的头节点构成了数组。HashMap存储的对象是“key-value对”,而不仅仅是value。通过调用hashCode()方法对“key-value对”的key计算得到hash值(也就是数组的下标),该hash值决定了对象在数组中的存储位置,如果不同的对象计算得到的hash值相同,就产生了冲突,,它们之间遵循头插法原则,即最新的冲突对象放在数组中,其他冲突对象在链表中往后顺延。
9.当HashMap中存储的对象数目超过了负载因子(0.75),也就是说当HashMap容量已经超过了75%时,需要进行扩容,此时将会创建原来HashMap大小两倍的新的HashMap,并将原来的对象放进新的HashMap中。
10.当链中长度超过了8时,将链表转为红黑树,当链表长度小于6时,将红黑树转为链表,这是为了提高查找效率。
11.将存储对象声明为不可变的final对象,同时采用合适的equals()方法和hashCode()方法可以减少冲突的产生。