Java LinkedList contains() 方法
contains()
方法是 Java 中 LinkedList
类提供的一个常用方法,用于检查链表中是否包含指定的元素。该方法属于 java.util.LinkedList
类,继承自 java.util.AbstractCollection
类。
方法语法
public boolean contains(Object o)
返回值
- 如果链表中包含指定的元素,则返回
true
- 如果不包含指定的元素,则返回
false
方法详解
工作原理
contains()
方法通过遍历链表中的每个元素,并使用 equals()
方法将每个元素与目标对象进行比较。如果找到匹配的元素,则立即返回 true
;如果遍历完整个链表都没有找到匹配的元素,则返回 false
。
时间复杂度
由于 LinkedList
是一个双向链表,contains()
方法需要从链表头部开始顺序查找,因此其时间复杂度为 O(n),其中 n 是链表中元素的数量。
使用示例
基本用法
实例
import java.util.LinkedList;
public class LinkedListContainsExample {
public static void main(String[] args) {
// 创建一个 LinkedList
LinkedList<String> fruits = new LinkedList<>();
// 添加元素
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
// 检查元素是否存在
System.out.println("Contains Apple? " + fruits.contains("Apple")); // 输出: true
System.out.println("Contains Grape? " + fruits.contains("Grape")); // 输出: false
}
}
public class LinkedListContainsExample {
public static void main(String[] args) {
// 创建一个 LinkedList
LinkedList<String> fruits = new LinkedList<>();
// 添加元素
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
// 检查元素是否存在
System.out.println("Contains Apple? " + fruits.contains("Apple")); // 输出: true
System.out.println("Contains Grape? " + fruits.contains("Grape")); // 输出: false
}
}
自定义对象的使用
当使用自定义对象时,需要正确重写 equals()
方法,否则 contains()
方法可能无法按预期工作。
实例
import java.util.LinkedList;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 重写 equals 方法
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && name.equals(person.name);
}
// 重写 hashCode 方法
@Override
public int hashCode() {
return 31 * name.hashCode() + age;
}
}
public class CustomObjectExample {
public static void main(String[] args) {
LinkedList<Person> people = new LinkedList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 30));
Person alice = new Person("Alice", 25);
System.out.println("Contains Alice? " + people.contains(alice)); // 输出: true
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 重写 equals 方法
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && name.equals(person.name);
}
// 重写 hashCode 方法
@Override
public int hashCode() {
return 31 * name.hashCode() + age;
}
}
public class CustomObjectExample {
public static void main(String[] args) {
LinkedList<Person> people = new LinkedList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 30));
Person alice = new Person("Alice", 25);
System.out.println("Contains Alice? " + people.contains(alice)); // 输出: true
}
}
注意事项
1. null 值处理
LinkedList
允许包含 null
值,可以使用 contains(null)
来检查链表中是否存在 null
值。
实例
LinkedList<String> list = new LinkedList<>();
list.add(null);
System.out.println(list.contains(null)); // 输出: true
list.add(null);
System.out.println(list.contains(null)); // 输出: true
2. 性能考虑
由于 contains()
方法需要遍历链表,对于大型链表,频繁调用此方法可能会影响性能。如果需要频繁检查元素是否存在,可以考虑使用 HashSet
等更适合查找的数据结构。
3. equals() 方法的重要性
contains()
方法依赖于元素的 equals()
方法进行对象比较。如果自定义类没有正确重写 equals()
方法,contains()
方法可能无法正确识别相等的对象。
与其他方法的比较
contains() vs indexOf()
contains()
: 返回 boolean,只判断元素是否存在indexOf()
: 返回 int,返回元素第一次出现的索引位置,如果不存在则返回 -1
实例
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("A");
System.out.println(list.contains("A")); // 输出: true
System.out.println(list.indexOf("A")); // 输出: 0
list.add("A");
list.add("B");
list.add("A");
System.out.println(list.contains("A")); // 输出: true
System.out.println(list.indexOf("A")); // 输出: 0
contains() vs containsAll()
contains()
: 检查单个元素是否存在containsAll()
: 检查是否包含指定集合中的所有元素
实例
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
System.out.println(list.contains("A")); // 输出: true
List<String> checkList = Arrays.asList("A", "B");
System.out.println(list.containsAll(checkList)); // 输出: true
list.add("A");
list.add("B");
list.add("C");
System.out.println(list.contains("A")); // 输出: true
List<String> checkList = Arrays.asList("A", "B");
System.out.println(list.containsAll(checkList)); // 输出: true
总结
LinkedList
的 contains()
方法是一个简单但实用的工具,用于检查链表中是否存在特定元素。理解其工作原理和正确使用方法对于编写高效的 Java 程序非常重要。记住以下几点:
contains()
方法使用equals()
进行元素比较- 对于自定义对象,必须正确重写
equals()
和hashCode()
方法 - 该方法的时间复杂度为 O(n),不适合频繁用于大型链表
- 可以根据具体需求选择
indexOf()
或containsAll()
等替代方法
通过合理使用 contains()
方法,可以有效地管理和操作 LinkedList
中的数据。
点我分享笔记