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方法。
原文:https://www.cnblogs.com/cactus1/p/14354168.html