Java的Set集合

本文介绍了Set集合的基本概念,包括HashSet的高效存储与无序特性,LinkedHashSet的有序特性及其适用场景,以及如何根据实际需求选择HashSet、TreeSet和LinkedHashSet。重点讨论了性能对比和排序需求对Set类选择的影响。
摘要由CSDN通过智能技术生成

Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的 添加顺序。
Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失 败,add()方法返回 false,且新元素不会被加入。
Set常用方法
在这里插入图片描述

一、 HashSet类
HashSet类是Set接口的典型实现类,大多数时候使用Set集合时就是使用这个实现类。
HashSet类 按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet类具有以下特点:
1、不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
2、HashSet不是同步的(不是线程安全的),如果多个线程同时访问一个 HashSet,假设有两个或者 两个以上线程同时修改了 HashSet集合时,则必须通过代码来保证其同步。
3、集合元素值可以是null,但只能放入一个null。
当向 HashSet集合中存入一个元素时, HashSet会调用该对象的 hashCode()方法来得到该对象的 hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过 equals方法比较返回true,但它们的hashCode()方法返回值不相等, HashSet将会把它们存储在 不同的位置,依然可以添加成功。
HashSet判断元素是否相等的依据:hashCode()相同,equals()方法相同;
二、LinkedHashSet类
1、HashSet类还有一个子类 LinkedHashSet, LinkedHashSet集合也是根据元素的 hashCode值来决 定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。 也就是说,当遍历 LinkedhashSet集合里的元素时, LinkedHashSet将会按元素的添加顺序来访问集合 里的元素。
2、LinkedHashSet需要维护元素的插入顺序,因此性能略低于 HashSet的性能,但在迭代访问Set里的 全部元素时将有很好的性能,因为它以链表来维护内部顺序。

三、各Set实现类的选择
HashSet和TreeSet是Set的两个典型实现,如何选择HashSet和TreeSet?
1、HashSet的性能总是比TreeSet好(特别是最常用的添加、查询元素等操作),因为TreeSet需要额 外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的Set时,才应该使用TreeSet,否则 一般都应该使用HashSet。
2、HashSet还有一个子类:LinkedHashSet,对于普通的插入、删除操作,LinkedHashSet比HashSet 要略微慢一点,这是由维护链表所带来的额外开销造成的,但由于有了链表,遍历LinkedHashSet会更 快

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值