惠州网站建设方案报价,在局域网建设网站,网站实名制认证备案,国内免费域名申请作者#xff1a;孙玉昌#xff0c;昵称【一一哥】#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言
在上一篇文章中#xff0c;壹哥带大家学习了List集合的用法和特性#xff0c;尤其是对ArrayList和L… 作者孙玉昌昵称【一一哥】另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言
在上一篇文章中壹哥带大家学习了List集合的用法和特性尤其是对ArrayList和LinkedList了解的更多一些。但Java中还有Set和Map集合等待我们学习所以接下来就请各位继续跟壹哥来学习今天的内容吧。在本文中壹哥会详细地给大家介绍Set集合的定义、特点、常用方法和基本原理等内容。
---------------------------------------------前戏已做完精彩即开始-------------------------------------------
全文大约【4000】字不说废话只讲可以让你学到技术、明白原理的纯干货本文带有丰富的案例及配图视频让你更好地理解和运用文中的技术概念并可以给你带来具有足够启迪的思考......
配套开源项目资料 GithubGitHub - SunLtd/LearnJava Gitee一一哥/从零开始学Java 一. Set集合简介 1. Set定义
Set是Java的一种集合继承自Collection接口主要有两个常用的实现类HashSet类和TreeSet类。它没有固定的大小限制可以动态地添加和删除元素。并且Set集合中的元素都是唯一的不会有重复的元素即使是null值也只能有一个。另外Set集合是无序的不能记住元素的添加顺序因为没有索引值所以Set集合中的对象不会按特定的方式排序它只是简单地把对象放到集合中。
从特性上来看Set相当于是一个只存储key、不存储value的Map。我们可以把Set想象成是一个”特殊的Map“这个Map只有key却没有value所以我们可以用Set去除重复的元素。另外由于放入Set的元素和Map的key类似需要正确地实现equals()和hashCode()方法否则该元素就无法正确地放入Set。
2. Set特性
与其他集合不同Set集合具有自己的一些特性 Set集合中的元素都是唯一的不允许有重复值且最多只允许包含一个null元素Set集合中的元素没有顺序我们无法通过索引来访问元素但TreeSet是有序的Set集合没有固定的大小限制可以动态地添加和删除元素Set集合提供了高效的元素查找和判断方法。 3. Set常用方法
Set集合给我们提供了一系列常用的方法用于添加、删除、查找、遍历和获取集合元素等操作下面是Set集合中常用方法的实现过程。
3.1 添加元素
我们可以使用add()方法进行元素的添加。
public boolean add(E e)
该方法用于向Set集合添加元素如果元素已经存在则不会添加如果添加成功则返回true否则返回false。该方法的示例代码如下
SetString set new HashSet();
set.add(hello word);
set.add(java);
set.add(iOS);
System.out.println(set);
3.2 删除元素
我们可以使用remove()方法进行元素的删除。
public boolean remove(Object o)
该方法用于从Set集合中删除指定的元素。如果元素存在且删除成功则返回true否则返回false。该方法的示例代码如下
SetString set new HashSet();
set.add(hello word);
set.add(java);
set.remove(java);
System.out.println(set); // 输出结果为[壹壹哥]
3.3 判断元素
我们可以使用contains()方法进行元素的判断。
public boolean contains(Object o)
该方法用于判断Set集合中是否包含指定的元素。如果元素存在则返回true否则返回false。该方法的示例代码如下
SetString set new HashSet();
set.add(hello word);
set.add(java);
System.out.println(set.contains(java)); // 输出结果为true
System.out.println(set.contains(orange)); // 输出结果为false
3.4 获取元素数量
我们可以使用size()方法判断集合的数量。
public int size()
该方法的使用示例代码如下
SetString set new HashSet();
set.add(hello word);
set.add(java);
System.out.println(set.size()); // 输出结果为2
4. 配套视频
与本节内容配套的视频链接如下
External Player - 哔哩哔哩嵌入式外链播放器
二. HashSet集合
1. 简介
在Java的集合框架中HashSet是一种非常常用的集合类型它实现了Set接口并继承了AbstractSet抽象类。HashSet集合的底层实现是一个哈希表它使用哈希算法来存储和管理集合中的元素。HashSet集合中的元素没有顺序且不允许重复。
如果我们想使用HashSet集合一般要使用如下两个构造方法创建出HashSet对象 HashSet()构造一个新的空的Set集合对象HashSet(Collection? extends E c)构造一个包含指定Collection集合元素的新Set集合。 中的extends表示这个Collection中的元素必须继承自HashSet的父类该部分限定了Collection元素的类型。 2. HashSet特性
HashSet作为Set集合的具体子类具有以下特点 HashSet的底层是基于HashMap来实现的HashSet中的元素是唯一的内部不允许有重复的元素无序不会记录插入元素的顺序所以不能保证元素的排列顺序获取顺序可能与添加顺序不同HashSet集合没有固定的大小限制可以动态地添加和删除元素HashSet集合中的元素最多可以有一个null值HashSet不是线程安全的默认线程不同步如果有多个线程同时访问或修改同一个HashSet必须通过代码来保证同步操作。 3. 去重原理
从底层实现来看HashSet的底层其实就是一个值为Object的HashMap如下图所示 所以HashSet其实就是按照Hash算法来实现元素的查找和存储的具有很好的存取和查找性能。当我们向HashSet集合中存入一个元素时HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值然后根据该hashCode值决定该对象在HashSet中的存储位置。此时如果有两个元素通过equals()方法进行比较返回的结果为true但它们的hashCode却不相等HashSet也会把它们存储在不同的位置我们依然可以添加成功。也就是说如果两个对象的hashCode值相等且通过equals()方法比较返回的结果也为true HashSet集合才会认为两个元素相等。
与本节内容配套的视频链接如下
External Player - 哔哩哔哩嵌入式外链播放器
4. 使用案例
我们通过一个简单的案例来看看HashSet的基本用法。
import java.util.HashSet;/*** author 一一哥Sun*/
public class Demo11 {public static void main(String[] args) {//创建HashSet集合HashSetString set new HashSetString();set.add(一一哥);set.add(壹壹哥);set.add(java);//重复元素无法被添加进去set.add(java);System.out.println(set);//集合遍历IteratorString it set.iterator();while (it.hasNext()) {//输出Set集合中的每个元素System.out.println(值it.next()); }}
}
在上面的代码中我们通过HashSet的构造方法创建了一个Set集合对象并将几个元素对象存储到了这个Set集合中。然后我们使用HashSet类中的iterator()方法获取一个Iterator对象并调用hasNext()方法遍历集合元素再使用next()方法获取到下一个数据元素。但是HashSet输出的元素是无序的输出时既不是添加元素的顺序也不是String排序的顺序在不同版本的JDK中这个顺序可能也是不同的。另外因为Set是不可重复的如果我们向Set集合中添加了两个相同的元素则后添加的会覆盖前面添加的元素所以Set集合中不会出现相同的元素。
5. 配套视频
与本节内容配套的视频链接如下
External Player - 哔哩哔哩嵌入式外链播放器
三. TreeSet集合
1. 简介
TreeSet是一种很常用的集合类型它实现了Set和SortedSet接口并且继承自AbstractSet抽象类。TreeSet集合中的元素也是唯一的不允许重复。TreeSet集合的底层基于红黑树可以使用自然排序或指定的比较器对集合中的元素进行排序。该类具有如下特点 TreeSet集合中的元素是唯一的不允许重复。TreeSet集合中的元素是有序的因为实现了SortedSet接口具有字典顺序可以通过迭代器按照升序或降序遍历。TreeSet集合没有固定的大小限制可以动态地添加和删除元素。TreeSet集合提供了高效的元素查找和判断功能。 另外SortedSet接口是Set接口的子接口能够对集合进行自然排序因此TreeSet类默认情况下就是自然排序(升序)的。但TreeSet只能对实现了Comparable接口的类对象进行排序所以我们使用TreeSet集合存储对象时该对象必须要实现Comparable接口。这是因为Comparable接口中有一个compareTo(Object o)方法可以比较两个对象的大小。例如a.compareTo(b)如果 a 和 b 相等则该方法会返回 0如果 a 大于 b则该方法返回大于 0 的正值如果 a 小于 b则该方法返回小于 0 的负值。
2. 常用方法
除了Set类中通用的方法之外TreeSet类还有如下几个特有的方法 方法名称 说明 E first() 返回该集合中的第一个元素E表示返回元素的数据类型 E last() 返回该集合中的最后一个元素 E poolFirst() 获取并移除该集合中的第一个元素 E poolLast() 获取并移除该集合中的最后一个元素 SortedSetE subSet(E fromElement,E toElement) 返回一个新的集合新集合会包含源集合fromElement与目标集合toElement之间的所有对象。结果会包含fromElement对象但不包含toElement对象。 SortedSetE headSetE toElement〉 返回一个新的集合新集合包含原集合中toElement对象之前的所有对象但不包含 toElement对象。 SortedSetE tailSet(E fromElement) 返回一个新的集合新集合包含原集合中fromElement对象之后的所有对象会包含fromElement对象。
因为TreeSet中的元素是有序的所以增加了访问第一个、前一个、后一个、最后一个元素的相关方法并提供了3个从 TreeSet中截取子TreeSet的方法。
3. 去重原理
当TreeSet集合在保存对象元素时集合对象必须实现Comparable接口并重写compareTo方法该方法有如下两个作用 排序: 返回值大于0表示升序返回值小于0表示降序去重(返回值为0)TreeSet认为返回0表示两个对象是相同的对象。 所以我们利用TreeSet实现去重的原理就是如果compareTo()方法的返回值为0则认为是相同的对象如果compareTo()方法的返回大于0则是升序排序如果小于0则是降序排序。
4. 使用案例
接下来我们再通过一个案例来看看TreeSet的用法。
4.1 编写Person类
首先我们设计一个Person类该类要实现Comparable接口。当TreeSet集合在保存对象元素时集合中添加的元素对象必须实现Comparable接口并重写compareTo方法。如果没有实现Comparable接口那么创建TreeSet时必须传入一个Comparator对象。
/*** author 一一哥Sun* 实现Comparable接口并重新compareTo()方法*/
public class Person implements ComparablePerson{private String username;private String password;public Person() {}public Person(String username, String password) {super();this.username username;this.password password;}Overridepublic String toString() {return User [username username , password password ];}//重写compareTo()方法,对Person对象进行比较Overridepublic int compareTo(Person o) {if(!this.username.equals(o.username)) {//根据姓名及长度进行比较return this.username.length() - o.username.length();}else {//根据密码进行比较if(this.password.equals(o.password)) {return 0;}else {//比较姓名的长度return this.username.length() - o.username.length();}}}
}
与本节内容配套的视频链接如下
External Player - 哔哩哔哩嵌入式外链播放器
4.2 测试TreeSet排序功能
然后我们往TreeSet集合中添加若干个对象元素进行排序测试代码如下
import java.util.TreeSet;/*** author 一一哥Sun*/
public class Demo12 {public static void main(String[] args) {//TreeSet的去重原理TreeSetPerson set new TreeSetPerson();set.add(new Person(admin,123));set.add(new Person(yyg,bb));set.add(new Person(jack,123));set.add(new Person(rose123,123));set.add(new Person(admin,123)); set.add(new Person(xksss6,abc));//如果两个对象的用户名和密码都相等则认为是两个相同的对象且按照名字长度升序存放for (Person person : set) {System.out.println(person);}}
}
我们在遍历TreeSet时输出的元素是有序的这个顺序是元素的排序顺序。但是我们在使用TreeSet进行自然排序时只能向 TreeSet 集合中添加相同数据类型的对象否则会抛出 ClassCastException异常。如果向 TreeSet集合中添加了一个 Double类型的对象则后面只能添加 Double对象不能再添加其他类型的对象例如 String对象等。
5. 配套视频
与本节内容配套的视频链接如下
External Player - 哔哩哔哩嵌入式外链播放器
-----------------------------------------------正片已结束来根事后烟---------------------------------------------
四. 结语
至此壹哥就带各位把Set集合及其子类学习完了现在你学会了吗本文的重点内容如下所示 Set用于存储不重复的元素集合放入HashSet的元素与作为HashMap的key要求相同放入TreeSet的元素与作为TreeMap的Key要求相同利用Set可以去除重复元素遍历SortedSet时可以按照元素的排序顺序进行遍历我们也可以自定义排序算法 另外如果你独自学习觉得有很多困难可以加入壹哥的学习互助群大家一起交流学习。
五. 今日作业
请实现如下需求
有5名学生参加考试老师录入每名学生的成绩后程序会按照从低到高的排列顺序显示学生成绩。
另外老师还可以查询本次考试是否有满分、不及格的学生及90分以上的学生有几名。