关于list的indexOf与equals的联系

本文通过一个Java示例程序展示了如何自定义对象的equals方法,并解释了equals方法在List中查找元素时的作用。同时,对比了正确与错误的equals实现所带来的不同结果。

 

 

 

 

false
true
false
-1

 public boolean equals(Object o){
//            if (this.id == p.getId()) {
//                return true;
//            } else {
//                return false;
//            }
            Product p = (Product)o;
            if (this.id == p.getId()) {
                return true;
            } else {
                return false;
            }
             
       }


false
true
false
1

 

 

 

 

 

来源:http://topic.youkuaiyun.com/u/20100705/11/719E49EA-D94E-4EB7-B5DE-7DA6E1EF9B6E.html

### Java List 集合 `indexOf` 方法 使用说明 在 Java 中,`List` 接口定义了一个名为 `indexOf(Object o)` 的方法。该方法用于返回指定元素第一次出现的索引位置。如果列表中不存在该元素,则返回 `-1`。 #### 方法签名 以下是 `indexOf` 方法的标准签名: ```java int indexOf(Object o) ``` - 参数:`o` 是要定位的目标对象。 - 返回值:如果找到目标对象,则返回其首次出现的索引;如果没有找到,则返回 `-1`。 #### 工作原理 当调用 `indexOf` 方法时,它会遍历整个列表并逐一比较每个元素给定参数 `o` 是否相等。这种比较基于 `equals()` 方法[^1]。换句话说,只有当两个对象通过 `equals()` 方法判定为相等时,才会认为它们是相同的元素。 需要注意的是,对于引用类型的对象来说,`indexOf` 并不会直接比较内存地址(即引用本身),而是依赖于对象自身的 `equals()` 实现来判断两者是否相同。因此,在使用自定义类作为 `List` 元素时,应确保正确重写了 `equals()` 和 `hashCode()` 方法,以便能够正常工作[^2]。 #### 示例代码 下面是一个简单的例子展示如何使用 `indexOf`: ```java import java.util.ArrayList; import java.util.List; public class IndexOfExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); // 添加一些字符串到列表中 list.add("Apple"); list.add("Banana"); list.add("Orange"); list.add("Banana"); // 同样的元素可以重复 System.out.println(list.indexOf("Banana")); // 输出第一个匹配项的位置 (索引为1)[^3] System.out.println(list.indexOf("Grapes")); // 如果找不到则返回 -1 } } ``` 在这个例子中,“Banana”的首个实例位于索引号为 `1` 处,所以打印结果将是 `1`。而对于未存在于列表中的 “Grapes”,由于没有任何匹配项存在,故输出为 `-1`。 #### 特殊情况处理 - **空列表**:如果尝试在一个空列表上调用 `indexOf` ,因为没有元素可查寻,任何查询都会得到 `-1` 结果。 - **多个相同元素**:如果有多个具有同样值的对象存放在同一个列表里头的话,那么仅仅只会报告最早的那个发生位置而已。 #### 性能考量 尽管大多数情况下我们不需要关心底层实现细节,但对于像 `LinkedList` 这样特定的数据结构而言,随机访问性能较差,这意味着频繁地调用诸如 `get(index)` 或者我们的主角——`indexOf(object)` 可能会引起效率低下问题。所以在实际开发过程中遇到这种情况的时候应该考虑改用其他更适合的操作方式比如迭代器等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值