1. 程式人生 > >在使用集合中的contains(),要根據實際情況改寫集合中物件的equals(Object obj)方法------改寫List集合中equals(Object obj)的方法

在使用集合中的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方法,大家可以查查詢找。