集合--set

简介: 集合--set



一 set集合结构及特点

    结构:

特点:

   1.1 无序的 元素不能正确的排序

   1.2 无重复 元素内容不能重复

  1.3 无索引 证明没有下标不能进行修改操作

案例:

public class Demo1 {
   public static void main(String[] args) {
      Set  hs= new HashSet<>();//实例化set集合
      hs.add("aa");//向set集合中添加元素
      hs.add("哈哈哈");
      hs.add("我是高手");
      hs.add("cc");
      hs.add("嗡嗡嗡");
      hs.add("嗡嗡嗡");//此cc元素添加不了 特点不可重复 
      for (Object object : hs) {
        System.out.println(object);
      }
  }
}

                                                           控制台运行结果:

可以看到输出结果是4个,并没有输出重复值。所以,得出特点1,2:不能重复并且无序

注意set集合特点与list集合特点相反。

二: Set的遍历方式(两种)

 2.1 foreach遍历

 2.3 iterator(迭代器)

两种案例:

public class Demo2 {
   public static void main(String[] args) {
      HashSet  hs= new HashSet<>();//实例化set集合
      hs.add("aa");//向set集合中添加元素
      hs.add("bb");
      hs.add("cc");
       /**
        * foreach 循环方式遍历set
        */
      for (Object object : hs) {
      System.out.println(hs);
      }
      System.out.println("=========================");
      /**
       * iterator(迭代器)遍历方式 
       */
      Iterator it = hs.iterator();
        while(it.hasNext()) {
          System.out.println(it.next());
        }
  }
}

运行结果

注意:不能使用for循环,Set集合不能单独取值,因为没有下标。

三:Set集合的去重原理

3.1原理

        HashSet集合底层原理调用HashCode方法与equals方法进行比较

3.2优先级别

         先调用HashCode进行元素判断比较(每次比较元素都会调用一次HashCode方法进行               比较) 如果元素相同(如果不理解请看下面控制台输出噢)

          后比较equals方法判断进行判断元素内容是否一致

   注意:List与Set去重原理不一样 List只需要重写equals,HashSet要重写HashCode及                   equals两种方法

去重案例:

public class Demo3 {
  public static void main(String[] args) {
    HashSet hs = new HashSet<>();// 实例化set集合
    hs.add(new Person(1, "小花"));// 向set集合中添加元素
    hs.add(new Person(2, "小名"));// 向set集合中添加元素
    hs.add(new Person(3, "小明"));// 向set集合中添加元素
    System.out.println(hs.contains(new Person(3, "小明")));//
//    hs.add(new Person(3, "小明"));
    // System.out.println(hs);
  }
}
class Person {
  private int id;
  private String name;
  public Person() {
    // TODO Auto-generated constructor stub
  }
  public Person(int id, String name) {
    super();
    this.id = id;
    this.name = name;
  }
  @Override
  public String toString() {
    return "Person [id=" + id + ", 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;
  }
    //重写hashCode方法
  @Override
  public int hashCode() {
    System.out.println("hashCode被调用了... ");
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
  }
    //重写equals方法
  @Override
  public boolean equals(Object obj) {
    System.out.println("equals被调用了... ");
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    Person other = (Person) obj;
    if (id != other.id)
      return false;
    if (name == null) {
      if (other.name != null)
        return false;
    } else if (!name.equals(other.name))
      return false;
    return true;
  }
}

控制台运行:

  提示:会发现上面控制台调用了四次HashCode方法。因为每次HashCode方法每次都会一次一次的去底层数据去进行比较,如果一致会再调用equals方法进行比较 返回true或false

四:Comparable(自然排序)和Comparator(比较器排序)

  4.1 Comparable排序

     想要自然排序要进行实体实现comparable(lang包中)接口并重写其中的方法并返回return         值想要排序的数据

  • this比较元素对象是进行升序
  • 元素对象比较this的进行降序

    最后最后实例化TreeSet 进行自然排序

注意:如果直接实例化TreeSet会报错 因为没有实现comparable并重写里面的方法哦!

实操代码:

public class Demo4 {
  public static void main(String[] args) {
    System.out.println("==============系统默认排序==无规则排序===========");
    HashSet hs = new HashSet<>();// 实例化set集合
    hs.add(new Person1(1, "老牛", 22, 12444));// 向set集合中添加元素
    hs.add(new Person1(2, "老王", 23, 12345));
    hs.add(new Person1(3, "老六", 24, 54331));
    hs.add(new Person1(4, "老四", 30, 34141));
    // 默认 底层set默认排序
    for (Object object : hs) {
      System.out.println(object);
    }
    System.out.println("===============自然排序==============");
    // 实列自然排序
    TreeSet ts = new TreeSet<>();
    for (Object object : hs) {
      ts.add(object);//将系统排序添加到自然排序
    }
    //重新遍历自然排序
    for (Object object : ts) {
      System.out.println(object);
    }
  }
}
class Person1 implements Comparable<Person1> { //person1继承自然排序接口    最下面必须重写comparable方法
  private int id;
  private String name;
  private int age;
  private int money;
  public Person1() {
    // TODO Auto-generated constructor stub
  }
  public Person1(int id, String name, int age, int money) {
    super();
    this.id = id;
    this.name = name;
    this.age = age;
    this.money = money;
  }
  @Override
  public String toString() {
    return "Person1 [id=" + id + ", name=" + name + ", age=" + age + ", money=" + money + "]";
  }
  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;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public int getMoney() {
    return money;
  }
  public void setMoney(int money) {
    this.money = money;
  }
  @Override
  public int compareTo(Person1 o) {//重写Comparable方法
    return   this.age - o.age; //
  }
}

运行结果:

4.2Comparator(比较器排序)

   4.2.3比较器说明

    能对多个对象数据进行排序

    4.2.3使用方法

      比较器进行排序在自然排序流程后面需要同时使用,实列自然排序TreeSet再匿名实列           比较器(如下图)重写compare方法

   

4.2.3匿名实列比较器

实操代码

public class Demo4 {
  public static void main(String[] args) {
    System.out.println("==============系统默认排序==无规则排序===========");
    HashSet hs = new HashSet<>();// 实例化set集合
    hs.add(new Person1(1, "老牛", 22, 12444));// 向set集合中添加元素
    hs.add(new Person1(2, "老王", 23, 12345));
    hs.add(new Person1(3, "老六", 24, 54331));
    hs.add(new Person1(4, "老四", 30, 34141));
    // 默认 底层set默认排序
    for (Object object : hs) {
      System.out.println(object);
    }
    System.out.println("===============自然排序==============");
    // 实列自然排序
    TreeSet ts = new TreeSet<>();
    for (Object object : hs) {
      ts.add(object);//将系统排序添加到自然排序
    }
    //重新遍历自然排序
    for (Object object : ts) {
      System.out.println(object);
    }
    System.out.println("==============比较器排序==先金额排序后年龄排序=========");
    TreeSet tsPlusvip = new TreeSet<>(new Comparator<Person1>() {//自然排序实现比较器接口
      @Override // 重写比较器中方法
      public int compare(Person1 o1, Person1 o2) {
        //按金额比相同 
         int num = o2.getMoney() - o1.getMoney();
         if(num==0) {//判断如果金额等于0
            return o1.getAge() - o2.getAge();//就按年龄比相同
         }
        return num;//继续按照金额比相同 返回金额
      }
    });
    for (Object object : hs) {
      tsPlusvip.add(object);
    }
    for (Object object : tsPlusvip) {
      System.out.println(object);
    }
  }
}
class Person1 implements Comparable<Person1> { //person1继承自然排序接口    最下面必须重写comparable方法
  private int id;
  private String name;
  private int age;
  private int money;
  public Person1() {
    // TODO Auto-generated constructor stub
  }
  public Person1(int id, String name, int age, int money) {
    super();
    this.id = id;
    this.name = name;
    this.age = age;
    this.money = money;
  }
  @Override
  public String toString() {
    return "Person1 [id=" + id + ", name=" + name + ", age=" + age + ", money=" + money + "]";
  }
  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;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public int getMoney() {
    return money;
  }
  public void setMoney(int money) {
    this.money = money;
  }
  @Override
  public int compareTo(Person1 o) {//重写Comparable方法
    return   this.age - o.age; //
  }
}

运行控制台:

   注意:如果要进行多个数据排序的话,要进行判断,如上图是优先根据金额排序后                            排序年龄的

这就是小编给大家整理的一些Set集合内容 感谢观看!

 

目录
相关文章
|
25天前
|
存储 NoSQL 关系型数据库
Redis 集合(Set)
10月更文挑战第17天
36 5
|
26天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
36 6
|
26天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
32 2
|
28天前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
27 3
|
11天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
11天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
11天前
|
Java 开发者
|
26天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
26 4
|
28天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
25 5
|
29天前
|
Java 开发者
在Java的集合世界里,Set以其独特的特性脱颖而出,它通过“哈希魔法”和“红黑树防御”两大绝技
【10月更文挑战第13天】在Java的集合世界里,Set以其独特的特性脱颖而出。它通过“哈希魔法”和“红黑树防御”两大绝技,有效抵御重复元素的侵扰,确保集合的纯洁性和有序性。无论是“人海战术”还是“偷梁换柱”,Set都能从容应对,成为开发者手中不可或缺的利器。
31 6

热门文章

最新文章