String a="a";
String b=new String("a");
String c=new String("a");
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(c.hashCode());
执行的结果是 :
97
97 
97 我的理解 b c的hashCode 不应该相等啊. 因为  b c在堆内存里各创建了两个对象.只是加入了对"a"常量字符的引用而已. 

解决方案 »

  1.   

    hashcode比较的是两个对象是否equals
    而String由于其本身的不可改变这种特性,所以比较的时候是‘==’来判断的
    所以,你这个程序之中,他们的hashcode相等,只能说明他们之间相互equals,即:b.equals(c)是true
    但是,b == c 却是false
    多看下equals和==的区别,再查查String的API吧。
      

  2.   

    再看下String的hashCode()方法更能说明问题了:public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;
        int len = count;            for (int i = 0; i < len; i++) {
                    h = 31*h + val[off++];
                }
                hash = h;
            }
            return h;
        }
      

  3.   

    new String("a");你只要知道这种不应该在程序中使用就可以了至于为什么,查看本版的日经帖OVER!!!
      

  4.   

    像字符串这样的不可变对象,使用“abc”这种形式的时候,就在内存中创建了这个字符串对象。String s="abc";还同时创建了一个String类的引用对象s,引用这个字符串。String s=new String("abc");多创建了一个匿名的引用对象(就是new String造成的),然后创建引用对象s。总之,就是第二种画蛇添足,多此一举了。
      

  5.   

    忘了说,不管有多少个“abc”字符串对象,他们引用的都是内存中同一个字符串“abc”。
    用==,equals,hashcode什么都是一样的。
      

  6.   

    我错了,==和equals是不一样的,大家忽略
      

  7.   

    String 是以大写开头, 就意味着它是一个类, 包括有自己的静态方法和构造器.
    相反的 int 型以小写字母开头, 它只是简单的数据类型.new String的话会调用 这个类的构造函器. 
      

  8.   

    如果new一个String对象的话,就会多一个垃圾对象。一般都是直接用String的匿名对象赋值。
      

  9.   

    equales 和 hashcode等价 因为你 "a".equales(a), b,c 同理 所以3个的hashcode就相等
    但如果是"=="它看得是内存地址 因为a,b,c 是不同的对象 所以"==" 为false