Java ArrayList IndexOf - 查找对象索引

p10*_*001 12 java arraylist

让我们说我上课了

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.


Ven*_*kat 9

equals方法的签名是错误的.你是不是重写equalsObject,但只是超载.

要覆盖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方法,使对象在基于地图的集合中正常工作.