黑马程序员技术交流社区
标题:
判断两个对象相等的一点迷惑?
[打印本页]
作者:
freehiker
时间:
2013-11-9 20:55
标题:
判断两个对象相等的一点迷惑?
本帖最后由 freehiker 于 2013-11-9 21:17 编辑
public class StringTest2 {
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1.hashCode()); //96354
System.out.println(str2.hashCode()); //96354
System.out.println(str1==str2);//false,不明白的地方
System.out.println(str1.equals(str2));//true
}
}
复制代码
str1在内存中有一个对象,str2在内存中有两个对象,这个区别已经知道了。然后经过网上搜索的最后确认,觉得判断两个对象相等的因素就是hashCode和equals,如果真的是这样,那么str1==str2为什么会是false呢?str1和str2的hashCode的值是一样的啊。求解!!!
或许应该把hashCode这个因素换成是内存地址值,这样的话就说的通了。还是求确认!
作者:
明月几时有
时间:
2013-11-9 21:27
String str1 = "abc";
String str2 = new String("abc");
一个字符串是一个对象,存在于方法去的常量池中,==
而s则指向了堆内存的new String("abc")对象,和a,b当然不是一个引用
比较的实际是他们的地址, 所以 str1==str2 结果是false
而string类的equals方法是重写object类的,比较的是字符串内容
所以 str1.equals(str2)结果是true
作者:
张秀威
时间:
2013-11-9 21:36
public class StringTest2 {
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1.hashCode()); //96354
System.out.println(str2.hashCode()); //96354
System.out.println(str1==str2);//false,这里比较的是对象是否相等
System.out.println(str1.equals(str2));//true 这个equals方法是Object 类中的,用于判断两个字符串的值是否相等
}
}
复制代码
首先我来分析一下,String str1="abc"这一步时它在内存中开辟了一块空间,然后接着String str2=new String("abc")这一步时,因为是new 出来的东西,所以又在内存中开辟了一块空间,也就是说str1和str2是两个不同的对象,因为str1==str2比较的是两个对象是否相等,而不是他们的字符串的值是否相等,所以运行false,而至于str1.equals(str2)为true,是因为String类复写了Object类中的equals方法,该方法是用于比较判断两个字符串是否相等,也就是判断str1和str2值,所以运行为true,
作者:
中关村阿旺
时间:
2013-11-9 22:25
字符串的hashCode()方法返回的是java虚拟机中地址的哈希值,而不是物理内存的真实地址。
所以,两个内容相同的字符串所返回的哈希值是相同的,
但是它们在物理内存中所指向的绝对不是同一个地址!
所以,==的判断返回了false。
作者:
魏-玉-彪
时间:
2013-11-9 22:53
public class StringTest2 {
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("abc"); //问题在这里,new的意思是再创建一个对象,
//String类型为引用数据类型,所以引用了内存中的一个新地址.
System.out.println(str1.hashCode()); //96354
System.out.println(str2.hashCode()); //96354
System.out.println(str1==str2);//false,不明白的地方
System.out.println(str1.equals(str2));//true
}
}
复制代码
== 运算符,对于
基本数据类型,比较的是值
,对于
引用数据类型,比较的是地址值
String 属于引用数据类型,两个对象的对址也不同,所以 /false
作者:
寻丶丶觅
时间:
2013-11-9 23:09
Object类中的hashCode方法返回的是内存地址值,而String类重写了hashCode,他返回的是String类定义的hashCode。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2