黑马程序员技术交流社区

标题: 关于 == 和.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
伙计,看看源码吧,
  1. public String(String original) {
  2.         this.value = original.value;
  3.         this.hash = original.hash;
  4.     }
复制代码

他们的哈希值是根据他们的内容的哈希值产生的,内容都相同,哈希值也就相同,但是,哈希值相同不代表他们就是指向同一个对象,
  1.                 String str = new String("abc");
  2.                 String str2 = new String("abc");
  3.                 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