让我们说我上课了
public class Data{
public int k;
public int l;
public Data(int k, int l){
this.k = k;
this.l = l;
}
public boolean equals(Date m){
if(this.k == m.k && this.l = m.l)
return true;
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我向ArrayList添加了一些Data对象:
ArrayList<Data> holder = new ArrayList<Data>;
Data one = new Data(0,0);
Data two = new Data(0,4);
Data three = new Data(0,5);
Run Code Online (Sandbox Code Playgroud)
为什么indexOf找不到这个?:
holder.indexOf(new Data(0,4)); //returns -1
Run Code Online (Sandbox Code Playgroud)
indexOf是否比自己遍历整个数组列表更好?或者我错过了什么.
Mak*_*oto 22
该indexOf()方法确实遍历整个列表.这是Java 7源代码的摘录:
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;
}
Run Code Online (Sandbox Code Playgroud)
让Java通过它比自己编写更好.只需确保您的equals方法足以找到您想要的对象.你也想要覆盖hashCode().
我不会写出你的equals方法,但我建议你至少:
if(boolean_expr) { return true; }; 只返回布尔表达式.equals方法 - 签名需要一个Object参数,而不是Date.你equals方法的签名是错误的.你是不是重写equals的Object,但只是超载.
要覆盖equals方法的行为Object,您的签名必须与中的签名完全匹配Object.试试这个:
public boolean equals(Object o) {
if(!(o instanceof Data)) return false;
Data other = (Data) o;
return (this.k == other.k && this.l == other.l);
}
Run Code Online (Sandbox Code Playgroud)
此外,正如其他人所建议的那样,最好覆盖hashCode方法,使对象在基于地图的集合中正常工作.
| 归档时间: |
|
| 查看次数: |
35243 次 |
| 最近记录: |