关键词:
引言
在前面的内容中,我们先是一一介绍了Collection集合中都有哪些种类的集合,并且详细地讲解了List集合中的相关知识,那么今天我们来详细地讲解一下Collection集合中的另外一个分支——Set系列集合。最后还是希望这一篇篇的文章能够对你在集合中的学习、Java中的学习起到一定的帮助作用,好了,闲话不多说直接步入正题吧。
概念
Set系类集合特点:
- 无序:存取顺序不一致
- 不重复:可以去除重复
- 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
Set集合实现类特点:
HashSet:无序、不重复、无索引
LinkedHashSet:有序、不重复、无索引
TreeSet:排序、不重复、无索引
Set集合的功能上基本上与Collection的API一致。
HashSet集合
HashSet集合:
Set<String> set = new HashSet<>(); set.add("石原里美"); set.add("石原里美"); set.add("工藤静香"); set.add("朱茵"); System.out.println(set); set.remove("朱茵"); System.out.println(set);
输出结果:
通过上述代码与运行结果,我们可以清晰地看出,HashSet集合无序、不重复的特性;
结合上述图片所示,可以看出HashSet集合是无法通过get()方法的索引获取数据的,并且在删除集合中的数据的时候,也只能通过定向的对数据进行删除。
LinkedHashSet集合:
LinkedHashSet集合:
Set<String> set = new LinkedHashSet<>(); set.add("石原里美"); set.add("石原里美"); set.add("工藤静香"); set.add("朱茵"); System.out.println(set); set.remove("朱茵"); System.out.println(set);
输出结果:
通过上述代码与输出结果做对比,即可看出无序与有序之间的区别,前者是会将传入的数据顺序打乱,而后者则是仍然按照输入数据的顺序存储数据,因此输出的时候是有序状态。
TreeSet集合:
TreeSet集合:
Set<Integer> set = new TreeSet<>(); set.add(13); set.add(23); set.add(23); set.add(11); System.out.println(set); set.remove(23); System.out.println(set);
输出结果:
通过上述代码和输出结果我们便可以通过字面意思去理解为什么TreeSet的特点是排序了,即将存储的数据按照Java默认的排序方式进行排序。
然而此时若存储自定义如People对象,TreeSet无法直接排序,会出现报错的情况!
//People类: public class People private String name; private int age; private String classroom; public People() public People(String name, int age, String classroom) this.name = name; this.age = age; this.classroom = classroom; public String getName() return name; public void setName(String name) this.name = name; public int getAge() return age; public void setAge(int age) this.age = age; public String getClassroom() return classroom; public void setClassroom(String classroom) this.classroom = classroom; @Override public String toString() return "People" + "name='" + name + '\'' + ", age=" + age + ", classroom='" + classroom + '\'' + ''; //main方法: public static void main(String[] args) Set<People> p = new TreeSet<>(); p.add(new People("张三",19,"智能")); p.add(new People("李四",18,"数据库")); p.add(new People("王五",20,"渗透")); System.out.println(p);
若想解决该问题,我们就需要为TreeSet集合自定义存储类型,现有两种方式可以解决该问题:一种是自定义类实现Comparable接口并重写里面的compareTo方法指定规则;另一种则是集合自带比较器对象进行规则定义。
方式一:自定义类实现Comparable接口重写里面的compareTo方法指定比较规则(多余无关紧要的代码在此不再赘述了,只展示重要的那部分代码)
//改变的第一个地方:实现Comparable类 public class People implements Comparable<People> //改变的第二个地方:重写Comparable类中的compareTo方法 @Override public int compareTo(People o) return this.age-o.age;
输出结果(根据年龄进行比较):
在重写的方法中,return后面的代码决定了该对象将要根据什么准则进行比较,比较规则如下:
- 如果认为第一个元素大于第二个元素返回正整数即可
- 如果认为第一个元素小于第二个元素返回负整数即可
- 如果认为第一个元素等于第二个元素返回0即可,此时Treeset集合只会保留一个元素,认为两者重复
方式二:集合自带比较器对象进行规则定义
Set<People> p = new TreeSet<>(new Comparator<People>() @Override public int compare(People o1, People o2) return o1.getAge()-o2.getAge(); );
在原来的基础之上对集合的创建作出改变,并且其比较准则与前面的定义方法类似,相对前面的方式,这种方式会更加方便快捷一些。在此,我们也可以回顾一些前面所学到的知识“Lambda表达式”,对给代码块进行化简。
Set<People> p = new TreeSet<>((o1, o2) -> o1.getAge()-o2.getAge());
如果没有学习过Lambda表达式,或者说是对Lambda表达式的知识不清晰,那么可以可以看Java中的lambda表达式如何理解——精简这篇文章的讲解,或许会对你有所帮助的。
实战场景
- 元素可以重复、又有索引、索引查询速度快
使用ArrayList集合,基于数组
- 元素可以重复、又有索引、增删首尾操作快
使用LinkedList集合,基于链表
- 增删查改快,但是元素不重复、无序、无索引
使用HashSet集合,基于哈希表
- 增删查改快,但是元素不重复、有序、无索引
使用LinkedHashSet集合,基于哈希表和双链表
- 需要对对象进行排序
使用TreeSet集合,基于红黑树,后续也可以使用List集合实现
创作不易,给个三连吧
java中的多线程如何理解——精简(代码片段)
目录引言线程安全 实战模拟 线程同步 方式一:同步代码块 方式二:同步方法 方式三:Lock锁 线程池 线程池处理Runnable任务 线程池处理Callable任务 Executors的工具类构建线程池对象 引言 通过前面的学习... 查看详情
java中的io流如何理解——精简(代码片段)
目录引言缓冲流 字节缓冲流 字符缓冲流 转换流 字符输入转换流 字符输出转换流 序列化和反序列化 对象序列化 对象反序列化 打印流 Properties 引言通过前面的简单学习,我们已经能够大致了解了关于文件的操作ÿ... 查看详情
java中的lambda表达式如何理解——精简(代码片段)
✌️✌️✌️在写之前,我在考虑是否要写这篇文章,然而当我查阅“lambda表达式”的相关内容的时候,我发现大量的文章都出现了冗余的现象,文章的篇幅过于夸张,严重影响了大家阅读的兴趣,因此我... 查看详情
《深入理解es6》之set集合与map集合
...含有一些相互独立的非重复,通过Set集合可以快速访问其中的数据,更有效地追踪各种离散值。创建Set集合并添加元素 调用newSet()创建Set集合,调用add()方法向集合添加元素,访问集合的size属性可以获取集合中目前的元素数... 查看详情
java中的set,list,map的区别
参考技术A 对JAVA的集合的理解是想对于数组 数组是大小固定的并且同一个数组只能存放类型一样的数据(基本类型/引用类型) JAVA集合可以存储和操作数目不固定的一组数据 所有的JAVA集合都位于javautil包中! ... 查看详情
java零基础小白学习免费教程day14-set&hashmap(代码片段)
day14_JAVAOOP课程目标1.【理解】Set集合的特点2.【理解】Set集合不重复的原理3.【掌握】HaseSet集合的基本使用4.【理解】LinkedHashSet的特点5.【理解】Map集合的特点6.【掌握】HashMap的使用7.【理解】LinkedHashMap的特点8.【掌握】Map集合的... 查看详情
java零基础小白学习免费教程day14-set&hashmap(代码片段)
day14_JAVAOOP课程目标1.【理解】Set集合的特点2.【理解】Set集合不重复的原理3.【掌握】HaseSet集合的基本使用4.【理解】LinkedHashSet的特点5.【理解】Map集合的特点6.【掌握】HashMap的使用7.【理解】LinkedHashMap的特点8.【掌握】Map集合的... 查看详情
java集合框架要点概括(coreknowledgeofjavacollection)
目录有哪些集合类Set类Queue类List类Map类HashMap的实现原理,是否线程安全,如何使其做到线程安全HashMap的实现原理HashMap的线程安全问题本文主要参考:《疯狂Java讲义精简版》-李刚HashMap实现原理分析有哪些集合类一图终结Set,Que... 查看详情
day16java语言中的----set集合
day16java语言中的----set集合一、集合【collection】概述: 这里我们就开始学习一下set集合,我们就说三个集合,分别是set/list/map三种,他们都是接口,list和set集合都是collection主接口的子接口,map集合与主接口就... 查看详情
java中如何找出两个集合中的不重复的元素
循环第一个集合,在第二个集合中查找,就可以将第一个集合的数据分成,两类,1类是再第二个集合有的,一类是在第二个集合中没有的。这样,才把第二个集合中有的作为一个新集合,循环第二个集合的时候只需要对比就行... 查看详情
尚硅谷_java零基础教程(集合collection:list,set;map)--学习笔记(代码片段)
...合框架概述1.理解2.集合框架涉及到的API二、Collection接口中的方法三、Iterator迭代器接口1.理解2.主要方法3.foreach四、Collection子接口一:List接口1.概述2.List接口的常用实现类3.接口方法五、Collection子接口二:Set1.概述2.Set接... 查看详情
1125937650(代码片段)
...a核心编程技术(第二版)》中是这样介绍java集合的:java中的集合框架提供了一套设计优良的接口和类,使程序员操作成批的数据或对象元素极为方便。这些接口和类有很多对抽象数据类型操作的API,这是我们常用的且在数据结... 查看详情
java中的set集合
...List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,它是比Collection接口更加严格了。与List接口不同的是,Set接口元素无序,并且都会以某种规则保证存入的元素... 查看详情
java中list与set有啥区别?
...对象本身。Java集合主要分为三种类型:a.Set(集):集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类能对集合中的对象按特定方式排序。b.List(列表):集合中的对象按索引位置排序,可以有重复对象,允... 查看详情
java中的集合有几种
...的引用,而非对象本身,为了说起来方便些,我们称集合中的对象就是指集合中对象的引用(reference)。引用的概念大家不会忘了吧,在前边我们讲数据类型时讲的。集合类型主要有3种:set(集)、list(列表)、map(映射)和Queue(队... 查看详情
如何检查对象是不是是Java中的集合类型?
】如何检查对象是不是是Java中的集合类型?【英文标题】:HowtocheckifanObjectisaCollectionTypeinJava?如何检查对象是否是Java中的集合类型?【发布时间】:2011-02-0817:55:31【问题描述】:通过使用java反射,我们可以很容易地知道一个对... 查看详情
《深入理解java集合框架》系列文章
...板库(StandardTemplateLibrary,STL)的书籍和资料有很多,关于Java集合框架(JavaCollectionsFramework,JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦。我深深的不解其中的原因。虽然JCF设计参考了STL... 查看详情
在java中,set集合和list集合有啥相同点和不同点???
...你有所帮助Set(集合): Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 Set介面主要实现了两个实现类: HashSet : HashSet类按照哈希演算法来存取集合中的对象,存取速度比较快... 查看详情