覆盖 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究竟为什么高效?
从源码来窥其一斑!我们都知道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());//作用是再次哈希,减少冲突 ,源码如下其中涉及到的位运算有
推荐阅读
- 科技时代,包含中国的红色警戒高科技升级版。
- 手机百度哪个版本好用,哪个版本的手机百度可以截长屏
- 5大最强手机揭晓,目前手机最好的是哪个版本
- 雷军又下载炒股软件,小米8.2的版本下载地址
- 韩版s8怎么刷机,高通版本的三星S8/S8 也能刷机了
- 手机被监听后刷机会死机吗,说明你的手机被监听了
- NFC便捷功能大全 手机的nfc功能有什么用
- 盐酸与硝酸银反应的化学方程式
- 12和8的最大公因数是多少
- 氯酸钾的电离方程式