一、List和contains方法介绍
List是Java中的一个接口,用于存储有序的元素集合。它有许多不同的实现方式,如ArrayList、LinkedList等。其中,ArrayList是最常用的一种实现方式,它是一个基于动态数组的实现。
contains方法是List接口提供的一个用于判断元素是否存在的方法。它接收一个参数,表示需要判断的元素,返回一个布尔值,表示列表是否包含这个元素。
二、使用List的contains方法判断元素是否存在
在使用List的contains方法时,我们需要先创建一个List对象,并向其中添加一些元素。下面的代码演示了如何使用List的contains方法判断元素是否存在:
import java.util.ArrayList; import java.util.List; public class ListContainsDemo { public static void main(String[] args) { List上面的代码首先创建了一个ArrayList,并向其中添加了三个水果。然后使用contains方法判断了列表中是否包含了“banana”和“durian”两个元素。程序输出如下:list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("cherry"); boolean containsBanana = list.contains("banana"); System.out.println("List contains \"banana\": " + containsBanana); boolean containsDurian = list.contains("durian"); System.out.println("List contains \"durian\": " + containsDurian); } }
List contains "banana": true List contains "durian": false
可以看到,contains方法返回了正确的结果。在实际开发中,我们经常需要使用contains方法来判断某个元素是否存在于列表中。
三、List和equals方法的注意事项
在使用List的contains方法时,有一些需要注意的地方。首先是List和equals方法的关系。equals方法用于比较两个对象是否相等,当我们向List中添加自定义对象时,需要确保自定义对象的equals方法被正确地重写,否则List的contains方法可能无法正常工作。
例如,我们有一个Student类表示学生信息,其中包含学号和姓名两个属性:
public class Student { private String id; private String name; public Student(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }现在,我们需要使用List的contains方法判断是否包含学号为“1001”的学生。我们先创建一个List对象,并向其中添加三个学生:
List接着,我们使用如下代码判断学号为“1001”的学生是否在列表中:students = new ArrayList<>(); students.add(new Student("1001", "张三")); students.add(new Student("1002", "李四")); students.add(new Student("1003", "王五"));
Student student = new Student("1001", "张三"); boolean containsStudent = students.contains(student); System.out.println("List contains \"1001\": " + containsStudent);运行上述代码,发现结果为false,这是因为我们没有重写Student类的equals方法,List的contains方法默认使用的是Object类的equals方法,而这个方法比较的是两个对象的内存地址。因此,为了使List的contains方法能够正确判断元素是否存在,我们需要在Student类中重写equals方法,比较的是学生的学号这一个属性:
public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Student student = (Student) obj; return Objects.equals(id, student.id); }现在,我们再次运行上述代码,结果为true,说明我们已经成功地判断了学号为“1001”的学生是否在列表中。
四、List和null值的注意事项
在使用List的contains方法时,还需要注意列表中是否包含null值。默认情况下,List是允许包含null值的,但是在调用contains方法时,需要注意这个问题。
例如,我们有一个包含null值的列表:
List现在,我们需要使用List的contains方法判断是否包含null值。我们可以先对null值进行特判:list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add(null); list.add("cherry");
if (list.contains(null)) { System.out.println("List contains null"); } else { System.out.println("List does not contain null"); }但是,如果我们误将null值当作列表中的一个元素,那么我们其实是在判断这两个对象是否相等。我们可以通过如下代码判断null值是否在列表中:
boolean containsNull = list.stream().anyMatch(Objects::isNull); System.out.println("List contains null: " + containsNull);另外,如果我们向列表中添加了若干个null值,调用contains方法时,只会返回第一个null的索引位置,而不是最后一个null的位置。要查找最后一个null,可以使用如下代码:
int lastIndex = list.lastIndexOf(null); System.out.println("Last index of null: " + lastIndex);
五、List和containsAll方法的注意事项
除了contains方法,List还提供了containsAll方法,用于判断一个列表是否包含另一个列表中所有的元素。
例如,我们有一个列表movies,存储了多部电影的名字:
List现在,我们有一个列表watched,存储了用户看过的电影名字:movies = new ArrayList<>(); movies.add("The Godfather"); movies.add("The Shawshank Redemption"); movies.add("The Dark Knight"); movies.add("The Lord of the Rings");
List我们要判断用户是否看过所有的电影,可以使用如下代码:watched = new ArrayList<>(); watched.add("The Godfather"); watched.add("The Shawshank Redemption");
boolean containsAll = movies.containsAll(watched); System.out.println("User has watched all movies: " + containsAll);如果用户看过所有的电影,程序输出true,否则输出false。注意,containsAll方法比较的是两个列表中的对象是否相等,因此在使用时需要确保对象的equals方法已被正确地重写。
六、总结
List的contains方法是一个非常常用的方法,可用于判断一个元素是否存在于列表中。在使用contains方法时,需要注意List和equals方法、null值以及containsAll方法等问题。只有正确地使用这些API,才能在实际开发中取得更好的效果。