Double i = Math.random()*(num*num);
if(!randoms.contains(i)){
randoms.add(i);
}
int j = randoms.get(loop).intValue();
上面是我写的一个代码,想要生成一个0到num*num的随机数,不过运行后发现j仍然会出现重复。
我查阅了contains的源码,是这样的:
contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
可以发现,内部使用的其实是equals这个方法,众所周知,equals如果用来比较两个对象,其实是比较的它们二者的地址。回头一看,原来是double写成了Double,i成了对象了。
如果我真的想比较两个对象的值,我可以改写equals方法如下:
equals(Object obj) {
if (obj instanceof User) {
User u = (User) obj;
return this.username.equals(u.username)
&& this.password.equals(password);
}
return super.equals(obj);