小学生级别Java笔记_无序集合Set接口下的两个类HashSet和TreeSet_2019/6/10

1. HashSet集合是如何约束集合中对象不重复的
通过重写实体类的hashCode() 方法和equals(Object obj) 方法
当两个实体对象hashCode()相同时,自动调用equals(Object obj) 判断是否相同。若两次判断都相等,则add(元素)失败。
以下是常见的hashCode() 方法和equals(Object obj) 方法重写:

class User{//实体类
	String username;
	String passwd;
	public User(String username, String passwd) 
	{
		super();
		this.username = username;
		this.passwd = passwd;
	}
		@Override
	public int hashCode() 
	{//return一个对象的两个String成员的hashcode()值
	 //因为String类的hashcode()是与字符串内容相关的
		return this.username.hashCode() + this.passwd.hashCode();
	}
	@Override
	public boolean equals(Object obj)//参数是一个Object类对象
	 {
		User user = (User)obj;//把obj转成User类,将参数中的对象和调用者属性比较,return各项属性是否相等的boolean值
		return (this.username.equals(user.username))&&(this.passwd.equals(user.passwd));
	}
}
public class Demo4 {//main方法所在类
	public static void main(String[] args) {
		HashSet users = new HashSet();
		User user = new User("小明","123");
		if(users.add(user)){//Set集合的add返回值象征着元素是否重复
			System.out.println("用户添加成功");
		}else{
			System.out.println("添加失败,用户已存在");
		}
	}
}

2. TreeSet集合是如何约束集合中对象不重复的
TreeSet在添加元素前,会判断元素的值,是否与集合中既有元素值相同。
若元素值具有自然顺序(如int、double)则add元素时自动判断大小并排序。
若元素值不具有自然顺序,如用有多项属性的User类,则可以指定多项属性中的一项作为元素的关键值, add比较关键值对集合排序。
以下是自定义比较器类,并用比较器对象作为参数创建TreeSet集合的常见写法:

class User{
	String name;
	int salary;
	@Override
	public String toString() {
		return "User [name=" + name + ", salary=" + salary + "]";
	}
	public User(String name, int salary) {
		super();
		this.name = name;
		this.salary = salary;
	}
	
}

class AgeComparator implements Comparator{

	@Override
	public int compare(Object o1, Object o2) {
		User user1 = (User)o1;
		User user2 = (User)o2;
		return user1.salary - user2.salary;
	}
	
}

public class Demo5 {
	public static void main(String[] args) {
		AgeComparator comparator = new AgeComparator();
		TreeSet<User> tree = new TreeSet<User>(comparator);
		
		tree.add(new User("汪明陆", 1000));
		tree.add(new User("汪明", 100));
		tree.add(new User("汪陆", 1090));
		
		for(User item : tree)
		{
			System.out.println(item);
		}
	}
}
发布了33 篇原创文章 · 获赞 4 · 访问量 2188

猜你喜欢

转载自blog.csdn.net/weixin_44981510/article/details/91797704