我在哪里出错是遵循理解?
情景1:
Float[] f1= new Float[2];
Float[] f2= new Float[2];
System.out.println("Values"+f1[0]+","+f2[0]+","+(f1==f2));
输出:0.0,0.0,假。
我从中理解的是:
1)每当我们声明一个float类型数组时,所有的值都被初始化为0.0
2)虽然f1和f2都有相同的值,但它们指向Heap中的不同地址。
3)Object Class中的.equals()比较head中值的地址和值。
HashMap<String, Integer> hashMap = new HashMap();
String str1 = new String("test");
String str2 = new String("test");
System.out.println((str1==str2));
System.out.println((str1.hashCode()==str2.hashCode()));
hashMap.put(str1,1);
hashMap.put(str2,2);
System.out.println(hashMap.get(str1));
输出:假 真正 2
场景2
我从中理解的是 1)两个不可变的字符串文字&#34; test&#34;被创造了。它们都指向内存中的不同位置
2)从Oracle Docs中,如果equals返回的值相同,则返回的hashcode值必须相同,反之亦然。因此,在第二输出中从等于方法的偏转是合理的(即,与hashValue相比较)。 在这种情况下hashCode如何在内部工作?不是比较地址吗?在这里,他们指向不同的位置,所以他们应该有不同的地址吗?
3)它们具有相同的hashCode,因此hashMap将str1的值替换为str2。
答案 0 :(得分:0)
情景#1
1)每当我们声明一个浮点类型数组时,所有的值都被初始化为0.0
是的,这是真的
2)尽管f1和f2都具有相同的值,但它们指向Heap中的不同地址 是的,您正在比较堆中两个数组的引用。
3)Object Class中的.equals()比较head中值的地址和值 是和上面#2的答案相同。它比较了两个对象的引用。
情景#2
1)两个不可变的字符串文字&#34; test&#34;被创造了。它们都指向存储器中的不同位置
是的,这是真的。
2)从Oracle Docs中,如果equals返回的值相同,则返回的hashcode值必须相同,反之亦然。因此,在第二输出中从等于方法的偏转是合理的(即,与hashValue相比较)。在这种情况下,hashCode如何在内部工作?不是比较地址吗?在这里,他们指向不同的位置,所以他们应该有不同的地址吗?
这就是hashCode方法在String上的工作方式:
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
3)它们具有相同的hashCode,因此hashMap将str1的值替换为str2 除了hashCode之外,它还会检查两个对象是否相等,如果两个条件都满足,那么它将覆盖相同的键的值。