集合框架-HashSet儲存字串、自定義物件並遍歷

ZHOU_VIP發表於2017-04-26

package cn.itcast_02;

import java.util.HashSet;

/*
 * 需求:儲存自定義物件,並保證元素的唯一性
 * 要求:如果兩個物件的成員變數值都相同,則為同一個元素。
 * 
 * 目前是不符合我的要求的:因為我們知道HashSet底層依賴的是hashCode()和equals()方法。
 * 而這兩個方法我們在學生類中沒有重寫,所以,預設使用的是Object類的。
 * 這個時候,他們的雜湊值是不會一樣的,根本就不會繼續判斷,執行了新增操作。
 *
 *	
 */
public class HashSetDemo2 {
	public static void main(String[] args) {
		// 建立集合物件
		HashSet<Student> hs = new HashSet<Student>();

		// 建立學生物件
		Student s1 = new Student("林青霞", 27);
		Student s2 = new Student("柳巖", 22);
		Student s3 = new Student("王祖賢", 30);
		Student s4 = new Student("林青霞", 27);
		Student s5 = new Student("林青霞", 20);
		Student s6 = new Student("范冰冰", 22);

		// 新增元素
		hs.add(s1);
		hs.add(s2);
		hs.add(s3);
		hs.add(s4);
		hs.add(s5);
		hs.add(s6);

		// 遍歷集合
		for (Student s : hs) {
			System.out.println(s.getName() + "---" + s.getAge());
		}
	}
}


package cn.itcast_02;
/**
* @author Administrator
* 重寫hashCode()和equals()方法
*/
public class Student {
    private String name;
    private int age;
    
    public Student() {
        // TODO Auto-generated constructor stub
    }
    
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }


    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    
    
}


//以下程式碼都不用自己寫,可以自動生成
@Override
public int hashCode() {
    return 0;
    // 因為成員變數值影響了雜湊值,所以我們把成員變數值相加即可
    // return this.name.hashCode() + this.age;
    // 看下面
    // s1:name.hashCode()=40,age=30
    // s2:name.hashCode()=20,age=50
    // 儘可能的區分,我們可以把它們乘以一些整數
    return this.name.hashCode() + this.age * 15;
}

@Override
public boolean equals(Object obj) {
    System.out.println(this + "---" + obj);
    if (this == obj) {
        return true;
    }

    if (!(obj instanceof Student)) {
        return false;
    }

    Student s = (Student) obj;
    return this.name.equals(s.name) && this.age == s.age;
}

HashSet儲存自定義物件並遍歷:


package cn.itcast_03;

import java.util.HashSet;

/*
 * HashSet集合儲存自定義物件並遍歷。如果物件的成員變數值相同即為同一個物件
 * 
 * 注意了:
 * 		你使用的是HashSet集合,這個集合的底層是雜湊表結構。
 * 		而雜湊表結構底層依賴:hashCode()和equals()方法。
 * 		如果你認為物件的成員變數值相同即為同一個物件的話,你就應該重寫這兩個方法。
 * 		如何重寫呢?不同擔心,自動生成即可。
 */
public class DogDemo {
	public static void main(String[] args) {
		// 建立集合物件
		HashSet<Dog> hs = new HashSet<Dog>();

		// 建立狗物件
		Dog d1 = new Dog("秦檜", 25, "紅色", '男');
		Dog d2 = new Dog("高俅", 22, "黑色", '女');
		Dog d3 = new Dog("秦檜", 25, "紅色", '男');
		Dog d4 = new Dog("秦檜", 20, "紅色", '女');
		Dog d5 = new Dog("魏忠賢", 28, "白色", '男');
		Dog d6 = new Dog("李蓮英", 23, "黃色", '女');
		Dog d7 = new Dog("李蓮英", 23, "黃色", '女');
		Dog d8 = new Dog("李蓮英", 23, "黃色", '男');

		// 新增元素
		hs.add(d1);
		hs.add(d2);
		hs.add(d3);
		hs.add(d4);
		hs.add(d5);
		hs.add(d6);
		hs.add(d7);
		hs.add(d8);

		// 遍歷
		for (Dog d : hs) {
			System.out.println(d.getName() + "---" + d.getAge() + "---"
					+ d.getColor() + "---" + d.getSex());
		}
	}
}


package cn.itcast_03;

public class Dog {
	private String name;
	private int age;
	private String color;
	private char sex;

	public Dog() {
		super();
	}

	public Dog(String name, int age, String color, char sex) {
		super();
		this.name = name;
		this.age = age;
		this.color = color;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((color == null) ? 0 : color.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + sex;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Dog other = (Dog) obj;
		if (age != other.age)
			return false;
		if (color == null) {
			if (other.color != null)
				return false;
		} else if (!color.equals(other.color))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (sex != other.sex)
			return false;
		return true;
	}

}


相關文章