为什么java内要判断两个对象是否相等呢?
2个回答
展开全部
一个标准的实体类的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规定相等的对象必须有相等的哈希码。
展开全部
这是面向对象的特性
由于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));
结果是什么呢?自己想啦
由于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));
结果是什么呢?自己想啦
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询