为什么java内要判断两个对象是否相等呢?

2024年11月17日 00:20
有2个网友回答
网友(1):

一个标准的实体类的4大基本规则:1.封装(属性私有化,分别提供对应的get与set方法等),2、提供无参构造 ,3、重写:toString,equals,hashCode这3个方法,4、实现java.io.Serializable接口。所以java要判慧型断两个对象是否相等。

先说equals,重写它就是为了以后比较对象是否相等,比如你问题中的假如父类是person,子类是student,那么当我们new了几个student后,在程序中怎么去判断这几个 student实例是否是同一个学生呢?这时如果我们的student重写了equals(比如你按照学号来比较),那么你就可穗碧迹以用S1.equals(S2)来比较了。

至于hashCode,那是因为假如我们存取数据时  是存放在键值对中时(比如Map),这时候光靠equals效率不高,这时候用对象的哈希码(即hashCode方法得到的)来查找和比较更快,所以一般重写equals方法必须重写hashCode方法,因为java规定相等的对象必须有相等的哈猜并希码。

网友(2):

这是面向对象的特性
由于java‘是纯面向对象语言,所以对对象的管理都是用自绝笑漏动分配的HashCode进行管理,这样的话用普通的“==”自然就不能解决问题。升姿
试想一下,两个不同HashCode的String类型,拥有相同value的变量他们能是相等的么?
从对象的角度而言,肯定是不相等的。因为他们从直接寻址的角度而言,根本就是存储在不同地址的两个东西,但是他们在偏移地址上存储的分量value是相同的,从某并烂种程度上来说有证明这两个String变量其实描述的是同一个东西。
如何让开发人员区分这两个情况,java想了一个比较好的方法
它用==来判断对象的HashCode相同的情况,同时提供了一个可重写的方法equals让程序员自定义判断两个对象实际相等的条件。
正如:
String s1 = new String("1");
String s2 = new String("1");
String s3 = s1;
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
System.out.println(s1==s3);
System.out.println(s1.equals(s3));

结果是什么呢?自己想啦