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"常量字符的引用而已.
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"常量字符的引用而已.
所以一样。b和c,equal的话,一样; == 才不一样
二、String类重写了equal hashCode方法。
三、equal结果为true,所以hashCode一定相同,
2、重写equals方法的时候必须重写hashCode方法。如果一个类的两个对象,使用equals方法比较时,结果为true,那么该两个对象具有相同的hashCode。原因是equals方法为true,表明是同一个对象,它们的hashCode当然相同。
3、Ojbect类的hashCode方法返回的是Object对象的内存地址。可以通过Integer.toHexString(new Object().hashCode);来得到
首先··String 直接赋值是给变量一个存在栈中德字符
new String 是 新的一个对象对这个变量的引用只是调用了内存中的地址····
两个是不通的概念啊··后者对象 前者是各变量
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;
}
另一个是new String("a")对象
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
}