set集合的特性与详细介绍

简介: 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月前
|
存储 NoSQL 关系型数据库
Redis 集合(Set)
10月更文挑战第17天
41 5
|
2月前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
47 6
|
2月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
34 2
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
52 3
|
2月前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
35 3
|
28天前
set集合
HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素。 LinkedHashSet: LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。 TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)。
|
1月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
1月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
1月前
|
Java 开发者
|
2月前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
40 4