当前位置: 代码迷 >> Java相关 >> 关于声明String和StringBuilder对象hashCode的问题
  详细解决方案

关于声明String和StringBuilder对象hashCode的问题

热度:200   发布时间:2013-01-14 16:00:52.0
关于声明String和StringBuilder对象hashCode的问题
StringBuilder a = new StringBuilder("a");
    StringBuilder b = new StringBuilder("a");
    System.out.println(a.hashCode());
    System.out.println(b.hashCode());
    System.out.println(a==b);
    System.out.println(a.equals(b));
    System.out.println("-----------------");
    String aa = new String("aa");
    String bb = new String("aa");
    System.out.println(aa.hashCode());
    System.out.println(bb.hashCode());
    System.out.println(aa==bb);
    System.out.println(aa.equals(bb));
结果:
    78236
    6301159
    false
    false
    -----------------
    3104
    3104
    false
    true
结果发现:
StringBuilder声明的对象hashCode值不同。String 声明的对象HashCode值相同。故 a.equals(b)为flase,aa.equals(bb)true;
a==b;aa==bb;两者为flase是因为==比较的是对象的值,每new一次。创建一个新值所以为flase;
但为什么StringBuilder声明的对象hashCode值不同呢?有人能帮我解释下吗?
----------------解决方案--------------------------------------------------------
明白了:
查看StringBuilder 和String 的equals内部方法就知道了。
StringBuilder 里继承了Object里的equals方法。比较的是引用值  
如下:
   public boolean equals(Object obj) {
    return (this == obj);
    }
String覆盖了Object的equals方法如下:
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }

----------------解决方案--------------------------------------------------------
理解一下stringbuilder是做什么用的
如果只是new一个字符串还是用new String吧
stringbuilder是用来字符串拼接的,效率上高于string的+号运算
既然是拼接,那么stringbuilder的hashcode自然就不应该一致

----------------解决方案--------------------------------------------------------
  相关解决方案