contains()
是一个 Java 集合框架中的方法,其主要作用是检测某个对象是否存在于集合中。具体而言,对于一个 Collection
类型的集合(例如 List
、Set
等),contains(Object obj)
方法会返回一个布尔值,表示给定对象是否在此集合中。
例如,在 List 中调用 contains(Object obj)
方法时,若当前集合中存在与指定对象相等的元素,则该方法返回 true
;反之,如果集合中不存在相同的元素,则返回 false
。
下面是使用 List.contains()
方法的示例代码:
List<String> list = Arrays.asList("Java", "C++", "Python", "Perl");
System.out.println(list.contains("Java")); // true
System.out.println(list.contains("Ruby")); // false
在上述代码中,我们首先创建了一个包含 4 个字符串元素的列表 list
,然后分别调用了其 contains()
方法,以检查是否包含 "Java"
和 "Ruby"
两个字符串。由于列表中确实存在 "Java"
这个字符串,因此第一行输出为 true
;而由于列表中没有 "Ruby"
这个字符串,因此第二行输出为 false
。
比较的原理
contains()
方法的实现逻辑会涉及到对象之间的比较,而默认情况下(如果集合中元素的类型没有重写 equals()
方法),其判断逻辑就是调用 Object
类提供的 equals(Object obj)
方法来比较两个对象是否相等。
如果集合中的元素类型重写了 equals()
方法,那么 contains()
方法在判断某个元素是否存在于集合中时,也会使用该类型的 equals()
方法来进行比较。
例如,假设我们有一个类 Person
:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) { // 重写equals方法
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
在上述代码中,我们重写了 equals()
方法,以便基于属性 name
和 age
来判断两个 Person
对象是否相等。接下来,我们创建一个 List
集合,并向其中添加两个 Person
对象:
List<Person> list = new ArrayList<>();
list.add(new Person("Alice", 20));
list.add(new Person("Bob", 25));
现在,我们可以通过 list.contains()
方法来检查某个 Person
对象是否存在于集合中。例如:
Person p1 = new Person("Alice", 20);
System.out.println(list.contains(p1)); // true
由于 p1
对象和 list
集合中的第一个元素具有相同的 name
和 age
属性,因此 list.contains(p1)
返回 true
。
需要注意的是,在进行对象比较时,如果对象类型没有提供自定义的 equals()
方法实现,则会使用默认的 equals()
方法,即 Object 类的 equals()
方法。这种默认的比较方式只有在两个对象的内部存储地址完全相同时才认为它们相等,通常不适用于我们自定义的业务场景。
一个自己写的简单的图书管理系统
library类
import java.util.ArrayList;
import java.util.List;
public class Library {
private List<Book> books;
public Library() {
books = new ArrayList<>();
}
public void addBook(Book book) {
// 判断书库中是否已经存在此书
if (!books.contains(book)) {
books.add(book);
} else {
System.out.println("此书已经存在,无法添加。");
}
}
public void displayBooks() {
System.out.println("账号id\t\t书名\t\t作者\t\t价格");
for (Book book : books) {
System.out.println(book);
}
}
}
书本
public class Book {
private int id;
private String name;
private String author;
private double price;
public Book(int id, String name, String author, double price) {
this.id = id;
this.name = name;
this.author = author;
this.price = price;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
public double getPrice() {
return price;
}
// 重写equals方法,判断账号id和书名name是否相同
@Override
public boolean equals(Object obj) {
if (obj instanceof Book) {
Book book = (Book) obj;
return this.id == book.id && this.name.equals(book.name);
}
return false;
}
// 重写toString方法,返回图书信息字符串
@Override
public String toString() {
return "\t" + id + "\t" + "\t" + name + "\t" + "\t" + author + "\t" + "\t" + price;
}
}
测试类
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean flag = true;
Library library = new Library();
while(flag) {
System.out.print("请输入id");
int id = sc.nextInt();
System.out.print("请输入书名");
String name = sc.next();
System.out.print("请输入作者");
String auther = sc.next();
System.out.print("请输入价格");
double price = sc.nextDouble();
Book book = new Book(id,name,auther,price);
library.addBook(book);
library.displayBooks();
System.out.println("请输入是否继续添加 1(继续)/0(结束)");
int a = sc.nextInt();
if (a == 1){
flag = true;
}else if(a == 0){
flag = false;
}
}
}
}