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.   

    String的equal 和 hashCode 都重写了。
    所以一样。b和c,equal的话,一样; == 才不一样
      

  2.   

    一、Object类的api文档是这么约定的:如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。 
    二、String类重写了equal hashCode方法。
    三、equal结果为true,所以hashCode一定相同,
      

  3.   

    1、当向集合Set中增加对象时,首先集合计算要增加对象的hashCode码,根据该值来得到一个位置用来存放当前对象,挡在该位置没有一个对象存在的话,那么集合Set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象存在的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象,在进行一次散列,将该对象放到散列后计算出的新地址里,如果equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了。
        2、重写equals方法的时候必须重写hashCode方法。如果一个类的两个对象,使用equals方法比较时,结果为true,那么该两个对象具有相同的hashCode。原因是equals方法为true,表明是同一个对象,它们的hashCode当然相同。
        3、Ojbect类的hashCode方法返回的是Object对象的内存地址。可以通过Integer.toHexString(new Object().hashCode);来得到
      

  4.   

    这个 必须的不一样啊·····
    首先··String  直接赋值是给变量一个存在栈中德字符
    new String 是 新的一个对象对这个变量的引用只是调用了内存中的地址····
    两个是不通的概念啊··后者对象    前者是各变量
      

  5.   

    看String类型的hashCode()源码就会发现,这个与Object的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;
        }
      

  6.   

    String s = new String("a");实际上市创建了两个对象,一个是字符串对象"a",是放在内存的字符存储区的
    另一个是new String("a")对象
      

  7.   

    查看String类hashCode()方法源码,发现其计算方法是根据字符串字面值逐个求和得到,故相等的字符串字面值的hashCode值比然相等。
      

  8.   

    hashCode相同,他们是两个内容相同的不同对象,a,b,c分别是一个内容为“a”的String对象的指针(句柄),他们指向的地址是不同的,你可以试着写下这么几句:
    System.out.println(a == b);
    System.out.println(a.equals(b));第一个为false,它们两个是两个不同对象的指针,第二个为true,两个对象内容相同
    以下是String类的equals方法源代码,我对其写了些注释,希望对你有所帮助:
      public boolean equals(Object paramObject)
      {
        if (this == paramObject)               //如果两个是同一对象的引用,那么返回true
          return true;
        if (paramObject instanceof String)    //如果paramObject是String类型
        {
          String str = (String)paramObject;   //将paramObject转换成String类型
          int i = this.count;                 //如果两个对象的String长度相同
          if (i == str.count)
          {
            char[] arrayOfChar1 = this.value;
            char[] arrayOfChar2 = str.value;
            int j = this.offset;
            int k = str.offset;
            while (i-- != 0)                     //对其每一个char进行一一类比,如果有不同,返回false
              if (arrayOfChar1[(j++)] != arrayOfChar2[(k++)])
                return false;
            return true;                        //都相同则返回true
          }
        }
        return false;                           //其他情况都返回false
      }