set集合的特性与详细介绍


在这里插入图片描述

1.set集合的特点

一.Java中的Set集合是一种无序的、不重复的集合,它实现了Java集合框架中的Set接口,常用的实现类有HashSet、TreeSet和LinkedHashSet。

1.具体来说,Java中的Set集合有以下特点:

2.无序性:Set集合中的元素是无序的,不能通过下标或者位置来访问元素。

3.元素唯一性:Set集合中的元素是唯一的,不会存在重复的元素。

4.可变性:Set集合的元素可以被增加、删除或者修改,因此是可变的。

5.哈希表实现:Java中的HashSet是通过哈希表来实现的,因此Set集合的插入、查询和删除操作都具有较快的速度。

6.线程不安全:Set集合不是线程安全的,如果需要在多线程环境下使用,需要进行同步处理。

7.支持数学中的集合运算:Set集合支持并集、交集、差集等运算,方便我们进行集合的操作。

8.不允许重复元素:Set集合中不允许重复元素的存在,当试图添加重复元素时,新元素不会被添加进集合中。

9.元素无序性:由于Set集合中元素的存储是无序的,遍历Set集合时获取元素的顺序是不确定的。
总之,Set集合的特点包括元素唯一且无序,支持集合运算,哈希表实现,线程不安全等。在开发过程中,根据实际需求选择适当的Set集合实现类即可

2.set集合遍历

一.在Java中,遍历Set集合有多种方式:

1.`使用for-each循环遍历

Set<String> set = new HashSet<>();
// 添加元素
set.add("apple");
set.add("banana");
set.add("orange");

// 遍历
for(String s : set){
    System.out.print(s + " ");
}

2.使用迭代器遍历

Set<String> set = new HashSet<>();
// 添加元素
set.add("apple");
set.add("banana");
set.add("orange");

// 使用迭代器遍历
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
    String s = iterator.next();
    System.out.print(s + " ");
}

3.使用Java8 Stream API遍历

Set<String> set = new HashSet<>();
// 添加元素
set.add("apple");
set.add("banana");
set.add("orange");

// 使用Stream API遍历
set.stream().forEach(System.out::print);

以上三种方法都可以用来遍历

3.set集合去重

1.Set集合的去重原理基于哈希表。在Java中,HashSet的实现机制就是通过哈希表来实现的。当我们向HashSet集合中插入元素时,HashSet会将元素进行哈希运算,并将得到的哈希值作为数组的下标,将元素存储到数组中。如果发现该位置已经有元素存在,HashSet会判断新元素和已有元素是否相等,如果相等,则新元素不会被添加,否则会继续进行下一个哈希运算。当数组中的元素数量达到一定的程度(默认阈值为0.75),HashSet会自动扩容,并重新计算哈希值,重新分配位置,以确保数组的空间能够存储所有的元素。

因此,HashSet集合在向其中添加元素时,会先计算元素的哈希值,然后将其与已有元素的哈希值进行比较,如果相等,则HashSet会认为这两个元素相等,新元素不会被添加。通过这种方式,我们就达到了Set集合去重的目的。

需要注意的是,元素相等并不仅仅是值相同,根据Java中的规定,两个对象equals()方法返回true时,HashSet才会认为这两个对象相等。因此,如果需要自定义对象的去重,需要覆写其equals()方法和hashCode()方法。

2.我们可以通过一个简单的示例代码来论证Set集合的去重原理:

import java.util.HashSet;
import java.util.Set;

public class SetDemo {

  public static void main(String[] args) {

    // 创建一个HashSet集合
    Set<String> set = new HashSet<>();

    // 添加元素到集合中
    set.add("apple");
    set.add("banana");
    set.add("apple");

    // 输出集合中的元素
    System.out.println(set); // [banana, apple]
  }
}

上述代码中,我们创建了一个HashSet集合,并向其中添加了三个元素,分别是"apple"、“banana"和"apple”。如果Set集合的去重机制不起作用,那么我们在输出集合元素的时候,应该会看到两个"apple",但是,最终输出的结果是[banana, apple],只有一个"apple"。

这是因为,当我们向Set集合中添加"apple"元素时,HashSet会先计算"apple"的哈希值。假设这个哈希值为x,那么HashSet会将这个元素存储在数组的第x个位置。接着,当我们向Set集合中添加第二个"apple"元素时,HashSet会再次计算其哈希值,假设这个哈希值为y,由于x和y值相等,HashSet便认为这两个元素相等,不会将第二个"apple"元素添加进集合中。因此,最终输出的结果中只有一个"apple"。

4. set集合排序

1.Set集合并不保证元素的顺序,因此无法进行排序。如果需要对元素进行排序,则需要使用有序的Set集合,例如TreeSet或LinkedHashSet。

TreeSet排序
TreeSet通过红黑树实现,对插入的元素按照一定规则进行排序,因此可以通过TreeSet对Set集合的元素进行排序。当向TreeSet中添加元素时,TreeSet会自动调用元素的compareTo()方法(如果元素实现了Comparable接口),或者指定的Comparator接口的compare()方法来进行比较,将元素按照升序排列(默认情况下)。

Set<Integer> set = new TreeSet<>(); 
set.add(10); 
set.add(5); 
set.add(3); 
set.add(7); 
System.out.println(set); // [3, 5, 7, 10]

2.LinkedHashSet排序
LinkedHashSet继承自HashSet,不同的是,它保留元素的插入顺序,因此可以按照插入顺序进行排序。可以使用Collections.sort()方法对LinkedHashSet中的元素进行排序。

Set<String> set = new LinkedHashSet<>(); 
set.add("apple"); 
set.add("banana"); 
set.add("orange"); 
List<String> list = new ArrayList<>(set); 
Collections.sort(list); 
System.out.println(list); // [apple, banana, orange]

需要注意的是,容器的元素需要实现Comparable接口,或者在排序时指定Comparator接口的compare()方法,才能进行排序。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值