黑马程序员技术交流社区
标题:
关于 == 和.equals()的问题以及他们的hashcode()
[打印本页]
作者:
Sniper_qiu
时间:
2014-6-16 19:23
标题:
关于 == 和.equals()的问题以及他们的hashcode()
String s1 = "helloworld";
String s2 = "helloworld";
String s3 = new String(s1);//"helloworld"
String s4 = new String(s2);//"helloworld"
String s5 = new String("helloshanghai");
String s6 = new String("helloshanghai");
System.out.println("s1.hascode :"+s1.hashCode());
System.out.println("s2.hascode :"+s2.hashCode());
System.out.println("s3.hascode :"+s3.hashCode());
System.out.println("s4.hascode :"+s4.hashCode());
System.out.println("s5.hascode :"+s5.hashCode());
System.out.println("s6.hascode :"+s6.hashCode());
System.out.println("---------------------------------");
System.out.println("s1 == s2 :"+(s1 == s2));
System.out.println("s1.equals(s2) :"+(s1.equals(s2)));
System.out.println("s3 == s4 :"+(s3 == s4));
System.out.println("s3.equals(s4) :"+(s3.equals(s4)));
System.out.println("s1 == s3 :"+(s1 == s3));
System.out.println("s1.equals(s3) :"+(s1.equals(s3)));
这个==和.equals()有点问题,一直没明白他们的本质区别,还是被混淆了,求一份详细的解答。还有为啥String类new一个新的对象时候,他们的hashcode还是一样,不是分配的内存不是同一块吗?
作者:
月光海
时间:
2014-6-16 20:04
伙计,看看源码吧,
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
复制代码
他们的哈希值是根据他们的内容的哈希值产生的,内容都相同,哈希值也就相同,但是,哈希值相同不代表他们就是指向同一个对象,
String str = new String("abc");
String str2 = new String("abc");
System.out.println(str == str2);
复制代码
“abc”是放在常量池中的,用到的时候会从常量池中查找有没有需要的,有就使用存在的,没有才会创建新的字符串到常量池中,同时在堆中创建一个空间,这个空间就是new出来的,每new一次就会出现一块新的空间,用==比较这两个空间对象的结果是false,
作者:
回音
时间:
2014-6-16 20:06
String类重写了hashCode()方法,是将字符串视作一个31进制的数字, 每位的数值是每个字符的ASCII码值。这个31进制数字的十进制值就是hashCode()的返回值。相同字符串代表相同的数字,所以相同字符串的hashCode()返回值是相等的。
作者:
张益达
时间:
2014-6-16 20:30
== 是比较内存地址的 亲 equals只比较value
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2