疯狂Java系列之Set集合

疯狂JavaEE系列整合资料 资源包括前端HTML5、CSS、javaScript、以及JAVAEE开发,是李刚老师的疯狂系列 立即下载

可以把set看成一个罐子,里面的元素就是多个对象无序的组合。

如果这个罐子是一个装有不同颜色的球,而罐子并不能做到给球编号或排顺序,你要想拿到红色的球,但是里面有很多红色的球,是根本确定不了,你到底要拿哪一个红色的球



Set的实现类有:hashSet类、LinkedhashSet类、Treeset类、EnumSet类,不全部说明,只拿出两个比较常用的类来介绍一下。

hashSet类

HashSet是Set接口典型实现,大部分使用set集合就是用的这个类。HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。

特点:

1、不能保证元素的排序;

2、hashset不是同步的,如果多个线程同时访问HashSet,必须通过代码来保证其同步;

3、集合元素值可以为null;

 

        当向hashSet集合存入一个元素时,HashSet会调用Hashcode()方法,返回这个元素的hashcode值,然后根据code值决定其在hashSet中的位置。

 

代码:

package Set;

import java.util.HashSet;

public class hashSetTest {

	public static void main(String[] args) {
		HashSet person = new HashSet();
		person.add(new A());
		person.add(new A());
		person.add(new B());
		person.add(new B());
		person.add(new C());
		person.add(new C());
		System.out.println(person);
	}
	
	
}

class A
{
	public boolean equals(Object obj){
		//类A的equals()方法总是返回true
		return true;
	}
}
class B
{
	public int hashCode()
	{
		//类B的hashcode()方法总是返回1
		return 1;
	}
}
class C
{
	//类C的hashcode()方法总是返回2,equals()方法返回true
	public int hashCode()
	{
		return 2;
	}
	public boolean equals()
	{
		return true;
	}
}


结果:


总结:分别添加两个A对象,B对象,C对象,只有A类中,两个对象值相等,但是hashcode值不相等,这样造成的结果是会判断两个对象是不相等,可以存储在两个位置上,和Set集合规则冲突。所以如果重写对象对应类的equals方法时,也应该重写hashCode()方法。

     HashSet判断两个元素相等的标准是通过两个对象equals()方法比较对象相同,然后hashcode值也相等,满足这两个条件。两个元素就是相同的。因为如果hashcode值不同,两个元素是会被放到两个不同的位置的。不满足Set不允许相同对象。所以hashCode还有一个作用就是表示一个元素的唯一,根据hashcode值快速找到元素的存储位置。

 

TreeSet

TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。看看它的方法:

Comparator comparator():采用定制排序,返回定制排序所使用的comparator;如果采用自然排序,则返回null;

Sorted subset(ObjectfromElement,Object toElement):返回Set子集合,范围从from到to;

Sorted headSet(ObjecttoElement):返回子集合,由小于toElement元素组成;

Sorted tailSet(ObjectfromElement):返回子集合,由大于fromElement元素组成。

 

代码:

package Set;

import java.util.TreeSet;

public class TreeSetTest {

	public static void main(String[] args) {
		TreeSet nums=new TreeSet();
		//添加元素
		nums.add(3);
		nums.add(10);
		nums.add(1);
		nums.add(-2);
		
		//输出集合元素,从运行结果看,已经进行了排序
		System.out.println(nums);
		
		System.out.println(nums.first());//第一个元素
		System.out.println(nums.last());//最后一个元素
		
		System.out.println(nums.headSet(3));//返回小于3的子集,不包含3
		System.out.println(nums.tailSet(3));//返回大于3的子集,包含3
		
		System.out.println(nums.subSet(-5, 11));//返回大于-5,小于11的子集
	}
}


结果:


总结:treeSet并不跟插入顺序进行排序,而是根据实际的元素值进行排序。



Set实现类的性能分析

HashSet和treeSet是Set的典型实现类,那么到底选择哪个用好呢?

hashSet的性能比TreeSet的好,因为TreeSet需要使用红黑树算法来维护集合元素的次序,只有需要保持排序的Set时,才应该用TreeSet,否则都用HashSet;

HashSet还有一个子类,LinkedHashSet,对于普通的插入、删除操作,L比H略慢,因为它需要维护额外的链表,但是因为有链表,LinkedhashSet会更快。

EnumSet是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素。

保证线程安全

必须指出,HashSet、TreeSet、EnumSet都是线程不安全的。如果多个集合访问Set集合,并且有超过一个线程修改了该Set集合,必须手动保证该Set集合的同步性。

可以通过Collections工具类的synchronizeSortedSet方法来包装该Set集合。

例如

SortedSet s =Collections.synchronizeSortedSet(new TreeSet());


蜕变的路并不好走,也走的不快,但是只要不放弃,就在一点点前进,并且现在所有学到的东西,都会在未来某一天找到它的使命,加油!



0基础学习diffusion_model扩散模型【易理解的公式推导】Denoising Diffusion Probabilistic Models 去噪扩散概率模型。本文是笔者在学习扩散模型时的一些笔记与心得,在公式推导过程中能够保证自己是一步一步去推导并且理解了的。概述是我认为比较重要的部分能够帮助理解公式的推导,具体的公式推导在每一小节中进行。1、扩散过程:如上图所示,扩散过程为从右到左X0→XTX0​→XT​的过程,表示对图片逐渐加噪,且Xt1X_{t+1}Xt1​是在XtX_{t}Xt​加躁得到的,其只受XtX_{t}Xt​的影响,因此扩散过程是一个马尔科夫过程。X0X_0。 阅读详情

相关推荐

基于JavaFX的Http Server模拟器

源码地址 GitHub - DayRain/http-server-simulator: http server 模拟器 功能描述 HttpServer模拟器,通过简单的配置即可模拟第三方服务端,用于接收和响应HTTP请求。 支持同时模拟多个服务、动态添加接口、动态配置返回值。 使用说明 运行 exe运行 编译代码后,点击exe直接运行 代码运行 下载好代码后,运行主类ApplicationStarter即可 新建服务 主界面如下 点击 文件-新建 创建新的服务 ...

小楼夜听雨的博客 2535

疯狂java系列_疯狂Java系列之List集合

List集合代表一个有序、可重复的集合,每个元素都有对应顺序的索引。 List继承示意图List接口新增一些方法,针对它的增加、索引、删除、替换等集合元素的方法。代码:package List;import java.util.ArrayList;import java.util.List;public class ListTest {public static void main(String[...

weixin_32012539的博客 865

【嵌入式笔试题】C语言笔试题(4)

嵌入式C语言综合笔试题

m0_74055118的博客 1067

Java常用集合之Set

Java常用集合之Set

m0_62609939的博客 4788

Ollama本地大模型部署指南:从核心原理到实战避坑

大语言模型(LLM)作为人工智能领域的核心技术,通过海量数据训练获得强大的语言理解和生成能力。其工作原理基于Transformer架构,通过自注意力机制处理序列数据,在文本生成、代码编写和对话系统等场景展现出巨大价值。随着开源模型的普及,本地部署成为关注焦点,它解决了数据隐私和定制化需求,但面临环境配置和资源管理的挑战。Ollama作为开源工具,通过封装模型格式和统一API,简化了本地部署流程,支持GPU加速和性能调优,让开发者能够快速集成到IDE和自动化脚本中,实现高效的本地AI应用部署。

weixin_30915951的博客 452

SAP 对接CBS(http方式)

CLEAR:lv_xml_crc32_string. CONCATENATEcrc32_passwordcrc32_keyi_stringINTOlv_xml_crc32_string. CONDENSElv_xml_crc32_string. CALLFUNCTION'SCMS_STRING_TO_XSTRING' EXPORTING text=lv_xml_crc32_string encoding='8400' "GB...

3598

Java集合框架(set篇)

set集合的特点:set集合的遍历不像集合遍历一样是三种遍历方式了,而是两种:我们为什么要去重,因为如果是添加一个普通的一个元素的话set集合本身是可以去重的,但是如果你是添加一个对象的话他就不能去重了,为什么?因为每个对象他不是同一个地址,所以不能去重,再最后在工作的时候会用别人写的set集合的方法,你不可能叫别人去写,所以是需要自己去写的,所以才需要写set集合的去重。例如,我们可以创建一个HashSet对象用于去重,然后将多个元素添加进去: 最终的Set中只包含3个元素,分别是"apple"、“ban

无法自律的人的博客 3908

从贝叶斯网络到结构因果模型:因果推理在可解释AI中的实践

在机器学习和数据分析领域,理解变量间的因果关系而不仅仅是统计关联,是构建可信赖、可解释系统的关键。概率图模型,特别是贝叶斯网络,通过有向无环图和条件概率表,能够高效地编码和推理变量间的条件依赖关系,广泛应用于医疗诊断、风险评估等场景。然而,贝叶斯网络主要刻画的是“是什么”的关联,难以回答“如果…会怎样”的因果问题。为了进行因果推断,需要引入结构因果模型和do-演算,它们通过定义结构方程和模拟干预操作,能够区分混杂效应,估计处理变量对结果变量的净因果影响。这一套方法论对于可解释人工智能至关重要,它能生成反事实

weixin_42168902的博客 379

记单词(set)

蒜头君快要考托福了,这几天,蒜头君明天早上都起来记英语单词。花椰妹时不时地来考一考蒜头君:花椰妹会询问蒜头君一个单词,如果蒜头君记过这个单词,蒜头君会很快告诉花椰妹这个单词的意思,不然蒜头君会告诉花椰妹没有记过,单词是由连续的大小写或者字母组成。注意单词中字母大小写是等价的。比如You和you是一个单词。 输入格式 首先输入一个n(1<=n<=100000)表示事件数。接下来n行,每行...

Anterior_condyle的博客 425

一文搞懂YOLO各版本差异:v5易用、v8多任务、v10低延迟,该怎么选?

YOLOv5的“易用”是为了降低入门门槛,适合新手启蒙和旧项目维护;YOLOv8的“多任务”是为了满足工业需求,成为目前的主流版本;YOLOv10的“低延迟”是为了适配边缘计算,代表未来的发展趋势。选型的核心不是“选最新的”,而是“选最适合自己场景的”。记住选型口诀,按场景对号入座,就能避开99%的坑。希望这篇文章能帮你彻底搞懂各版本差异,选对属于自己的YOLO版本!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1169

DeepLabv3+改进专栏

🔥【DeepLabv3+改进专栏!探索语义分割新高度】🌟 你是否在为图像分割的精度与效率发愁?📢 本专栏重磅推出:✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化✅ 即插即用模块:ASPP+升级、解码器。

AIcurator的博客 2576

Java基础之Set

Java基础之Set

qq_45344586的博客 1万+

Aip1640、TM1640驱动程序

本文介绍了AIP1640/TM1640驱动芯片的编程实现,主要包括硬件接口定义和通信协议函数。通过宏定义配置时钟(CLK)和数据线(DIO)的GPIO控制,实现了I2C协议的启动、停止、字节发送等基本操作。核心函数AIP1640_Disp_Drive()完成显示驱动流程:先发送0x40命令设置地址自增模式,再发送0xC0起始地址和16字节显示数据,最后设置亮度参数。文中还包含5微秒延时函数、显示数据缓冲区定义,以及LED和数码管(SMG)的位映射注释说明。该代码适用于控制LED数码管显示,支持亮度调节功能。

zqx的博客 1403

疯狂Java系列之j集合类

为了存储多个数据,或对象的引用变量 集合类主要负责保存、盛装其他数据,所以也称为容器类。 集合类有两个派生接口:Collection、Map Collection     Collection接口中的方法 Set、List、Queue三种集合都是来自于父接口,所以C的方法可以用来操作三种集合。 boolean add(Object o):向集合中添加元素; boolean ad

好记性不如烂笔头--玲博小记 1136

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Set集合

Set集合 Set集合与Collection基本上完全一样,它没有提供任何额外的方法。实际上Set就是Collection,只是行为略有不同(Set不允许包含重复元素)。 Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add方法返回false,且新元素不会被加入。 Set判断两个对象相同不是使用==运算符,而是根据equals方法。 public class SetTest { public static void main(String[] ar

xy87940020的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java集合——Set

一、综述 \quadSet集合包含三个常用的类——HashSet, TreeSet, EnumSet,这三个类各有特色,使用场景不同。这里先讨论Set集合的通用特性: Set集合与Collection基本一样,没有提供额外的方法,只是行为不同 Set集合不允许有相同的元素,如果试图把两个相同的元素加入一个Set集合则添加操作失败,add方法将返回false Set判断两个对象相同不是使用==运算...

qq_40438165的博客 1483

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

《疯狂java讲义》学习(28):Set集合

Set集合 Set集合与Collection基本上完全一样,它没有提供任何额外的方法。实际上Set就是Collection,只是行为略有不同(Set不允许包含重复元素)。 Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add方法返回false,且新元素不会被加入。 Set判断两个对象相同使用equals方法。也就是说,只要两个对象使用equals方...

泛泛之素 992

Java11 集合总结 Set List

Java集合 文章目录Java集合Collection接口方法遍历集合使用Lambda表达式遍历集合使用iterator遍历集合元素使用Lambda表达式遍历Iterator使用foreach循环遍历集合元素使用Predicate操作集合Streamset集合HashSetLinkedHashSetTreeSetEnumSet各Set实现类的性能分析List集合List接口 Collection接口 Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可用操作Set集合,

qq_42551917的博客 978

疯狂Java讲义-Java集合

Java集合 本章思维导图 Java集合概述 为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。 集合和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上只是保存对象的引用变量)。 Java的集合类主要由两个接口派生而出:Co...

u011714517的博客 452

Java集合体系总结—Map、Set、List、Queue

首先上来一张自己画的图,主要根据《疯狂Java讲义》一书中的两个图整合而来。主要讲解重要的集合及其特点。 0x01 Collection 接口 Collection接口比较宽泛,该集合就是单一对象的集合(对比Map容器,是key-value这样的一对元素构成的键值对的集合)。一般作为工具使用,比如在“向上转型”中,定义一个Collection对象接受任何实现类, 该接口提供了很多有用的API,比

嘤其鸣矣,求其友声 4517

java j集合_疯狂Java系列之j集合类

Collection接口中的方法Set、List、Queue三种集合都是来自于父接口,所以C的方法可以用来操作三种集合。boolean add(Object o):向集合中添加元素;boolean addAll(Collection c):把集合c里所有元素添加到指定集合中;void clear():清除集合所有元素,集合长度变成0;boolean contains(Object o):返回该集合...

weixin_39539588的博客 289

[疯狂Java]集合:Set、HashSet、LinkedHashSet

1. Set:     1) Set其实就是Collection,它几乎没有扩展Collection的任何功能(没有在Collection的基础上添加任何额外的方法);     2) 只不过Set的add方法要求添加的元素不能重复,如果重复则添加失败返回false; 2. HashSet:     1) 是Set的最常用的一种实现,实现方法是哈希表;     2) 按照哈希算法存

Lirx_Tech的专栏 2176

《疯狂java讲义》第8章 java集合

第8章 java集合 Java集合类是一种特别有用的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构,如栈、队列等。除此之外,Java集合还可用于保存具有映射关系的关联数组。Java集合大致可分为Set、List、Queue和Map四种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合,Java5又增加了Queue体系集合,代表一种队列集合实现。 8.1 java集合概述 集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。(所有的集

weixin_43806049的博客 439

疯狂java——集合、泛型、Stream

前言: 之前我们学习了使用数组来保存多个对象,但数组长度不可变化,如果需要保存数量变化的数据,数组就有点无能为力了。 list,set,map特点图 Set 代表无序、不可重复的集合 List 表有序、重复的集合 ;而Map 则代表具有映射关系的集合, 集合里必须是引用类型 方法: 测试collection接口的常用方法: //测试collection接口的常用方法 public class Demo1 { /** * 泛型是jdk5.0才出现的 * Collection<String&g

sinat_40482939的博客 421

[疯狂Java]集合:EnumSet、各Set性能分析(选择)

1. EnumSet——专门存放枚举类型元素的Set:     1) EnumSet只能存放一种枚举类型的元素,具体存放什么枚举类型的元素可以通过两种方法指定,一种是显式,一种是隐式;     2) 一旦元素的枚举类型确定那么集合就确定了(即只能存放该种枚举类型的元素,不能同时存放多种枚举类型的元素!!否则就会抛出异常);     3) 枚举集合EnumSet底层并不是直接存放枚举对象的,而

Lirx_Tech的专栏 2787

疯狂Java讲义_Chapter08集合

1.Java集合概述 Java集合的功能: 用于存储数量不等的对象; 实现常用的数据结构; 保存具有关联性的数据(map); 集合类可以解决数组长度不可变导致的数据存储问题; 所有的集合类都位于java.util包下; 集合类中只能保存对象,值类型进入集合会自动装箱; Collection和Map是集合类的根接口; Set和List接口是Collection的两个子接口,分别代表无序集合和有序集合;Set中的元素不能重复; Map由key-value这种键值对数据组成,key是唯一的; 访

工程师学徒AYG 341
上一篇: 疯狂Java系列之集合和iterator接口
下一篇: 疯狂Java系列之List集合
mayfla
博客等级 码龄14年 312粉丝 191原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值