set接口

本文深入探讨了Set接口及其两种主要实现类HashSet和TreeSet的特点。HashSet由哈希表支持,不保证迭代顺序,允许null元素,而TreeSet则基于元素的自然顺序或自定义Comparator进行排序。

Set接口
set接口是继承自Collection的子接口,特点是元素不重复,存储无序。
在set接口的实现类中添加重复元素是不会成功的,判断两个元素是否重复根据元素类重写的hashCode()和equals()方法。

  Set<String> stu1 = new HashSet<String>();
  stu1.add("ab");
  stu1.add("ac");
  stu1.add("bc");
  stu1.add("ba");
  stu1.add("ba");
  for (String s : stu1) {
   System.out.println(s);
  }

1、实现类HashSet
HashSet实现 Set 接口,由哈希表(底层由 HashMap 实现)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。HashSet保证元素唯一。

2、实现类TreeSet
TreeSet基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
排序方式完全取决于使用的构造方法。
使用元素的自然顺序对元素进行排序(自然排序)

public class student  {
   private String name;
   private String id;
   public student (String name,String id) {
    this.name=name;
     this.id=id;
   }
   public String tostring () {
 return id+":"+name;
   
   }
   public int hashcode(){
 return id.hashCode();
   
   }
   public boolean eqials(Object obj) {
      if(this==obj) 
    return true;
      
      return false;
   }
}
  public class example {
    public static void main(String[] args) {
   HashSet<student> set=new HashSet<student>();
    student stu1=new student("1","jack");
    student stu2=new student("2","rose");
    student stu3=new student("1","jack");
    set.add(stu1);
    set.add(stu2);
    set.add(stu3);
    System.out.println(set);
    }
   }
### Set 接口特点 `Set` 接口是 Java 集合框架的重要组成部分,它继承自 `Collection` 接口,并定义了一个允许包含重复元素的集合。其核心特性包括: - **元素唯一性**:`Set` 中允许存在重复元素,确保每个元素在集合中唯一[^4]。 - **无序性**:大多数 `Set` 实现(如 `HashSet`)保证元素的存储顺序与插入顺序一致,但某些实现(如 `LinkedHashSet`)会维护插入顺序[^4]。 - **高效查找**:由于 `Set` 通常基于哈希表或红黑树实现,因此提供了高效的查找、插入和删除操作,平均时间复杂度为 O(1) 或 O(log n)[^2]。 - **null 元素支持**:`Set` 允许插入一个 `null` 元素,但允许重复插入多个 `null`。 以下是一个使用 `HashSet` 的简单示例: ```java import java.util.HashSet; import java.util.Set; public class SetDemo { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("Apple"); set.add("Banana"); set.add("Cherry"); set.add("Apple"); // 重复元素会被添加 System.out.println(set); } } ``` --- ### Set 接口与 List 接口的区别 | 特性 | Set 接口 | List 接口 | |--------------------|--------------------------------------|---------------------------------------| | **元素唯一性** | 元素重复 | 允许重复元素 | | **顺序性** | 默认无序(某些实现维护插入顺序) | 有序,插入和取出顺序一致 | | **索引访问** | 支持通过索引访问元素 | 支持通过索引访问和修改元素 | | **null 元素数量** | 只允许一个 null 元素 | 允许多个 null 元素 | | **常用实现类** | `HashSet`、`LinkedHashSet`、`TreeSet` | `ArrayList`、`LinkedList`、`Vector` | | **查找效率** | 通常比 List 更快 | 查找效率较低,尤其是链表实现 | 例如,`HashSet` 基于哈希表实现,查找效率高,而 `ArrayList` 基于数组实现,适合随机访问,但在中间插入或删除效率较低。 --- ### 使用场景对比 - **Set 接口适用场景**:适用于需要确保元素唯一性、快速查找和去重的场景。例如,存储用户集合、检查重复数据等。 - **List 接口适用场景**:适用于需要维护元素顺序、允许重复元素、支持索引访问的场景。例如,记录日志、保存有序数据等。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值