Java LinkedList indexOf() 方法

Java LinkedList Java LinkedList


indexOf() 方法是 Java 中 LinkedList 类提供的一个常用方法,用于查找指定元素在链表中的首次出现位置。该方法属于 java.util.LinkedList 类,继承自 java.util.AbstractList 类。

方法语法

public int indexOf(Object o)

返回值

  • 返回指定元素在链表中第一次出现的索引(从 0 开始计数)
  • 如果链表中不包含该元素,则返回 -1

参数说明

参数 类型 描述
o Object 需要在链表中查找的元素

注意事项

  1. 参数可以是任何对象类型,包括 null
  2. 查找时使用 equals() 方法进行元素比较
  3. 如果链表包含多个相同的元素,只返回第一个匹配项的索引

使用示例

基础示例

实例

import java.util.LinkedList;

public class LinkedListIndexOfExample {
    public static void main(String[] args) {
        // 创建一个 LinkedList
        LinkedList<String> fruits = new LinkedList<>();
       
        // 添加元素
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Orange");
        fruits.add("Banana"); // 重复元素
       
        // 查找元素索引
        System.out.println("Index of 'Banana': " + fruits.indexOf("Banana")); // 输出: 1
        System.out.println("Index of 'Grape': " + fruits.indexOf("Grape"));   // 输出: -1
        System.out.println("Index of 'Orange': " + fruits.indexOf("Orange")); // 输出: 2
    }
}

处理 null 元素

实例

import java.util.LinkedList;

public class NullIndexOfExample {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("A");
        list.add(null);
        list.add("B");
       
        System.out.println("Index of null: " + list.indexOf(null)); // 输出: 1
    }
}

实现原理

底层实现

LinkedListindexOf() 方法通过遍历链表节点来查找元素:

  1. 从链表的第一个节点(头节点)开始遍历
  2. 对每个节点,使用 equals() 方法比较元素
  3. 找到第一个匹配的节点时,返回当前索引
  4. 如果遍历完所有节点仍未找到,返回 -1

时间复杂度

  • 平均时间复杂度:O(n)
  • 最坏情况时间复杂度:O(n)

因为 LinkedList 是基于链表实现的,需要从头开始顺序查找,无法像数组那样随机访问。


与相关方法的比较

indexOf() vs lastIndexOf()

方法 描述 查找方向
indexOf() 返回元素第一次出现的位置 从头到尾
lastIndexOf() 返回元素最后一次出现的位置 从尾到头

indexOf() vs contains()

方法 返回值 用途
indexOf() int (索引位置) 需要知道元素位置时使用
contains() boolean 只需要知道元素是否存在时使用

实际上,contains() 方法内部就是调用 indexOf() >= 0 来实现的。


实际应用场景

场景 1:检查元素是否存在

实例

LinkedList<String> usernames = new LinkedList<>();
// ... 添加用户名

String input = "admin";
if (usernames.indexOf(input) != -1) {
    System.out.println("用户名已存在");
} else {
    System.out.println("可以注册");
}

场景 2:获取元素位置进行后续操作

实例

LinkedList<Task> taskList = new LinkedList<>();
// ... 添加任务

int index = taskList.indexOf(importantTask);
if (index != -1) {
    // 在重要任务前插入新任务
    taskList.add(index, newUrgentTask);
}

场景 3:数据去重

实例

LinkedList<String> listWithDuplicates = new LinkedList<>();
// ... 添加可能有重复的数据

LinkedList<String> uniqueList = new LinkedList<>();
for (String item : listWithDuplicates) {
    if (uniqueList.indexOf(item) == -1) {
        uniqueList.add(item);
    }
}

注意事项

  1. 性能考虑:对于频繁查找操作,ArrayListindexOf() 通常比 LinkedList 更快
  2. 元素比较:确保存储在 LinkedList 中的对象正确实现了 equals() 方法
  3. 并发修改:如果在迭代过程中修改链表,可能会抛出 ConcurrentModificationException
  4. null 处理:可以查找 null 元素,但要注意 NullPointerException 风险

总结

LinkedListindexOf() 方法是一个实用的查找工具,它:

  • 简单易用,只需传入要查找的元素
  • 返回元素首次出现的位置索引
  • 找不到时返回 -1
  • 适用于各种对象类型,包括 null

理解并熟练使用这个方法,可以帮助你更有效地处理链表中的数据查找需求。

Java LinkedList Java LinkedList