我有以下代码:
class Animal {
int i;
public Animal(){
i=13;
}
public String toString(){
return "Animal "+i;
}
}
//
public class NewMain {
public static void main(String[] args) {
HashSet hs=new HashSet();
boolean b=hs.add(new Animal());
boolean b1=hs.add(new Animal());
System.out.println(b+" "+b1);
for(Object o:hs)
{
System.out.println(hs);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这Set
不允许重复,但为什么上面的代码似乎允许两个相同的值?
正如已经指出的那样,你需要覆盖hashCode
和equals
.你可以比较int i
一下,
class Animal {
int i;
public Animal() {
i = 13;
}
@Override
public String toString() {
return "Animal " + i;
}
@Override
public int hashCode() {
return Integer.hashCode(i);
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Animal) {
return ((Animal) obj).i == i;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我会建议你使用泛型Collection
.此外,您应该Collection
在循环中打印实例(而不是).就像是,
public static void main(String[] args) {
Set<Animal> hs = new HashSet<>();
boolean b = hs.add(new Animal());
boolean b1 = hs.add(new Animal());
System.out.println(b + " " + b1);
for (Animal a : hs) {
System.out.println(a);
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了(预期的)
true false
Animal 13
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
93 次 |
最近记录: |