Java中的Set集合

文章详细介绍了Java中的Set集合,包括HashSet和TreeSet。HashSet基于HashMap实现,不允许存储重复元素,通过hashCode和equals方法判断元素重复。TreeSet是有序的,要求存储的元素实现Comparable接口,或者在添加时提供Comparator。遍历Set集合可以使用增强for循环或Iterator。
摘要由CSDN通过智能技术生成

Set

不能存储重复元素,元素无序(指的是不按照添加的顺序,List集合是按照添加顺序存储的)

hashSet

注:源码底层是hashMap实现的,因为hashMap是双列的,其中键是不能重复的,而hashSet是单列集合,所以就将键单独运用,实现了我们的hashSet

add方法

:hashset中添加元素时,使用的时map中的put方法,键是元素,而值则是一个常量,是一个object对象,如下:

hashSet添加元素时,如何判断元素是否已经存在(也就是判断hashMap的键是如何判断重复的)

add添加元素时,会先根据内容对象调用hashCode()方法计算出一个hash值(int类型),用计算出的哈希值作为标准来比较元素是否重复,效率高。但是,只用hash值比较是不安全的, 因为有些元素虽然内容不同,但是它们根据hashcode方法 (元素所属的类若重写了hashcode方法,则用重写的hashcode方法,若没有则使用object类的hashcode方法) 计算出的hash值是相同的(例“通话”与“种地”),为了避免,这时会调用equals方法对每个字符进行比较,只有hash值和内容都相同时,我们才会认定这两个元素重复,这时add方法就不会将其添加进set集合中

注:元素所属的类若重写了hashcode方法,则用重写的hashcode方法,若没有则使用object类的hashcode方法,object类中的hashcode()方法计算的hash值是由内存地址决定的,比较得是地址,而不是内容,所以我们如果要用集合对某个类的实例进行存储时,我们需要重写这个类的hashcode方法,通过内容计算hash值,这样set集合添加这个类的对象时,比较的就是内容而不是像object一样比较地址了,(举例:两个对象内容都相同,要存入set集合中,按道理它们是重复的,不能两个都添加,但是由于这个类没有重写hashcode方法,导致计算出的hash值不同,set集合add时就会把两个都添加进去)

注:我们自己定义的类中,重写hashcode方法时,idea会可以自动帮我们生成方法,且都是根据内容计算hash值,十分滴好用

TreeSet

元素不重复,且可以对元素进行指定方式的排序(是有序的)

存储的对象必须要实现Comparable接口

底层存储结构是二叉树(红黑树)

存储我们自定义的类对象时,类必须要实现comparable接口,重写compareTo方法。

如果对comparable接口不了解的友友,可以看下这篇哦~
https://blog.csdn.net/weixin_52394141/article/details/128907502

遍历方式

1.增强for循环

2.迭代器

Iterator类

Set集合总结:在java中可以存储一些单列不重复的元素,且需要排序时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值