在做项目的时候发现了HashMap的无序性带来的麻烦,由于,从接口获取的数据,是有顺序的,但是添加到HashMap中再输出出来就变的没有顺序了,然后这个结果,如果再输入到其他需要这个接口的数据中去,这样,就因为顺序的原因会导致,接口接收的参数报错了.这个时候就需要考虑用LinkedHashMap 或者 TreeMap代替HashMap了..
Map的底层实现就是哈希表,哈希表的结构主要是Hashcode + 数组
1.存储kv时,首先将k通过hashcode后对数组长度取余,决定需要放入的数组的index
2.当数组对应的index已有元素时,此时产生一个【哈希冲突】。一般来说哈希冲突的解决方式为链表法,即在冲突的位置生成一个链表来存储元素
这可以看到这里,通过将key,通过hashcode后对数组长度取余,这里就会导致map存的key,是无序的了
然后再简单说一下:
Redis中的Dict结构(用于实现RedisDB、Hashmap,Set等)其实就是非常典型的哈希表。Golang中的Map结构与传统的哈希表稍有不同,它数组的基本单元并不是kv对,而是bucket。
每个bucket中可以放置8个kv对,这样可以减少对象的数量,有利于提升GC的性能;当bucket中放置不下时,会继续在溢出桶(overflow)中继续存储,串成一个链表的结构,如图所示: