Open cccreator opened 4 years ago
HashMap的get方法取值相对于ArrayList取值更快,因为ArrayList底层由数组实现list.get(index).当ArrayList去按索引查找时,会先去数组里面对比索引是否越界,然后再去寻找结果。ArrayList get(index)时候会先调用rangeCheck方法对索引进行判断。(以上是建立在HashMap没有发生哈希冲突的情况下)。
如果不发生哈希冲突,查询效率跟存放的数量几乎没有多大关系,因为HashMap会根据hashCode()来判断数据的位置,时间复杂度是O(1),当存入HashMap时发生的Hash冲突越多,性能就会越差,时间复杂度看链表长度。具体理解:
HashMap的数据结构:HashMap的底层主要是基于数组和链表来实现的。HashMap中主要是通过key的hashcode来计算hash的,只要hashcode一样,计算出来的hash也是一样的。如果存储的对象多了,就有可能不同的对象计算出相同的hash,就会出现hash冲突。HashMap底层是通过链表来解决hash冲突的。
看HashMap存入数据原理:
首先调用key对象的hashcode()方法,获取hashcode,再根据hashcode计算出hash值。
生成Entry对象,一个Entry对象包含4部分:key对象、value对象、hash值、指向下一个Entry对象的引用。算出了hash值,下一个Entry对象的引用为null。
将Entry对象放到table数组中。如果本Entry对象对应的数组索引位置还没有放Entry对象,则直接将Entry对象存储进数组;如果对应索引位置已经有Entry对象,则将已有Entry对象的next指向本Entry对象,形成链表。
HashMap的get方法相对于ArrayList的get方法,谁的取值会更快?
HashMap的get方法取值相对于ArrayList取值更快,因为ArrayList底层由数组实现list.get(index).当ArrayList去按索引查找时,会先去数组里面对比索引是否越界,然后再去寻找结果。ArrayList get(index)时候会先调用rangeCheck方法对索引进行判断。(以上是建立在HashMap没有发生哈希冲突的情况下)。
关于HashMap中存放多少个key才会开始影响查询效率的问题?
如果不发生哈希冲突,查询效率跟存放的数量几乎没有多大关系,因为HashMap会根据hashCode()来判断数据的位置,时间复杂度是O(1),当存入HashMap时发生的Hash冲突越多,性能就会越差,时间复杂度看链表长度。具体理解:
HashMap的数据结构:HashMap的底层主要是基于数组和链表来实现的。HashMap中主要是通过key的hashcode来计算hash的,只要hashcode一样,计算出来的hash也是一样的。如果存储的对象多了,就有可能不同的对象计算出相同的hash,就会出现hash冲突。HashMap底层是通过链表来解决hash冲突的。
看HashMap存入数据原理:
首先调用key对象的hashcode()方法,获取hashcode,再根据hashcode计算出hash值。
生成Entry对象,一个Entry对象包含4部分:key对象、value对象、hash值、指向下一个Entry对象的引用。算出了hash值,下一个Entry对象的引用为null。
将Entry对象放到table数组中。如果本Entry对象对应的数组索引位置还没有放Entry对象,则直接将Entry对象存储进数组;如果对应索引位置已经有Entry对象,则将已有Entry对象的next指向本Entry对象,形成链表。