Java ArrayList indexOf返回-1

Kaa*_*reZ 0 java equals arraylist indexof

我的代码有一个奇怪的问题.

下面是我测试Chunk类的代码:

List<Chunk> chunks = new ArrayList<Chunk>();
chunks.add(new Chunk(1,1,1));
System.out.println(chunks.indexOf(new Vector3i(1, 1, 1)));
Run Code Online (Sandbox Code Playgroud)

这里是Chunk类的equals方法:

public boolean equals(Object object) {
    System.out.println("Test _1_");
    if (object != null && object instanceof Vector3i) {
        System.out.println("Test _2_");
        if((this.x == ((Vector3i) object).x)&&(this.y == ((Vector3i) object).y)&&(this.z == ((Vector3i) object).z)) {
            System.out.println("Test _3_");
            return true;
        }
    }
    System.out.println("Test _4_");

    return false;
}
Run Code Online (Sandbox Code Playgroud)

Vector3i:

public class Vector3i {
    public int x;
    public int y;
    public int z;


    public Vector3i(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它只返回-1.来自equals方法的测试打印不会打印,这意味着它甚至没有开始执行.这是为什么?

Tag*_*eev 5

如果检查ArrayList.indexOf实现,您将看到Vector3i.equals在您的情况下调用.实际上它甚至在JavaDoc中指定List:

更正式地,返回最低索引i (o==null ? get(i)==null : o.equals(get(i))),或者-1如果没有这样的索引.

一般来说,equals操作必须是对称的:a.equals(b) == b.equals(a).所以你必须实施Vector3i.equals.

另请注意,您当前的equals实现缺乏反身性等其他属性.还要考虑在实现hashCode时实现equals.