接上文:
Map就是套中套 外面List 数组 然后再List 然后里面的list 存储链表value值 (不是说键值不可以重复为什么要又数组又链表呢 其实是因为 这里的数组下标是hashcode值 键值不相等不一定重写的hashcode不相等 然后 这样通过hashcode找到这个位置之后还需要去寻找相等的键值 那你又会问为什么要这么麻烦呢 简单的说其实就是提升效率的问题 如果你不这样 那和Linklist又有什么区别 一样查找很慢很慢 要一个个往后移动查对应的键值是否相等 如果采取数组加链表的话 那么 查找的范围就要小特别多了 效率就上来了)
Map底层实现:数组加链表
equals和hashcode:
java中规定 相同对象 也就是用equals判断相等的时候 那么 他们的hashcode一定要相等 反之则不然
比如 Map 底层数组加链表实现 确定在那个list里面是通过hashcode 判断的 但是内容是不是相等 是要经过遍历 。
native 本地方法 源码里面没实现哈
如果equals为true hashcode应该相等 反之不一定
List和Map小细节:
获得索引值 可以看是都大于一半长度进行查找· 效率高些
hashcode 可以是负数 转为正数(因为负数可能出问题 ,数组下标为负数 不太好吧对吧)
Set
hashSet底层是 hashMap实现的。
PERSENT是常量。
练习:
思路一:
然后一个对象对应一条记录 用ArrayList 存储对象。
思路2:
用Map存一条记录,用ArrayList 存储hashMap 对象。