您的位置:首页 > 其它

深入了解String,特别是==与hashCode()

2017-08-01 11:54 369 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。

    关于==,equal(),在其它很多网站和博客中已经有说明,在这里主要是讲==与hashCode()之间的区别。

 

    String str1 = "nihao" ;

    String str2 = "nihao" ;

    

    String str3 = new String("nihao");

    String str4 = new String("nihao");

    

    System.out.println("str1==str2: " + (str1==str2));    // true

    System.out.println("str1==str3: " + (str1==str3));    // false

    System.out.println("str3==str4: " + (str3==str4));   // false

    

    System.out.println("HashCode:" + str3.hashCode());  // HashCode:104818427

    System.out.println("HashCode:" + str4.hashCode());  // HashCode:104818427

    

    System.out.println(str3.hashCode() == str4.hashCode());  // true

    System.out.println(str3.equals(str4));  // true

 

第一个true,是因为str1和str2是同一个变量,这个变量在变量池中。

第一个false,是因为str1在变量池中,而str3在堆栈中,所以是不同。

第二个false,通过new创建的String,是两个不同的对象。

 

虽然str3和str4是两个不同的对象,但是其hashCode值是一样的,这就和hashCode()函数有关了,下面是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;

    }

}

 

在String类中,value是该字符串被转换成数组后的对象。由于offset总是为0,所以h一开始就是0。于是只要value是一样的,所以hashcode一定是一样的。于是可以肯定的说,==在判断对象时,其实是根据对象在堆栈中的地址判断对象是不是一样,而不是根据hashcode值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: