我想将自定义类型的对象添加到集合中。我有几个相同,即它们的公共变量值相同。
我不希望将多个“相同”对象的实例添加到集合中,但是每次创建新对象时,总是将其添加。
这是因为类Object的equals方法在对象上实现了最有区别的对等关系:“对于x和y的任何非空引用值,当且仅当x和y引用同一个对象时,此方法返回true(x
= = y的值为true)。”
我可以覆盖此对象的equals方法以对其进行不同定义吗?
谢谢大家,问题解决了
通过重写Java对象的equals()方法来定义Java对象的相同性。
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((uri == null) ? 0 : uri.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Resource))
return false;
Resource other = (Resource) obj;
if (uri == null) {
if (other.uri != null)
return false;
} else if (!uri.equals(other.uri))
return false;
return true;
}
您应该为自定义类型覆盖equals
和hashCode
方法。
但是要小心,您会在这里遇到各种麻烦:例如,如果您的自定义类型具有子类型,则可能会遇到其他相等性问题:
class Point {
final int x;
final int y;
public Point(int x, int y) {
this.x= x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (o == this) return true; //If objects equal, is OK
if (o instanceof Point) {
Point that = (Point)o;
return (x == that.x) && y == that.y);
}
return false;
}
}
class ColoredPoint extends Point {
final Color color;
ColoredPoint(int x, int y, Color color) {
super(x, y);
this.color = color
}
}
Point p1 = new Point(1, 2);
ColoredPoint cp1 = new ColoredPoint(1, 2, Color.BLUE);
ColoredPoint cp1 = new ColoredPoint(1, 2, Color.RED);
就目前而言,p1,cp1和cp2都相等。但是,显然cp1和cp2不相等。您还需要在ColoredPoint中实现一个等于,以比较ColoredPoint对象(但是这会破坏p1和cp1或cp2之间的相等性)。
另外,请确保您的对等人上面有签名。将其定义为public equals(Point that)...
是一个常见的错误,这是错误的。
有关equals和hashCode规则的完整说明,请参见http://www.artima.com/lejava/articles/equality.html。
问题内容: 新的ES 6(和谐)引入了新的Set对象。Set使用的身份算法类似于运算符,因此不太适合比较对象: 如何自定义Set对象的相等性以进行深层对象比较?有没有像Java一样的东西? 问题答案: ES6 对象没有任何比较方法或自定义比较可扩展性。 的,而方法只关闭它是一个基本相同的实际物体或相同的值,没有办法插头插入或更换只是逻辑。 你大概可以从派生您自己的对象和替换,并与一些做了深刻的对象
我收到了以下JSON: 如何将其转换为JAVA对象?
如果它走路像鸭子,说话像鸭子,样子像鸭子,叫声也像鸭子,那它就是一只鸭子。 对于 Nutz Ioc 来说,它面对的配置文件就是层层嵌套的 "名值对集合",或者说是 Map 集合。 事实上,它是先把整个配置文件解析成 Map 再做判断的。 如果一个 Map 仅包括如下的键,则被认为是一个注入对象: type 对象类型 singleton 是否单例 scope 生命周期范围 events 监听事件 a
问题内容: 我需要读里面。我尝试通过如下相对路径进行操作: 这给了我以下错误: 如何在Java中定义相对路径?我正在使用jdk 1.6并在Windows上工作。 问题答案: 试试这个 因此,新文件指向创建路径,通常是项目主文件夹。 [编辑] 正如@cmc所说, 两者都赋予相同的值。
我需要使用一种命名模式创建大量对象,这种命名模式可以通过循环轻松获得。有没有办法像这样从变量中读取对象名? 我不需要为对象分配变量名,只需要在分配时从对象中获取名称即可。
出于教育目的,我正在研究Java值对象。 我不明白的是,为什么没有人(异口同声)提到Java值对象实现可比性? 如果Java值对象必须具有"正确的"HashCode 这是我的思考过程。将测试值对象的实例是否相等,因此它们需要正确的equals/hashcode。值对象可以存储在“hash”集合中,这也是Hashcode方法所需要的。那么,为什么不添加Compariable以便它们可以成为有序集合中