HashMap和Hashtable的理解

HashMap 主要是使用Key-Value进行存取数据,HashMap不是同步的。所以HashMap是不安全的。之所以不安全,是因为底层实现时,HashMap内存会自动进行增大,而如何增大有个专业词叫作“加载因子” (默认加载因子为0.75)注:( 加载因子是表示Hash表中元素的填满的程度.若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了)。如果当前需要存入的数据所需要的内存大于初始内存*加载因子,则HashMap会进行内存扩充,大约变为原来内存的2倍。而根据加载因子的设定进行内存扩充的话,如果多个线程同时进行存取数据时候,当一个线程进行存入时候,内存恰好不够,这时候需要进行内存扩充,而当内存进行扩充时候,没有进行同步,当某个恰巧的时刻,另一个线程也在对HashMap进行添加数据,认为此时内存不足,需要再进行一次扩充内存,这时候就会出现两次内存扩充的情况,这就出现了bug。 

而对于HashMap 来说,可以简单的理解为 “数组”+“链表”(大白话),数组是解决根据hashcode值去先去key-value查询,如果当前该“数组”中已经存放有数据了再根据这个数组下的“链表”(有点类似C的链表结构,而“数组第一个值为链表头”)进行存放。而数组下的这个"链表"是为了解决hashcode冲突的。如果“数组”下的“链表长度越短”说明这个HashMap发生哈希冲突越少,效率越高。但是这种情况的前提是内存没有被大量浪费的情况下。

                                                                                                        (本人为小白,只写一下理解,方便大伙更容易去理解技术知识)

猜你喜欢

转载自blog.csdn.net/hym740639005/article/details/81138891