今天写了学生管理系统,有很多认识太浅,所以先记录下来一点现在的一些收获
remove和contains都调用了equals
当遇到类似于:根据对象的一个属性去找到这个对象对其操作时,并且这个对象不是String类型而是自定义类,此时该对象调用上两个方法时会遇到
public class Test {
public boolean remove(Object o) {
Iterator<E> it = iterator();
if (o == null) {
while (it.hasNext()) {
if (it.next() == null) {
it.remove();
return true;
}
}
} else {
while (it.hasNext()) {
if (o.equals(it.next())) {
it.remove();
return true;
}
}
}
return false;
}
}
public class Test {
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i] == null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
}
o是上转型对象,地址指向自定义类,而自定义类并没有重写父类Object的equals方法,则这里调用的是Object的方法,比较两地址是否相同。因此为了比较对象的一个属性,则需重写该equals方法
@Override
public boolean equals(Object obj) {
Student stu = (Student) obj;//下转型对象可调用子类新增的方法和属性
return id.equals(stu.id);
}
容器中是否包含指定属性的对象可以这么写
public class Student {
private String name;
private String id;
@Override
public boolean equals(Object obj) {
Student stu = (Student) obj;
return id.equals(stu.id);
}
}
public class Work {
public static void main(String [] args){
private static ArrayList<Student> list = new ArrayList<>();
Student stu = new Student("2018");
if(!list.contains(stu)) {
list.add(stu);
}
}
}