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()方法,才能进行排序。