吐槽JDK中LinkedList的indexOf方法实现

二话不说,我们直接看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字段。这样灵活性就更高了。


好吧,吐槽完还是自己写个查找的方法吧。




评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值