1.Main1.java

import java.util.HashSet;
import java.util.Set;

public class Main1 {
	/**
	 * 1 : Set
	 * 1.完全集成Collection的方法,没有自己新增的方法
	 * 2.元素不能重复,允许有一个null
	 * 3.Set是无序的,不会按照添加的顺序去排序
	 * 4.关于判断每个对象元素是否相等,使用的是equals方法,每加入一个元素,就遍历一遍集合
	 *   两个User对象user1(1,"小明")和user2(1,"小明")因为就算属性都相同,内存地址也不相同,但是equals调用的方法是比较内存地址
	 *   因此如果想人为修改判断条件让user1和user2相同,需要重写父类的equals方法
	 *   但是因为add源码追踪看到还有hashcode的比较,因此还有重写hashcode方法
	 *   
	 * */
	public static void main(String[] args) {
		/**
		 * 1.创建一个HashSet的集合
		 * */
		Set<String> set=new HashSet<String>();
		set.add("赵1");
		set.add("赵2");
		set.add("赵3");
		set.add("赵1");				// 重复元素会被剔除
		set.add(null);				// 允许null值
		set.add(null);				// 允许null值
		System.out.println(set);	// [null, 赵2, 赵1, 赵3]
		
		/**
		 * 2.判断对象是否重复
		 * */
		Set<User> s2=new HashSet<User>();
		s2.add(new User(1,"小明"));
		s2.add(new User(2,"小红"));
		s2.add(new User(1,"小明"));
		
		/* System.out.println(s2);  
		 * 单独重写 equals 让然是有重复的
		 * [User [id=1, name=小明], User [id=1, name=小明], User [id=2, name=小红]]
		 * */
		
		System.out.println(s2);
		/*
		 * 重写 equals + hashCode 方法后,就可以去除重复对象了
		 * [User [id=1, name=小明], User [id=2, name=小红]]
		 * */
	}

}


2.User.java

public class User {
	private int    id;
	private String name;
	
	// 1.传一个带参数的构造法方法
	public User(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

	// 2.重写toString方法
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + "]";
	}

	// 3.重写equals方法
	@Override
	public boolean equals(Object obj) {
		// 3.1先判断传入的obj是否是User类型
		if(!(obj instanceof User)) {
			return false;
		}else {
			// 3.2父类强转换为子类,因为父类不能使用子类特有的属性和方法
			User user=(User) obj;
			if(id==user.id &&
				name!=null && user.name!=null &&
				name.equals(user.name)) {
				return true;
			}else {
				return false;
			}
		}
	}

	// 4.因为重写equals方法,同步的要修改hashCode方法
	@Override
	public int hashCode() {
		return 1;
	}

}