Set接口 | 带你学《Java语言高级特性》之一百零四

简介: 本节介绍了Set接口继承关系以及特征,介绍了两个常用的子类:HashSet、TreeSet的使用。

上一篇:Vector子类 | 带你学《Java语言高级特性》之一百零三
【本节目标】
本节介绍了Set接口继承关系以及特征,介绍了两个常用的子类:HashSet、TreeSet的使用。

Set接口

Set集合最大的特点就是不允许保存重复元素,其也是Collection子接口。

在JDK1.9以前Set集合与Collection集合的定义并无差别,Set继续使用了Collection接口中提供的方法进行操作,但是从JDK1.9后,Set集合也像List集合一样扩充了一些static方法,Set集合的定义如下:

public interface Set<E> extends Collection<E>

需要注意的是Set集合并不像List集合那样扩充了许多的新方法,所以无法使用List集合中提供的get()方法,也就是说无法实现指定索引数据的获取,Set接口的继承关系如下。

image.pngSet接口继承关系

从JDK1.9后,Set集合也提供了像List集合中类似的of()的静态方法。下面就使用此方法进行Set集合特点的验证。
范例:验证Set集合特征

import  java.util.Set;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        //进行Set集合数据的保存,并设置有重复的内容
       Set<String> all=Set.of("Hello","World","MLDN","Hello","World");
       all.forEach(System.out::println);    //直接输出
       //Exception in thread "main" java.lang.IllegalArgumentException: duplicate element: Hello
    }
}

当使用of()这个新方法的时候,如果发现集合中存在重复元素则会直接抛出异常。这与传统的Set集合不保存重复元素的特点相一致,只不过自己抛出了异常而已。

Set集合的常规使用形式一定是依靠子类进行实例化的,所以Set接口之中有两个常用的子类:HashSet、TreeSet。

HashSet子类

HashSet是Set接口中使用最多的一个子类,其最大的特点就是保存的数据是无序的,而HashSet子类的继承关系如下:

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable

这种继承的形式和之前的ArrayList是非常相似的,那么现在来观察一下类的继承结构:

image.png
HashSet子类

范例:观察HashSet类

import java.util.HashSet;
import  java.util.Set;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
       Set<String> all = new HashSet<String>();
       all.add("MLDN");
       all.add("NiHao");
       all.add("Hello");
       all.add("Hello");   //重复元素
       all.add("World");
       all.forEach(System.out::println);
    }
}
/**
* NiHao
* Hello
* World
* MLDN
*/

通过执行结果就可以发现HashSet的操作特点:不允许保存重复元素(Set接口定义的),另外一个特点就是HashSet中保存的数据是无序的。

TreeSet子类

Set接口的另外一个子接口就是TreeSet,与HashSet最大区别在于TreeSet集合里面保存的数据是有序的,首先来观察TreeSet类的定义:

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable

在这个子类中依然继承了AbstractSet父抽象类,同时又实现了一个NavigableSet父接口。

image.png
TreeSet

范例:使用TreeSet子类

import java.util.TreeSet;
import  java.util.Set;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
       Set<String> all = new TreeSet<String>();
       all.add("MLDN");
       all.add("NiHao");
       all.add("Hello");
       all.add("Hello");   //重复元素
       all.add("World");
       all.forEach(System.out::println);
    }
}
/**
* Hello
* MLDN
* NiHao
* World
*/

当利用TreeSet保存数据的时候,所有的数据将按照数据的升序进行自动排序处理。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:TreeSet子类排序操作 | 带你学《Java语言高级特性》之一百零五
更多Java面向对象编程文章查看此处

相关文章
|
4天前
|
Java 开发者
探索 Java 的函数式接口和 Lambda 表达式
【4月更文挑战第19天】Java 中的函数式接口和 Lambda 表达式提供了简洁、灵活的编程方式。函数式接口有且仅有一个抽象方法,用于与 Lambda(一种匿名函数语法)配合,简化代码并增强可读性。Lambda 表达式的优点在于其简洁性和灵活性,常用于事件处理、过滤和排序等场景。使用时注意兼容性和变量作用域,它们能提高代码效率和可维护性。
|
5天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
5天前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
6 0
Java接口中可以定义哪些方法?
|
5天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
35 10
|
7天前
|
设计模式 Java
Java接口与抽象类
Java接口与抽象类
15 0
|
10天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。
|
11天前
|
安全 Java 编译器
接口之美,内部之妙:深入解析Java的接口与内部类
接口之美,内部之妙:深入解析Java的接口与内部类
33 0
接口之美,内部之妙:深入解析Java的接口与内部类
|
13天前
|
存储 Java
java接口和内部类
java接口和内部类
|
14天前
|
缓存 安全 Java
Java中函数式接口详解
Java 8引入函数式接口,支持函数式编程。这些接口有单一抽象方法,可与Lambda表达式结合,简化代码。常见函数式接口包括:`Function&lt;T, R&gt;`用于转换操作,`Predicate&lt;T&gt;`用于布尔判断,`Consumer&lt;T&gt;`用于消费输入,`Supplier&lt;T&gt;`用于无参生成结果。开发者也可自定义函数式接口。Lambda表达式使实现接口更简洁。注意异常处理和线程安全。函数式接口广泛应用于集合操作、并行编程和事件处理。提升代码可读性和效率,是现代Java开发的重要工具。
26 0
|
15天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
39 0

热门文章

最新文章