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);
}
}
}