List内部提供了contains()方法:该方法用来判断list内部是否包含某个指定元素。
因此我们可以这样用:
public class Main {
public static void main(String[] args) {
List<String> list = List.of("A", "B", "C");
System.out.println(list.contains(new String("C"))); // true or false?
System.out.println(list.indexOf(new String("C"))); // 2 or -1?
}
}
true
2
但当我们创建类,并且调用该方法时:
public class EqualsTest {
public static void main(String[] args) {
List<Person> list = List.of(
new Person("Xiao", "Ming", 18),
new Person("Xiao", "Hong", 25),
new Person("Bob", "Smith", 20)
);
boolean exist = list.contains(new Person("Bob", "Smith", 20));
System.out.println(exist ? "包含" : "不包含");
}
}
class Person {
String firstName;
String lastName;
int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
}
输出的结果为不包含
查看contains()方法源码
public boolean contains(Object o) {
Iterator<E> it = iterator();
if (o==null) {
while (it.hasNext())
if (it.next()==null)
return true;
} else {
while (it.hasNext())
if (o.equals(it.next()))
return true;
}
return false;
}
在代码中可以看到,使用了.equals()方法,当我们使用String类时,java已经将String类中的equals方法覆写完成,因此不需要我们多做改动。但当我们使用自己创建的类时,由于没有覆写该方法,所以出现错误。
如何覆写:
以下是手写:
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if(obj instanceof Person) {
Person person = (Person) obj;
return this.firstName.equals(person.firstName)&&this.lastName.equals(person.lastName)&&this.age==person.age;
}
return super.equals(obj);
}
在IDE中快捷创建:(Eclipse为例)
选中类名右键→Source→Generate hashCode() and equals()→默认值点击Generate,完成。