gpt4 book ai didi

Java:从 equals 方法中省略数据成员

转载 作者:行者123 更新时间:2023-11-29 08:18:30 24 4
gpt4 key购买 nike

public class GamePiece {
public GamePiece(char cLetter, int nPointValue) {
m_cLetter=cLetter;
m_nPointValue=nPointValue;
m_nTurnPlaced=0; //has not been placed on game board yet.
}

public char GetLetter() {return m_cLetter;}
public int GetPointValue() {return m_nPointValue;}
public int GetTurnPlaced() {return m_nTurnPlaced;}

public void SetTurnPlaced(int nTurnPlaced) { m_nTurnPlaced=nTurnPlaced; }

@Override
public boolean equals(Object obj) {
/*NOTE to keep this shorter I omitted some of the null checking and instanceof stuff. */
GamePiece other = (GamePiece) obj;

//not case sensitive, and I don`t think we want it to be here.
if(m_cLetter != other.m_cLetter) {
return false;
}

if(m_nPointValue != other.m_nPointValue) {
return false;
}
/* NOTICE! m_nPointValue purposely omitted. It does not affect hashcode or equals */

return true;
}

@Override public int hashCode() {
/* NOTICE! m_nPointValue purposely omitted. It should not affect hashcode or equals */
final int prime = 41;
return prime * (prime + m_nPointValue + m_cLetter);
}

private char m_cLetter;
private int m_nPointValue;
private int m_nTurnPlaced;//turn which the game piece was placed on the game board. Does not affect equals or has code!
}

考虑给定的一段代码。在引入 m_nTurnPlaced 成员之前,这个对象一直是不可变的(可以通过 SetTurnPlaced 方法修改,所以现在 GamePiece 变成了可变的)。

GamePiece在ArrayList中使用,我调用了contains和remove方法,这两个方法都依赖于equals方法来实现。

我的问题是,Java 中某些成员不影响 equals 和 hashcode 是否正常或常见做法?这将如何影响它在我的 ArrayList 中的使用?既然它是可变的,那么使用什么类型的 java 集合会不安全?有人告诉我,您不应该覆盖可变对象上的 equals,因为它会导致某些集合表现得“奇怪”(我在 java 文档的某处读到过)。

最佳答案

是的,当然你如何定义你的equalshashCode ,以及你如何/何时改变对象,会导致集合表现得“奇怪”。这是一个例子:

BitSet bitset = new BitSet();
Collection<BitSet> bitsetcol = new HashSet<BitSet>();
bitsetcol.add(bitset);
System.out.println(bitsetcol.contains(bitset)); // prints true
bitset.set(42);
System.out.println(bitsetcol.contains(bitset)); // prints false!!!

这里发生的是 Bitset定义 equalshashCode根据设置的位。 HashSet使用 hashCode 查找对象和 equals .通过修改bitset , 它现在有一个不同的 hashCode ,因此 bitsetcol找不到了。

你会注意到如果bitsetcol = new ArrayList<BitSet>(); ,那么它仍然可以找到它!不同Collection实现对这种变异机制具有不同程度的容忍度。


至于你能不能@Override equals在可变类型上,是的,这当然没问题。 BitSet当然可以。最重要的是,这正是您对 BitSet 的预期行为。 (出于性能原因,它被设计为可变的)。

如果您的可变类对 @Override equals 有意义和 hashCode ,然后这样做。

关于Java:从 equals 方法中省略数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2440794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com