hashcode的作用,方法的作用( 二 )


覆盖 equals 方法的准则自反性:对于任何非空引用值 A,A.equals(A) 返回 true 。对称性:对于任何非空引用值 A 和 B,A.equals(B) 和 B.equals(A) 的结果相同 。传递性:对于任何非空引用值 A、B 和 C,如果 A.equals(B) 返回 true,A.equals(C) 返回 true,那么 B.equals(C) 也是 true 。
一致性:对于任何非空引用值 A 和 B,每一次调用 x.equals(y) 的结果是相同的 。非空性:对于任何非空引用值 A,A.equals(null) 应返回 false 。equals() 与 hashCode()hashCode() 方法是获取 hash 码(哈希码、散列码),我们可以把它看做返回一个 int 整数;hash 码的作用是确定对象在散列结构中的位置 。
hashCode() 方法存在于 Object 类中,代表 Java 中的任何类都会有 hashCode() 方法,那么任何场景下 hashCode() 都会产生作用么?其实并不是!如果对象会被放入散列结构中使用,那么 hashCode() 就会起作用 。比如,当我们要向 HashMap 中放入一组 key-value 的时候,那么 HashMap 会先根据 key 对象的 hashCode 值判断存入的位置,如果 key 存入的位置上已经有了一个元素,再根据 equals() 方法判断两个元素是否相等;如果确认相等,那么会覆盖原来的 key-value。
这时候,equals() 与 hashCode() 就是有关系的:两个对象 equals() 返回 true 的时候,那它们的 hashCode() 值需要相等;如果两个对象的 hashCode() 值相等,那它们 equals() 不一定是 true;(哈希冲突)所以在这种情况下,如果要判断两个对象是否相等,除了要覆盖 equals() ,也要覆盖 hashCode(),否则就会发生意料之外的问题 。
jdk8中的ConcurrentHashMap究竟为什么高效?

hashcode的作用,方法的作用


从源码来窥其一斑!我们都知道hashMap不是线程安全的,因为在扩容方法中很容易出现死循环,hashTable使用锁的方式比较简单暴力,几乎在所有操作方法上都加了synchronized锁,导致总体性能很差,concurrentHashmap凭借线程安全且性能优异一直都是高并发中的首选key-value型数据结构; concurrentHashmap的高性能有以下原因:一,分段锁:jdk8中对concurrentHashmap进行了改进,抛弃了jdk7中新建segment作为分段锁的过程,jdk8中虽沿用了这种分段锁的思想,却直接使用数组中的数据作为分段锁保证concurrentHashmap在上锁的时候只针对数组下标下的数据进行上锁(比如如果数组长度为256,那么每次put平均只有1/256的数据被锁),而大多数其他的数据还是能进行正常的增删改操作,无需阻塞等待,这无疑极大的降低了锁的粒度,提升了性能 。
【hashcode的作用,方法的作用】二,红黑树 :jdk8中引入了红黑树结构,在单个数组下标内的数据达到8以后,会自动转换为红黑树进行存储,使用大O表示法表示效率的话,红黑树的查找效率为O(log(n)),而链表的效率为O(n),当数据量越来越大的时候,红黑树的效率明显好于链表,所以concurrentHashmap性能得到很大提升;现在我们主要从put方法中的主要方法来分析性能的提升: spread(key.hashCode());//作用是再次哈希,减少冲突 ,源码如下其中涉及到的位运算有

推荐阅读