Java之Set的使⽤场景
2.Set使⽤场景
API介绍:
java.util.Set接⼝和java.util.List接⼝⼀样,同样继承⾃Collection接⼝,
它与Collection接⼝中的⽅法基本⼀致,并没有对Collection接⼝进⾏功能上的扩充,
只是⽐Collection接⼝更加严格了。与List接⼝不同的是,Set接⼝中元素⽆序,
并且都会以某种规则保证存⼊的元素不出现重复。Set集合有多个⼦类,
这⾥我们介绍其中的
java.util.HashSet、
java.util.LinkedHashSet这两个集合。
特点:都会以某种规则保证存⼊的元素不出现重复,Set接⼝中元素⽆序
①元素不出现重复
②元素⽆序( 指 存取 ⽆序)
哈希表:只要往哈希表中存储⾃定义对象,那么该⾃定义对象 所属的类 必须重写hashCode&equals⽅法
⑴HashSet集合
底层是通过HashMap实现的 底层new HashMap对象 ,只⽤了 key 并没有使⽤ value value指向统⼀地址 new Object()
API介绍:
java.util.HashSet是Set接⼝的⼀个实现类,它所存储的元素是不可重复的,
并且元素都是⽆序的(即存取顺序不⼀致)。java.util.HashSet底层的实现其实
是⼀个java.util.HashMap⽀持,HashSet是根据对象的哈希值来确定元素在集合中的存储位置,
因此具有良好的存取和查性能。保证元素唯⼀性的⽅式依赖于:hashCode与equals⽅法。
特点:
①元素不重复
②存取顺序不⼀致
③良好的存取和查性能
jdk怎么使用 ④元素唯⼀性的⽅式依赖于:hashCode与equals⽅法
HashSet集合存储数据的结构(哈希表):
在JDK1.8之前,哈希表底层采⽤数组+链表实现,即使⽤链表处理冲突,
同⼀hash值的链表都存储在⼀个链表⾥。但是当位于⼀个桶中的元素较多,
即hash值相等的元素较多时,通过key值依次查的效率较低。
⽽JDK1.8中,哈希表存储采⽤数组+链表+红⿊树实现,
当链表长度超过阈值(8)时,将链表转换为红⿊树,这样⼤⼤减少了查时间。
总⽽⾔之,JDK1.8引⼊红⿊树⼤程度优化了HashMap的性能,
那么对于我们来讲保证HashSet集合元素的唯⼀,其实就是根据对象的
hashCode和equals⽅法来决定的。如果我们往集合中存放⾃定义的对象,
那么保证其唯⼀,就必须复写hashCode和equals⽅法建⽴属于当前对象的⽐较⽅式。
总结:1.8之前是通过 哈希表底层采⽤数组+链表实现
1.8中是通过 哈希表存储采⽤数组+链表+红⿊树实现(链表长度超过阈值(8)时,将链表转换为红⿊树,这样⼤⼤减少了查时间) 保证元素其唯⼀,必须重写hashCode和equals⽅法建⽴属于当前对象的⽐较⽅式
HashSet存储⾃定义类型元素(重点):
给HashSet中存放⾃定义类型元素时,需要重写对象中的hashCode和equals⽅法,
建⽴⾃⼰的⽐较⽅式,才能保证HashSet集合中的对象唯⼀
⑵LinkedHashSet
HashSet保证元素唯⼀,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢
在HashSet下⾯有⼀个⼦类java.util.LinkedHashSet,它是 链表和哈希表 组合的⼀个数据存储结构。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论