我是靠谱客的博主 活力猫咪,最近开发中收集的这篇文章主要介绍【java】==操作符与equals的区别==equals重写equals需要重写hashcode 注意:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

==

如果比较的是基本数据类型,则直接比较其存储的 “值”是否相等;

如果比较的是引用类型的变量,则比较的是所指向的对象的地址

equals

如果没对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址,这个和==号比较对象或者引用类型是一样的效果

例如String、Date等类对equals方法进行了重写,比较的是所指向的对象的内容。

重写equals需要重写hashcode 

 那为什么非得重写hashcode呢?因为对象的比较有硬性规定:

  1. 应用执行期间,同一个对象内容不发生改变,经过多次调用,hashCode方法都必须始终返回同一个值。如果把对象重新copy到另外一个应用程序里,hashcode可以和上一个的不一样。
  2. 如果两个对象根据equals(Object)方法比较是相等的,那么所产生的的hashcode必须一样。
  3. 如果两个对象根据equals(Object)方法比较是不相等的,那么产生的hashcode可能一样,也可能不一样。
Integer t1 = new Integer(1);
Integer t2 = new Integer(1);
		
Set<Integer> set = new HashSet<Integer>();
set.add(t1);
set.add(t2);
		
// 可以发现size=1,如果不等size=2
System.out.println(set.size());

 我们用hashset来验证,hashset是去重的。放t2的时候取hashcode值,然后会定位到student所在的桶,然后再比较内容,发现内容也一样,于是t2会替换t1。

 

注意:

  •  浮点数之间的等值判断。是基本数据类型不能用==来比较,是包装数据类型不能用equals 来判断。

          说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进 制无法精确表示大部分的十进制小数

(1) 指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的。 
float a = 1.0f - 0.9f; 
float b = 0.9f - 0.8f; 
float diff = 1e-6f; 
 
if (Math.abs(a - b) < diff) {     
System.out.println("true"); 
} 


(2) 使用BigDecimal 来定义值,再进行浮点数的运算操作。 
BigDecimal a = new BigDecimal("1.0"); 
BigDecimal b = new BigDecimal("0.9"); 
BigDecimal c = new BigDecimal("0.8"); 
 
BigDecimal x = a.subtract(b); BigDecimal y = b.subtract(c); 
 
if (x.equals(y)) {     System.out.println("true"); } 
 

 

最后

以上就是活力猫咪为你收集整理的【java】==操作符与equals的区别==equals重写equals需要重写hashcode 注意:的全部内容,希望文章能够帮你解决【java】==操作符与equals的区别==equals重写equals需要重写hashcode 注意:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部