二话不说,我们直接看JDK中LinkedList的indexOf方法实现
public int indexOf(Object o) {
int index = 0;
if (o == null) {
for (Node<E> x = first; x != null; x = x.next) {
if (x.item == null)
return index;
index++;
}
} else {
for (Node<E> x = first; x != null; x = x.next) {
if (o.equals(x.item))
return index;
index++;
}
}
return -1;
}
好像看起来是没什么问题,但是其实有个地方可以做个优化:
o.equals(x.item)
这行代码如果改成
x.item!=null && x.item.equals(o)
会更好。为什么?表面上看好像只是把o.equals(x.item)改成x.item.equals(o)
但是你想一下。假设你List中存的是一个自己定义的对象:
class Player{
private int id;
private String name;
}
然后,你想在List<Player>中通过id找到玩家所在下标(先不考虑用Map来存id和玩家实例的映射,因为这个例子只是随便举的)。
这时候,indexOf(id)返回的总是-1,因为调用的是:id.euqlas(x.item),而Integer的equals传入一个Player类型势必返回false。
但是,如果LinkedList的实现是x.item.equals(o),那么你就可以通过重写Player的equals方法,使得和Integer类型比较的时候比较id字段。这样灵活性就更高了。
好吧,吐槽完还是自己写个查找的方法吧。