java se 问题:两个对象相等equals和==的区别

来源:百度知道 编辑:UC知道 时间:2024/05/02 16:29:52
比如:String s1 = "abc";
String s2 = new String("abc");

equals返回true,但是不“==”,但是他们的hashcode是相同的,为什么不“==”

String s1 = "abc";
s1指向了“abc”
String s2 = new String("abc");
生成了对象new String("abc");s2指向这个对象,这个对象引用了“abc”;
equals意义是判断内容是否一直因为s1内容为“abc”,s2内容也为“abc”因此返回true。
==是判断引用是否一致,s1、s2指向不同所以返回false。
83299387gvirus说法不对“abc”只生成一次,具体是生成在堆还是栈不同虚拟机实现原理不同。

String的hashcode和equals有点特别。
你上面的s1和s2确实是两个不同的对象。

而String的hashcode会取堆中的hashcode,所以这两个hashcode是一样的。

所有对象的变量保存的都是对象的引用,也就是对象的所在地址的值,而不是对象本身的值。
==比较的是两个变量本身的值,而不关心这个变量所指向的对象。

在你的例子中,s1是第一个字符串abc的地址值,而s2则是第二个字符串的地址值。用==的时候它们是不相等的,因为这两个字符串被保存在两个不同的地址中;而用equals的时候,这个方法会将两个变量所指向的字符串进行比较,因此如果字符串相同,它就一定相等(如果地址相同,两个字符串当然肯定也相同)。

简单说
== 表示的s1、s2指向同一个东西
equals 表示指向的东西其内容相等,这样可能指向的是两个东西。

equals是比较值相同,"=="是比较地址

equal比较的是字符串里面的内容~~

“==”比较的是引用~