Set接口 (单列集合)

您所在的位置:网站首页 单列集合的根接口 Set接口 (单列集合)

Set接口 (单列集合)

2024-07-14 18:38| 来源: 网络整理| 查看: 265

Set接口是Java中Callection的子接口,用于存储一组无序,唯一的对象,其中常用的实现类有HashSet,LinkedHashSet,TreeSet

下面对Set中定义的三个实现类进行详细的讲解:

HashSet类

HashSet 是 Java 集合框架中的一个类,它实现了 Set 接口;HashSet 提供了一个不包含重复元素的集合;如果试图向 HashSet 添加重复元素,它将被忽略,确保集合中元素的唯一性

特点:

1. 不包含重复元素:如果尝试添加已存在的元素,HashSet 会忽略该操作。 2. 无序:HashSet 不保证元素的顺序。 3. 基于哈希表实现:HashSet 内部使用 HashMap 来存储元素;每个元素都是 HashMap 的一个键,而值是一个常量对象(例如 `PRESENT`)。 4. 性能:HashSet 提供了常数时间的添加、删除和查找操作,前提是哈希函数能够将元素均匀分布到各个桶中。

使用示例: import java.util.HashSet; public class LX1 { public static void main(String[] args) { // 创建一个新的HashSet HashSet set = new HashSet(); // 添加元素到HashSet set.add("Cherry"); set.add("Banana"); set.add("Apple"); set.add("Apple"); // 尝试添加重复的元素 // 输出HashSet的大小和内容 System.out.println("Size of set: " + set.size()); System.out.println("Elements in set: " + set); } }

输出:

注意:尽管我们尝试向 HashSet 中添加了两次 "Apple",但输出中只显示了一次,因为 HashSet 不包含重复元素,且元素的输入顺序与输出顺序也不相同

添加元素操作的底层原理:

当向 HashSet 添加自定义对象时,对象的 hashCode() 和 equals() 方法非常重要;hashCode() 方法决定了对象在 HashMap 中的存储位置(hashCode方法获得元素的哈希值,通过判断哈希值是否相等判断元素在数组中应该插入的位置),而 equals() 方法则用于判断两个对象是否相等;如果两个对象根据`equals() 方法是相等的,返回值为ture,说明有重复元素,则将要存入的重复元素舍弃,如果两个对象不相等,返回为false,则将该元素存入集合

由于 HashSet 是无序的,因此它不适合用于需要保持元素插入顺序的场景;对于这种情况,可以考虑使用 LinkedHashSet

HashSet添加元素是的方法重写 :

基于上述,我们可知,在集合中存入元素时,为保证集合的正常工作,要求在存入元素时对Object类中的hashCode()和equals()进行重写

重写如下:

import java.util.HashSet; import java.util.Objects; // 自定义类 class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } // 重写 hashCode 方法 @Override public int hashCode() { return Objects.hash(name, age); } // 重写 equals 方法 @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person person = (Person) obj; return age == person.age && Objects.equals(name, person.name); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class HashSetExample { public static void main(String[] args) { HashSet people = new HashSet(); // 添加自定义对象到 HashSet people.add(new Person("Alice", 25)); people.add(new Person("Bob", 30)); people.add(new Person("Alice", 25)); // 这个不会被添加,因为对象相等 // 打印 HashSet 中的元素 for (Person person : people) { System.out.println(person); } } } LinkedHashSet类

LinkedHashSet类是HashSet的一个子类,继承了HashSet的大部分方法,由于它使用了双链表来维护内部元素的关系,故其内部元素存储是有序的

代码演示:

import java.util.HashSet; import java.util.LinkedHashSet; public class LX1 { public static void main(String[] args) { // 创建一个新的HashSet LinkedHashSet set = new LinkedHashSet(); // 添加元素到HashSet set.add("Cherry"); set.add("Banana"); set.add("Apple"); set.add("Apple"); // 尝试添加重复的元素 // 输出HashSet的大小和内容 System.out.println("Size of set: " + set.size()); System.out.println("Elements in set: " + set); } }

输出结果:

如上可得,LinkedHashSet也保证了其内部元素的唯一性,但其中的元素是有序的,输出顺序与输入顺序一致 

TreeSet类

TreeSet类是Java中的一个集合类,它实现了SortedSet接口,内部采用二叉树来存储元素,这样的结构可以保证数组中没有重复元素,并且可以对元素进行重排序;TreeSet类的主要特点是它可以确保集合中的元素处于有序状态;这与HashSet类不同,因为HashSet类中的元素是无序的;

TreeSet类并不是根据元素插入的顺序来排序,而是根据元素实际的值的大小来排序;下面通过二叉树的元素存储过程来说明TreeSet中国存放元素的原理:当二叉树中存入新元素时,新元素会首先最顶层元素进行比较,若小于第一个元素就执行左边分支,继续与该分支的元素进行比较,反之若大于顶层元素则执行左分支,如此进行下去知道比较到最后一个元素,如果小于最后一个元素,则放置在最后一个元素的左分支上,反之,放置在最后一个元素的右分支上;

TreeSet的特有方法及有关代码

添加元素

boolean add(E e): 将指定的元素插入此集合(如果它尚未存在)。boolean addAll(Collection c): 移除此集合中那些也包含在指定集合中的所有元素。void clear(): 从此集合中移除所有元素。

查询元素

boolean contains(Object o): 如果此集合包含指定的元素,则返回 true。boolean containsAll(Collection c): 如果此集合包含指定集合中的所有元素,则返回 true。Iterator iterator(): 返回在此集合上的迭代器。

比较与排序

Comparator


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3