A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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还是一样,不是分配的内存不是同一块吗?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

3 个回复

倒序浏览
伙计,看看源码吧,
  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,

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
String类重写了hashCode()方法,是将字符串视作一个31进制的数字, 每位的数值是每个字符的ASCII码值。这个31进制数字的十进制值就是hashCode()的返回值。相同字符串代表相同的数字,所以相同字符串的hashCode()返回值是相等的。
回复 使用道具 举报
==  是比较内存地址的 亲  equals只比较value
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马