在使用集合中的contains(),要根据实际情况改写集合中对象的equals(Object obj)方法------改写List集合中equals(Object obj)的方法

如标题,解释都在代码注释中

主方法及目的

···

package cn.com.testCollection;
import java.util.Iterator;
import java.util.Scanner;

/**此类是用于测试List集合中的contains()方法
 * contains()方法,是用于判断某个对象是否属于该集合中的元素
 * 它的原理是:
 *  1.遍历出该集合中的每一个元素,
 * 2.调用每一个元素的equals()方法,来判断该对象是否与该遍历出元素是否是同一个
 *          注意,这里说的是同一个对象,但在实际的场景中,是要判断对象中的内容是否一致,
 *          比如一个班级中,来了一个学生叫花花牛,需要给他定一个以姓名为准的称号,如果班级里
 *          已经有一个花花牛了,那么他的称号只能是 花花牛一,
 *          显然,equals()方法是比较对象的地址是否一样,显然不行,应该比较对象的的name的内容
 *          那么,这里就需要 改写 对象的 equals()方法了。详见 Student类中 重写的equals()方法。
 * @author SZQ
 *
 */
public class TestColContains {
static StudentCol sc = new StudentCol();
public static Scanner input;
public static void main(String[] args) {
        Student st1 = new Student(1, "花花牛");
        Student st2 = new Student(2, "小米");
        Student st3 = new Student(3, "李磊");
        Student st4 = new Student(4, "lucy");
        Student st6 = new Student(6, "花花牛");
        sc.studentSet.add(st1);
        sc.studentSet.add(st2);
        sc.studentSet.add(st3);
        sc.studentSet.add(st4);
        System.out.println("班级中已有的学生分别是");
        for(Student ss : sc.studentSet){
            System.out.println("学生是:"+ss.name);
        }

        System.out.println("请输入新学生的姓名:");
        input = new Scanner(System.in);
        String stuName = input.next();
        Student newStu = new Student(5, stuName);
        Iterator it = sc.studentSet.iterator();
        int count = 0;
        while(it.hasNext()){
            if(it.next().equals(newStu)){
                count++;
            }
        }
        if(count > 0)
            System.out.println("班级里已经存在了"+count+"个名字叫做"+newStu.name+"的同学");
        System.out.println("新学生的称号是"+newStu.name+count);
        main(args);
}

}

···

Student类,改写equals()方法

···

package cn.com.testCollection;
public class Student {
public int id;
public String name;

public Student(int id,String name) {
    // TODO Auto-generated constructor stub
    this.id = id;
    this.name = name;
}
/** 
 *重写equals()方法
 *
 */
@Override
public boolean equals(Object obj){
    //首先判断是不是同一个对象
    if(this == obj){
        return true;
    }
    //判断是不是null, 注意,传入的参数可以为null,但是调用方法的对象不能null,
    //否则会引起 空指针异常,也就不能调用改写的equals方法了。
    if(obj == null){
        return false;
    }
    if(!(obj instanceof Student)){
        return false;
    }
    /*
     * 既然不是同一个对象,不是null ,同时他也属于Student类的一个实例
     * 那么接下来只需要 判断它的内容----姓名 ,是不是一样 ,就行了
     */
    //先转换为 Student类的类型。
    Student st = (Student) obj;
    //判断name是不是空的
    //如果判断多个属性,比如id一样也作为判断条件,只需将下面的代码再比葫//芦画瓢写一遍就行了
    if(this.name == null){
        if(st.name == null){
            return true;
        }else{
            return false;
        }
    }else{
        if(this.name.equals(st.name)){
            return true;
        }else{
            return false;
        }
    }
}

}
···

存放学生类集合的类

···

package cn.com.testCollection;

import java.util.ArrayList;
import java.util.List;

public class StudentCol {
    public List<Student> studentList;
    public StudentCol() {
        // TODO Auto-generated constructor stub
        this.studentList = new ArrayList<Student>();
    }

}

···

可以试一试,将Student类中的equals()方法,注释掉,看看什么情况,其实,在Eclips中,提供了便捷的方法帮助我们重写equals方法,大家可以查查找找。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值