在ArrayList中根据自定义类的一个属性找某个对象

今天写了学生管理系统,有很多认识太浅,所以先记录下来一点现在的一些收获
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);
		}
	}
}

你可能感兴趣的:(javaSE)