Man*_*tis 292 java evaluation arraylist object
假设我创建了一个对象并将其添加到我的对象中ArrayList
.如果我然后使用完全相同的构造函数输入创建另一个对象,那么该contains()
方法是否会将两个对象评估为相同?假设构造函数对输入没有做任何有趣的事情,并且存储在两个对象中的变量是相同的.
ArrayList<Thing> basket = new ArrayList<Thing>();
Thing thing = new Thing(100);
basket.add(thing);
Thing another = new Thing(100);
basket.contains(another); // true or false?
Run Code Online (Sandbox Code Playgroud)
class Thing {
public int value;
public Thing (int x) {
value = x;
}
equals (Thing x) {
if (x.value == value) return true;
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
这是class
应该如何实现contains()
回归true
?
Bin*_*erd 328
ArrayList implements
列表接口.
如果你看一下Javadoc文档List
的contains
方法,你会看到它使用的equals()
方法来评估,如果两个对象是相同的.
Chr*_*CVB 52
我认为正确的实施应该是
public class Thing
{
public int value;
public Thing (int x)
{
this.value = x;
}
@Override
public boolean equals(Object object)
{
boolean sameSame = false;
if (object != null && object instanceof Thing)
{
sameSame = this.value == ((Thing) object).value;
}
return sameSame;
}
}
Run Code Online (Sandbox Code Playgroud)
ale*_*loh 12
通常,您也应该在hashCode()
每次覆盖时覆盖equals()
,即使只是为了提升性能.HashCode()
在进行比较时,决定对象被分类到哪个"桶",因此任何两个equal()
评估为true的对象都应返回相同的值hashCode
value()
.我不记得它的默认行为hashCode()
(如果它返回0,那么你的代码应该工作但是很慢,但是如果它返回地址那么你的代码就会失败).当我的代码失败时,我确实记得很多次,因为我忘了覆盖hashCode()
了.:)
小智 6
class Thing {
public int value;
public Thing (int x) {
value = x;
}
equals (Thing x) {
if (x.value == value) return true;
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
你必须写:
class Thing {
public int value;
public Thing (int x) {
value = x;
}
public boolean equals (Object o) {
Thing x = (Thing) o;
if (x.value == value) return true;
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
现在它有效;)
只是想要注意,当value
不是基本类型时,以下实现是错误的:
public class Thing
{
public Object value;
public Thing (Object x)
{
this.value = x;
}
@Override
public boolean equals(Object object)
{
boolean sameSame = false;
if (object != null && object instanceof Thing)
{
sameSame = this.value == ((Thing) object).value;
}
return sameSame;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我提出以下建议:
public class Thing {
public Object value;
public Thing (Object x) {
value = x;
}
@Override
public boolean equals(Object object) {
if (object != null && object instanceof Thing) {
Thing thing = (Thing) object;
if (value == null) {
return (thing.value == null);
}
else {
return value.equals(thing.value);
}
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)