Java LinkedList indexOf() 方法
indexOf()
方法是 Java 中 LinkedList
类提供的一个常用方法,用于查找指定元素在链表中的首次出现位置。该方法属于 java.util.LinkedList
类,继承自 java.util.AbstractList
类。
方法语法:
public int indexOf(Object o)
返回值:
- 返回指定元素在链表中第一次出现的索引(从 0 开始计数)
- 如果链表中不包含该元素,则返回 -1
参数说明
参数 | 类型 | 描述 |
---|---|---|
o | Object | 需要在链表中查找的元素 |
注意事项
- 参数可以是任何对象类型,包括
null
- 查找时使用
equals()
方法进行元素比较 - 如果链表包含多个相同的元素,只返回第一个匹配项的索引
使用示例
基础示例
实例
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
}
}
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
}
}
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
}
}
实现原理
底层实现
LinkedList
的 indexOf()
方法通过遍历链表节点来查找元素:
- 从链表的第一个节点(头节点)开始遍历
- 对每个节点,使用
equals()
方法比较元素 - 找到第一个匹配的节点时,返回当前索引
- 如果遍历完所有节点仍未找到,返回 -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("可以注册");
}
// ... 添加用户名
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);
}
// ... 添加任务
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);
}
}
// ... 添加可能有重复的数据
LinkedList<String> uniqueList = new LinkedList<>();
for (String item : listWithDuplicates) {
if (uniqueList.indexOf(item) == -1) {
uniqueList.add(item);
}
}
注意事项
- 性能考虑:对于频繁查找操作,
ArrayList
的indexOf()
通常比LinkedList
更快 - 元素比较:确保存储在
LinkedList
中的对象正确实现了equals()
方法 - 并发修改:如果在迭代过程中修改链表,可能会抛出
ConcurrentModificationException
- null 处理:可以查找
null
元素,但要注意NullPointerException
风险
总结
LinkedList
的 indexOf()
方法是一个实用的查找工具,它:
- 简单易用,只需传入要查找的元素
- 返回元素首次出现的位置索引
- 找不到时返回 -1
- 适用于各种对象类型,包括
null
理解并熟练使用这个方法,可以帮助你更有效地处理链表中的数据查找需求。
点我分享笔记