大伙,这是JAVA中如何理解:两个对象值相同(x.equals(y) == true),有相同的hash code
5个回答
展开全部
这个是scjp考试必须要了解的部分,只要是scjp考试的书籍里都很详细的提到。
java中判断对象是否相等,首先判断对两的hashcode码是否相等,如果相等则在通过equals方法判断。
例如,你有两个桶,一个桶放西瓜,一个桶放冬瓜。两个筒内分别放着大小不同的西瓜和冬瓜。
现在你有一个西瓜对象和一个冬瓜对象,显然它们不是一个桶内呢,所以hashcode码不相同,这是就不会执行equals方法。返回的结果为西瓜不等于冬瓜。假如你现在有两个个西瓜对象,显然他门是同一个桶内,具有相同的hashcode码,这时就需要去执行equals方法来判断这两个西瓜的一些特征是否相同(大小,重量等),要使equals方法具有意义,就必须重写它,但不时重载。String对象的equals方法是被重写过的,所以你可以直接使用。假设这边我们将equals方法重写为判断两个西瓜对象的重量是否相同,相同则说明两个西瓜是相等的。如果你的两个西瓜对象都具有相同的重量则返回“true”.
现在应该清楚为什么"两个对象值相同(x.equals(y) == true),有相同的hashcode"了吧
hashcode码相同则说明是在一个桶内,即都是西瓜或都是冬瓜,只有hashcode码相同了才会去执行equals方法。
题外话:如果一个hashmap你用自己定义的对象用作key,则该对象必须重写hashcode方法和equals方法,否则当你做为key的对象被回收后,就再也找不到对象的value了,尽管你重新new了一个属性完全一样的对象。
楼上说的“直接用==”可以用来判断基本类型比如int,double等,但不适合用来判断对象。
"=="是判断真实相同(引用变量是否指向堆上的同一个对象),equals用来判断意义相同(字面值相同)。
java中判断对象是否相等,首先判断对两的hashcode码是否相等,如果相等则在通过equals方法判断。
例如,你有两个桶,一个桶放西瓜,一个桶放冬瓜。两个筒内分别放着大小不同的西瓜和冬瓜。
现在你有一个西瓜对象和一个冬瓜对象,显然它们不是一个桶内呢,所以hashcode码不相同,这是就不会执行equals方法。返回的结果为西瓜不等于冬瓜。假如你现在有两个个西瓜对象,显然他门是同一个桶内,具有相同的hashcode码,这时就需要去执行equals方法来判断这两个西瓜的一些特征是否相同(大小,重量等),要使equals方法具有意义,就必须重写它,但不时重载。String对象的equals方法是被重写过的,所以你可以直接使用。假设这边我们将equals方法重写为判断两个西瓜对象的重量是否相同,相同则说明两个西瓜是相等的。如果你的两个西瓜对象都具有相同的重量则返回“true”.
现在应该清楚为什么"两个对象值相同(x.equals(y) == true),有相同的hashcode"了吧
hashcode码相同则说明是在一个桶内,即都是西瓜或都是冬瓜,只有hashcode码相同了才会去执行equals方法。
题外话:如果一个hashmap你用自己定义的对象用作key,则该对象必须重写hashcode方法和equals方法,否则当你做为key的对象被回收后,就再也找不到对象的value了,尽管你重新new了一个属性完全一样的对象。
楼上说的“直接用==”可以用来判断基本类型比如int,double等,但不适合用来判断对象。
"=="是判断真实相同(引用变量是否指向堆上的同一个对象),equals用来判断意义相同(字面值相同)。
展开全部
equals()是Object类的一个方法,它的底层实现是用hashcode实现的,所以你在用这个方法的时候比较的是他们地址的hashcode编码,要是比较值的话应该覆写equals()方法和toString()方法然后在做。你不想这么麻烦的话比较值,直接用==,就会解决问题。
您的进步是我最大的动力,如果你觉得我回答的合理的话,请给我多加分。谢谢,如果不明白的话,大家相互学习啊!
您的进步是我最大的动力,如果你觉得我回答的合理的话,请给我多加分。谢谢,如果不明白的话,大家相互学习啊!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一个等是里面的属性的值等,第二个等是同一个对象,
简单来说,equals比的是张三,李四是不是双胞胎
而hashcode比的是张三,李四是不是一个人
简单来说,equals比的是张三,李四是不是双胞胎
而hashcode比的是张三,李四是不是一个人
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2009-06-19
展开全部
话说,两个对象拥有同样的hashcode也是可以的,但默认情况下继承于Object的hashcode是可以作为区别对象的依据的。
而至于equals嘛,嗯,这个方法在Object的时候也是可以作为区别对象的依据,但是如果被复写了,那么不行了,例如String类一样,其equals就是被复写来比较字符内容了。
而至于equals嘛,嗯,这个方法在Object的时候也是可以作为区别对象的依据,但是如果被复写了,那么不行了,例如String类一样,其equals就是被复写来比较字符内容了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-04-15
展开全部
你说的这个问题,这上面就有很详细的解决方案哦,他们的java教程很全面,你可以去了解下
参考资料:http://www.baidu.com/s?wd=%B1%B1%B7%E7%CD%F8&rsv_bp=0&rsv_spt=3&inputT=100
参考资料:http://www.baidu.com/s?wd=%B1%B1%B7%E7%CD%F8&rsv_bp=0&rsv_spt=3&inputT=100
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询