首页 > 其他 > 详细

set接口

时间:2021-01-31 23:57:36      阅读:34      评论:0      收藏:0      [点我收藏+]

set集合的特点没有下标,不能存重复元素,存值取值的顺序不固定;set接口继承自collection接口,继承了父类的方法存值 删除元素与collection一致。

hashset集合

hashset集合是实现set接口的一个类,它保证存储元素的唯一性依赖于hashcode()和equals方法。

hashset集合储存数据的结构叫哈希表,哈希表是一个数组和链表结合起来的一个结构;new一个hashset对象的时候默认车初始容量是16,加载因子是0.75;这个两个的意思是每创建一个对象的时候,默认初始容量是16,当存储的数据个数超过16*0.75=12,会给增添一个16的容器,用来存储数据。存储数据的时候会先掉用hashcode方法计算要存的数据的哈希值。

我们可以查看string类重写的hashcode方法计算哈希值如图技术分享图片

我们可以看到h=hash hash默认值为0,value数组是个char数组,当我们输入的是abc val[a,b,c],val[i]可以根据ascll码表算出值,从而得到h 的值,abc输入string类型,所以我们算出的就是abc 的哈希值。我们自定义的类需要重写hashcode方法和equals方法;当set对象调用add方法时,add方法先去调用你要存储的对象的类型那个类中的hashcode方法计算hash值,再看一下集合中是否有该hash值,如果没有,则直接存入该元素,如果有,就会再调用该类中的equals方法比较内容,如果内容不同,则存入元素,如果相同,就丢弃不存。例如我们创建了person 类 重写了person 的hashcode方法和equals方法,存{a,10},{a,10}{b,9},发现前两个元素的哈希值一样,equals方法比较内容也一样,自动丢弃第二数据,第三个数据和第一个数据的哈希值一样,我们接下来比较内容发现内容不一样;我们前面说hashset类是个数组和链表结合起来的结构

如图所示

技术分享图片

 

所以会在数组第一个位置存哈希值,下面连接个链表,连一个桶存{a,10}因为{b,9}的哈希值和前面的对象一致,所以会再连一个桶存{b,9};这就是hashset的存取方式。

linkedhashset是一个hashset的子类,它是一个双链表结构,因此它可以按照顺序取值。

ArrayList的contains方法会使用调用方法时,传入的元素的equals方法依次与集合中的旧元素所比较,从而根据返回的布尔值判断是否有重复元素。此时,当ArrayList存放自定义类型时,由于自定义类型在未重写equals方法前,判断是否重复的依据是地址值,所以如果想根据内容判断是否为重复元素,需要重写元素的equals方法。

set接口

原文:https://www.cnblogs.com/cactus1/p/14354168.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!