我正在准备java认证,显然我无法正确回答这个答案。
假设:
2. class Chilis {
3. Chilis(String c, int h) { color = c; hotness = h; }
4. String color;
5. private int hotness;
6. public boolean equals(Object o) {
7. Chilis c = (Chilis)o;
8. if(color.equals(c.color) && (hotness == c.hotness)) return true;
9. return false;
10. }
11. // insert code here
12. }
其中,在第11行独立插入,满足equals()和 chilis的hashCode()合约? (选择所有适用的选项。)
- 甲。 public int hashCode(){return 7; }
- B中。 public int hashCode(){return hotness; }
- ℃。 public int hashCode(){return color.length(); }
- d。 public int hashCode(){return(int)(Math.random()* 200); }
- 电子。 public int hashCode(){return(color.length()+ hotness); }
这本书说:
A, B, C, and E are correct. They all guarantee that two objects that equals() says are
equal, will return the same integer from hashCode(). The fact that hotness is private
has no bearing on the legality or effectiveness of the hashCode() method.
现在我得到A和B,但不是C和E,因为这对我来说听起来不对。请看以下示例:
Under c = new Under("ciao", 9);
Map<Under, String> map = new HashMap<Under, String>();
map.put(c, "ciao");
System.out.println(map.get(c));
c.color = "uauauauauau";
System.out.println(map.get(c));
输出将是:
ciao
null
我说基于颜色的访问修饰符。在Object类的文档中,我们有合同:
所以根据这些规则中的第一条,是否应该有这种行为?
答案 0 :(得分:4)
从您引用的文档:
每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,如果对象的等比较中没有使用的信息被修改。从应用程序的一次执行到同一应用程序的另一次执行,此整数不需要保持一致。
所以这是预期的行为。如果equals
和hashCode
使用可变字段并将受影响的对象放入HashMap并且值发生更改,则所有投注都将关闭。
答案 1 :(得分:2)
通常hashCode在对象生存期内不应更改,因此应使用final字段。由于颜色可以在执行期间更改,因此不应在哈希码或等于
中使用答案 2 :(得分:2)
每当在Java应用程序执行期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象上的equals比较中使用的信息。
这是另一种说法,如果更改了equals比较中使用的信息,那么hascode可能会有所不同。这就是C和E中发生的事情。