Java中的set集合是什么意思
作者:石原里美的微笑 发布时间:2023-02-02 15:40:31
引言
在前面的内容中,我们先是一一介绍了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集合实现
来源:https://blog.csdn.net/weixin_50635856/article/details/124806587


猜你喜欢
- <FrameLayout &
- 悲观锁、乐观锁简介: 悲观锁:同步操作。即用户A在操作某条数据时,为其上锁,限制其他用户操作,用户A操作完成提交事务后其他用户方可
- (一)首先说Unity调用页面方法的办法。首先是需要在工程的Asset目录里面建一个Plugins文件夹,然后在文件夹里面创建一个.txt文
- SpringBoot访问html和js等静态资源配置把静态资源放到resources/static下,这是springboot静态资源默认访
- 本文实例为大家分享了C#实现多个计时器记录不同定时时间的具体代码,供大家参考,具体内容如下1.定义Timer类、定义委托//定义Timer类
- 本文实例为大家分享了Java Web实现简易图书管理系统的具体代码,供大家参考,具体内容如下前言首先实现的是用户的登录注册,注册成功后自动跳
- 前段时间学习JDBC,要连接mysql获取数据。按照老师的样例数据,要存一些名字之类的信息,用的都是英文名,我当时就不太想用英文,就把我室友
- Java语言的历程丰富多彩,被现在众多程序员和企业广泛使用,不用质疑这是Java的领先技术的结果。Java是Sun公司开发的一种编程语言,S
- 前言工作中是否遇到这样的场景?1、需要异步线程执行,而且需要获取到线程执行返回的结果。2、如果执行过程异常,可以按照自定义方式消费异常信息。
- 一、项目简述功能: 主页显示商品; 所有二手书商品展示,可进行商品搜索; 点击商品进入商品详情页,具有立即购买和加入购物车功能,可增减购买商
- 这篇文章主要介绍了Java并发CopyOnWrite容器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 前言博主之前有写过关于递归问题的思维模式:递归的思路下面将用这种思维模式来求解经典汉诺塔问题。一、问题描述汉诺塔(又称河内塔)问题是源于印度
- 本文实例为大家分享了使用ContentProvider实现查看系统短信功能的具体代码,供大家参考,具体内容如下activity_main.x
- 使用范围: 只能作用在方法和构造函数之上@SneakyThrows注解的作用得从java的异常设计体系说起。java中常见的异常有两种:Ex
- 本文实例为大家分享了Android实现文字下方加横线的具体代码,供大家参考,具体内容如下public class WhiteTextview
- 前言ps命令的作用是显示进程信息的。|符号,是个管道符号,表示左右两边两个命令同时执行。grep命令是查找(Global Regular E
- 本文实例讲述了Android控件之TabHost用法。分享给大家供大家参考。具体如下:以下通过TabHost实现android选项卡。mai
- 前言之前实现过《Android可签到的日历控件》的功能,跟这篇一样都是实现签到打卡功能,这篇实现的是按月进行打卡做标识,本篇内容实现的按周进
- FastDFS 的作者余庆先生已经为我们开发好了 Java 对应的 SDK。这里需要解释一下:作者余庆并没有及时更新最新的 Java SDK
- C#配置文件操作类,供大家参考,具体内容如 * 意添加引用:System.Configuration;using System; using