Collection子接口之二:Set接口

2020-11-18 0 By admin

Set接口是Collection的子接口,set接口没有提供额外的方法。
Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败。
Set 判断两个对象是否相同不是使用 ==运算符,而是根据 equals()方法

一、Set接口介绍

1.1、Set接口实现类的对比

|----Collection接口:单列集合,用来存储一个一个的对象
  |----Set接口:存储无序的、不可重复的数据   -->高中讲的“集合”
    |----HashSet:作为Set接口的主要实现类;线程不安全的;可以存储null值
      |----LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历对于频繁的遍历操作,LinkedHashSet效率高于HashSet.
    |----TreeSet:可以按照添加对象的指定属性,进行排序。

1.2、Set的无序性与不可重复性的理解

  1. 无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。
  2. 不可重复性:保证添加的元素按照equals()判断时,不能返回true.即:相同的元素只能添加一个。
public void test(){
  Set set = new HashSet();
  set.add(123);
  set.add(456);
  set.add("fgd");
  set.add("book");
  set.add(new User("Tom",12));
  set.add(new User("Tom",12));
  set.add(129);
  Iterator iterator = set.iterator();
  while(iterator.hasNext()){
      System.out.println(iterator.next());
  }
}
###### User.java
public class User{
  private String name;
  private int age;
  public User() {
  }
  public User(String name, int age) {
      this.name = name;
      this.age = age;
  }
// setXX() 、getXX()
  @Override
  public boolean equals(Object o) {
      System.out.println("User equals()....");
      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;
      User user = (User) o;
      if (age != user.age) return false;
      return name != null ? name.equals(user.name) : user.name == null;
  }
  @Override
  public int hashCode() { 
      int result = name != null ? name.hashCode() : 0;
      result = 31 * result + age;
      return result;
  }
}