代码改变世界

对hashmap与hashcode()、equals()的理解

2016-12-08 17:05  VinpleZhang  阅读(1152)  评论(0编辑  收藏  举报

1.equals方法没被重写的时候   比较的只是对象的地址  重写之后 比较的才是对象里的内容

2.重写equals的时候 务必需要重写hashcode 不然在用到容器的时候 会出现问题 因为容器会去判断新加入的对象的hashcode 在集合中是否存在 再去判断对象的内容

3.hashmap的理解

hashmap其实就是数组+链表   这里所谓的链表 无非就是 在hashmap里定义了一个静态Node类 这个类有Node next这个引用 可以指向当前下一个在当前索引下标下的Node节点

进行put的时候 会根据传入的key进行hash(key.hashcode())  然后算出索引 去数组里找

1.如果没找到下标 那么直接addentry()

2.存在下标的话(其实就是链表的第一个元素),判断是否存在相同的key 相同那么就覆盖原来的value,不同就是直接放在链表的第一个,为什么放在第一个,那是因为定义的Node节点,属就是Node next

3.同时有两个线程put的时候 一旦超出数组长度  会进行resize双倍扩容 此时存在对table这个公共变量资源 进行竞争  所以存在多线程安全问题  

所以在判断高并发 高访问的时候 可以考虑用concurrenthashmap