java HashSet

package com.tercher.demo;

import java.util.HashSet;
import java.util.Iterator;

public class HashSetDemo {
	public static void main(String[] args) {
		
		/*
		 * HashSet存放散列,当存储对象是:
		 *          先生成哈希码,调用方法:hashCode()
		 *          如果哈希码相同,则调用添加对象的equals()方法,对两个对象进行比较
		 *          默认的比较是比较对象的地址,对象的地址不同则可以添加
		 *          例:Student st = new Student("xiaowang1", 24);		
		 *          hs.add(st);
		 *          hs.add(st);此时值能添加一个
		 *          说明:HashSet集合在调用add()方法时会自动的调用hashCode()和对象的equals()
		 *          若对象没有重写equals()方法,则调用的默认的Object类中的方法(比较地址)
		 *          
		 *     需求:使得两个对象只要属性值全相同,即设定为同一元素,则不能存放
		 *     
		 *     步骤:1,建立新的HashSet集合,存放不能重复的元素
		 *                  2,重写Student类的HashCode()方法和equals()方法
		 *                  3,添加元素时的比较
		 *                  4,输出新集合的不重复元素的集合
		 */
		HashSet<Student>  hs = new HashSet<Student>();	
		hs.add(new Student("xiaowang", 20));
		hs.add(new Student("xiaowang1", 24));
		hs.add(new Student("xiaowang1", 24));
		hs.add(new Student("xiaowang2", 22));
		hs.add(new Student("xiaowang3", 26));
	 	 Iterator<Student> iter =  hs.iterator();
		while (iter.hasNext()) {
			 System.out.println(iter.next()); 
		}
		
		Student st = new Student("xiaowang1", 24);
		HashSet<Student>  newhs = new HashSet<Student>();
		newhs.add(st);
		newhs.add(st);
		newhs.add(new Student("xiaowang", 20));
		newhs.add(new Student("xiaowang1", 24));
		newhs.add(new Student("xiaowang1", 24));
		newhs.add(new Student("xiaowang2", 22));
		newhs.add(new Student("xiaowang3", 26));	
		System.out.println("重写后的HashSet:");
		Iterator<Student> it = newhs.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
		
	}
}

class Student{
	private String name;
	private int age;
	public Student(){
		
	}
	public Student(String name,int age){
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return  this.name+"-----"+this.age;
	}
	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;
	}
	
	/*
	 * 重写对象的两个方法()
	 * name.hashCode()  调用的是String类中的hashCode()方法,
	 * 比较的是字符串相同即为同一个哈希码
	 */
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		System.out.println(this.getClass().getName()+":"+name.hashCode());//当前对象的名字哈希码
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (!( obj instanceof Student)) {
			return false;//判断对象类型是否一样
		}
		Student stu = (Student) obj;
		System.out.println("比较的两个对象的name值:"+this.name+"---"+stu.name);
		return this.name.equals(stu.name) && (this.age == stu.age);
	}
	
	
}

  

原文地址:https://www.cnblogs.com/nn369/p/8024818.html