Java ArrayList IndexOf - Finding Object Index

2022-09-04 06:02:36

假设我有一堂课

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;
    }
}

我向 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);

为什么 indexOf 找不到这个?:

holder.indexOf(new Data(0,4)); //returns -1

indexOf 比我自己浏览整个数组列表更好吗?还是我错过了什么。


答案 1

该方法遍历整个列表。以下是 Java 7 源代码的摘录:indexOf()

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;
}

让Java通过它比自己编写它更好。只需确保您的方法足以找到所需的对象即可。您还需要覆盖。equalshashCode()

我不会写出你的方法,但我至少会建议你:equals

  • 检查空值
  • 测试您正在比较的实例是否相同
  • 你不需要做 ;只需返回布尔表达式。if(boolean_expr) { return true; }
  • 确保实际覆盖了方法 - 该方法的签名需要参数,而不是 .equalsObjectDate

答案 2

方法的签名错误。您不是在覆盖 in,而只是重载它。equalsequalsObject

要覆盖 中方法的行为,您的签名必须与 中的签名完全匹配。试试这个:equalsObjectObject

public boolean equals(Object o) {
    if(!(o instanceof Data)) return false;
    Data other = (Data) o;
    return (this.k == other.k && this.l == other.l);
}

此外,正如其他人所建议的那样,最好也重写方法,以便您的对象在基于地图的集合中正常工作。hashCode


推荐