java-集合-set(不重复集合)知识分解

哈希表的优缺点:

哈希表的学习:


庖丁解牛术法总纲

========

吾生也有涯,而知也无涯 。以有涯随无涯,殆已!已而为知者,殆而已矣!为善无近名,为恶无近刑。缘督以为经,可以保身,可以全生,可以养亲,可以尽年。

“庖丁为文惠君解牛,手之所触,肩之所倚,足之所履,膝之所踦,砉然向然,奏刀騞然,莫不中音。合于《桑林》之舞,乃中《经首》之会。

文惠君曰:“嘻,善哉!技盖至此乎?”

庖丁释刀对曰:“臣之所好者,道也,进乎技矣。始臣之解牛之时,所见无非牛者。三年之后,未尝见全牛也。方今之时,臣以神遇而不以目视,官知止而神欲行。依乎天理,批大郤,导大窾,因其固然,技经肯綮之未尝,而况大軱乎!良庖岁更刀,割也;族庖月更刀,折也。今臣之刀十九年矣,所解数千牛矣,而刀刃若新发于硎。彼节者有间,而刀刃者无厚;以无厚入有间,恢恢乎其于游刃必有余地矣,是以十九年而刀刃若新发于硎。虽然,每至于族,吾见其难为,怵然为戒,视为止,行为迟。动刀甚微,謋然已解,如土委地。提刀而立,为之四顾,为之踌躇满志,善刀而藏之。”

——《庄子·养生主》

呔,妖怪。看法宝!

第一重境界:所见莫非全牛者

=============

1、概述:

Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。实际上Set就是Collection,只是行为略有不同(Set不允许包含重复元素)。

Set集合不允许包含相同的元素,如果试图把两个相同元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入。

2、Set集合特点:

(1)、不包含重复元素的集合

(2)、没有带索引的方法,所以不能使用普通for循环遍历

3、分类(实现子类):

(1)、HashSet

(2)、TreeSet

4、所有已知实现类:

  • [AbstractSet]( )[ConcurrentHashMap.KeySetView]( )[ConcurrentSkipListSet]( )[CopyOnWriteArraySet]( )[EnumSet]( )[HashSet]( )[JobStateReasons]( )[LinkedHashSet]( )[ReadOnlySetProperty]( )[ReadOnlySetPropertyBase]( )[ReadOnlySetWrapper]( )[SetBinding]( )[SetExpression]( )[SetProperty]( )[SetPropertyBase]( )[SimpleSetProperty]( )[TreeSet]( )

5、注意事项

不包含重复元素的集合。 更正式地,集合不包含一对元素e1e2 ,使得e1.equals(e2) ,并且最多只有一个空元素。 正如其名称所暗示的那样,这个接口模拟了数学_集_抽象。

Set接口放置额外的约定,超过从继承Collection接口,所有构造函数的合同,而位于该合同addequalshashCode方法。 其他继承方法的声明也包括在这里以方便。 (这些声明中附带的规格已针对Set接口进行了定制,但不包含任何其他规定。)

构造函数的额外规定并不奇怪,所有构造函数都必须创建一个不包含重复元素的集合(如上所定义)。

注意:如果可变对象用作设置元素,则必须非常小心。 如果对象的值以影响equals比较的方式更改,而对象是集合中的元素,则不指定集合的行为。 这种禁止的一个特殊情况是,一个集合不允许将其本身作为一个元素。

一些集合实现对它们可能包含的元素有限制。 例如,一些实现禁止空元素,有些实现对元素的类型有限制。 尝试添加不合格元素会引发未经检查的异常,通常为NullPointerExceptionClassCastException 。 尝试查询不合格元素的存在可能会引发异常,或者可能只是返回false; 一些实现将展现出前者的行为,一些实现将展现出后者。 更一般来说,尝试对不符合条件的元素的操作,其完成不会导致不合格元素插入到集合中,可能会导致异常,或者可能会成功执行该选项。 此异常在此接口的规范中标记为“可选”。

6、所有方法

    • | Modifier and Type | 方法 | 描述 |
    | --- | --- | --- |
    | `boolean` | `[add]( )​([E]( ) e)` | 
    如果指定的元素不存在,则将其指定的元素添加(可选操作)。
     |
    | `boolean` | `[addAll]( )​([Collection]( )<? extends [E]( )> c)` | 
    将指定集合中的所有元素添加到此集合(如果尚未存在)(可选操作)。
     |
    | `void` | `[clear]( )​()` | 
    从此集合中删除所有元素(可选操作)。
     |
    | `boolean` | `[contains]( )​([Object]( ) o)` | 
    如果此集合包含指定的元素,则返回 `true` 。
     |
    | `boolean` | `[containsAll]( )​([Collection]( )<?> c)` | 
    如果此集合包含指定集合的所有元素,则返回 `true` 。
     |
    | `boolean` | `[equals]( )​([Object]( ) o)` | 
    将指定的对象与此集合进行比较以实现相等。
     |
    | `int` | `[hashCode]( )​()` | 
    返回此集合的哈希码值。
     |
    | `boolean` | `[isEmpty]( )​()` | 
    如果此集合不包含元素,则返回 `true` 。
     |
    | `[Iterator]( )<[E]( )>` | `[iterator]( )​()` | 
    返回此集合中元素的迭代器。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​()` | 
    返回一个包含零个元素的不可变集合。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​(E e1)` | 
    返回一个包含一个元素的不可变集合。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​(E... elements)` | 
    返回一个包含任意数量元素的不可变集合。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​(E e1, E e2)` | 
    返回一个包含两个元素的不可变集合。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​(E e1, E e2, E e3)` | 
    返回一个包含三个元素的不可变集合。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​(E e1, E e2, E e3, E e4)` | 
    返回一个包含四个元素的不可变集合。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​(E e1, E e2, E e3, E e4, E e5)` | 
    返回一个包含五个元素的不可变集合。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​(E e1, E e2, E e3, E e4, E e5, E e6)` | 
    返回一个包含六个元素的不可变集合。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​(E e1, E e2, E e3, E e4, E e5, E e6, E e7)` | 
    返回一个包含七个元素的不可变集合。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8)` | 
    返回一个包含八个元素的不可变集合。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9)` | 
    返回一个包含九个元素的不可变集合。
     |
    | `static <E> [Set]( )<E>` | `[of]( )​(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10)` | 
    返回一个包含十个元素的不可变集合。
     |
    | `boolean` | `[remove]( )​([Object]( ) o)` | 
    如果存在,则从该集合中删除指定的元素(可选操作)。
     |
    | `boolean` | `[removeAll]( )​([Collection]( )<?> c)` | 
    从此集合中删除指定集合中包含的所有元素(可选操作)。
     |
    | `boolean` | `[retainAll]( )​([Collection]( )<?> c)` | 
    仅保留该集合中包含在指定集合中的元素(可选操作)。
     |
    | `int` | `[size]( )​()` | 
    返回此集合中的元素数(其基数)。
     |
    | `default [Spliterator]( )<[E]( )>` | `[spliterator]( )​()` | 
    在此集合中的元素上创建一个 `Spliterator` 。
     |
    | `[Object]( )[]` | `[toArray]( )​()` | 
    返回一个包含此集合中所有元素的数组。
     |
    | `<T> T[]` | `[toArray]( )​(T[] a)` | 
    返回一个包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。
     |

第二重境界:未尝见全牛也

============

HashSet


1、HashSet特点:

(1)底层数据结构是哈希表(查询速度快),使用HashCode哈希值

(2)对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致

(3)没有带索引的方法,所以不能使用普通for循环遍历

(4)由于是Set集合,所以是不包含重复元素的集合

2、HashSet集合添加一个元素的过程:

3、代码演示

package SetDemo;

import java.util.HashSet;

public class Set01 {

public static void main(String[] args) {

//导包创建对象HashSet

HashSet set=new HashSet();

//添加数据

set.add(“aaa”);

set.add(“bbb”);

set.add(“ccc”);

set.add(“ddd”);

//增强for循环遍历

for (String i:set){

System.out.println(i);

}

}

}

//代码输出结果

E:\develop\JDK\bin\java.exe "-javaagent:E:\IDEA\IntelliJ IDEA Community Edition

aaa

ccc

bbb

ddd

Process finished with exit code 0

4、注意事项(特殊之处,遍历无序的原因不是排序的无序,而是底层哈希值的存放地址的原因)

public static void main(String[] args) {

HashSet set=new HashSet();

set.add(“hello”);

set.add(“world”);

set.add(“java”);

//集合自带排序方式

System.out.println(set);

System.out.println(“--------”);

//迭代器方式

Iterator it = set.iterator();

while (it.hasNext()){

String s = it.next();

System.out.println(s);

}

System.out.println(“--------”);

//增强for循环

for (String s:set){

System.out.println(s);

}

}

//输出结果

[world, java, hello]


world

java

hello


world

java

hello

Process finished with exit code 0

上述代码是正常输出的结果,但是以下的代码的输出,请看:

public static void main(String[] args) {

HashSet set=new HashSet();

set.add(“6”);

set.add(“7”);

set.add(“8”);

set.add(“9”);

set.add(“10”);

//集合自带排序方式

System.out.println(set);

System.out.println(“--------”);

//迭代器方式

Iterator it = set.iterator();
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

《MySql面试专题》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySql性能优化的21个最佳实践》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySQL高级知识笔记》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

关注我,点赞本文给更多有需要的人
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
[外链图片转存中…(img-zECZFfwJ-1712040625959)]

[外链图片转存中…(img-VEk96y4b-1712040625959)]

[外链图片转存中…(img-Hjf5giFe-1712040625960)]

[外链图片转存中…(img-exP09GYo-1712040625960)]

[外链图片转存中…(img-K6uRGGFZ-1712040625960)]

[外链图片转存中…(img-4YFvxur7-1712040625960)]

[外链图片转存中…(img-dZI6s6GF-1712040625961)]

[外链图片转存中…(img-dR9K1ItC-1712040625961)]

[外链图片转存中…(img-Q0jqmJW4-1712040625961)]

[外链图片转存中…(img-g11lkDv7-1712040625961)]

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

[外链图片转存中…(img-mtcvb1Bq-1712040625961)]

关注我,点赞本文给更多有需要的人
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值