黑马程序员技术交流社区

标题: java 字符串,hashCode 问题 [打印本页]

作者: hzhzhen    时间: 2015-5-18 14:44
标题: java 字符串,hashCode 问题
  1. public class Test {
  2.             public static void main(String[] args) {
  3.                         String a="abc";
  4.                         String b=new String("abc");
  5.                         System.out.println(a==b);
  6.                         System.out.println(a.hashCode()==b.hashCode());
  7.             }



  8. }
复制代码



输出:
false
true
a和b不是在内存中有两个字符串,他们的物理地址不一样吧?
第二个输出true的原因是什么?
hashCode 返回值是根据字符串内容么?
作者: pvbj0314    时间: 2015-5-18 16:02
首先来看String类中对应的构造函数。
  1.     public String(String original) {
  2.      this.value = original.value;
  3.      this.hash = original.hash;
  4.     }
复制代码
编译时在常量池中有字符串"abc",它是String类型的,语句String a="abc";将字符串"abc"的地址值赋值给a。


语句        String b=new String("abc");调用的就是上述构造函数,因此,b的成员变量,value和hash与字符串"abc"是相同的,但是因为new操作,在内存中分配了新的空间,具有新的地址值。
另外,
  1.     public int hashCode() {
  2.     int h = hash;
  3.     if (h == 0 && value.length > 0) {
  4.          char val[] = value;
  5.          for (int i = 0; i < value.length; i++) {
  6.                h = 31 * h + val[i];
  7.          }
  8.          hash = h;
  9.     }
  10.     return h;
  11.     }
复制代码



综上,可以得出程序的输出结果了。





作者: xgd6612    时间: 2015-5-18 16:04
第一个是 false    因为  String b=new String("abc");   new了一下   在内存在新开辟了位置 所以地址值不同,
第二个是ture   因为 a  b  都是代表 字符串 “abc”   他们在哈希表中的位置是相同的    所以 ture。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2