set集合

本文深入探讨了Set集合的特点和实现,包括HashSet的无序性和哈希表底层,LinkedHashSet的有序性和链表结构,以及如何存储自定义类型元素,强调了hashCode和equals方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Set集合

Set集合介绍

继承自Collection接口,①不包含重复元素,②没有索引,没有带索引的方法。

一、HashSet

java.util.HashSet实现了Set接口,

特点:

  1. ​ 不允许重复的元素
  2. ​ 没有索引,没有索引的方法。
  3. ​ 无序集合,存储元素取出元素的顺序可能不一致。
  4. ​ 底层是几个哈希表结构

由哈希表支持,不保证set的迭代顺序,底层不同步。

Set<Integer> set = new HashSet<>();
set.add(1);
set.add(3);
set.add(2);
set.add(1);//只添加一次
Iterator<Integer> it = set.
(一)哈希表

哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,不是对象的物理地址。通过Object类的hasCode()可以获取哈希值)

publi class Demo extends Object{
    //public native int hashCode();//代表该方法掉哟个的是本地操作系统的方法
    main(){
        Person p1 = new Person();
        int h1= p1.hashCode();
         Person p2 = new Person();
        int h2= p2.hashCode();
        sysout(p1);//打印的就是hashCode 1
         sysout(p2);//打印的就是hashCode 1
         sysout(p1==p2);//false物理地址不同
    }
    public native int hashCode(){
        return 1;
    }
}
String s1 = new String("abc");//字符串重写了hashCode
String s2 = new String("abc");
s1和s2的hasncode一样
String s1 = new String("重地");//字符串重写了hashCode
String s2 = new String("通话");
s1和s2的hasncode一样

1551763380786

二、set集合不允许存储重复元素的原因

1551764083282

三、HashSet集合存储自定义类型元素

存放自定义元素,需要重写hashCode 和equals方法

public class DemoHashSet{
    HashSet<Person> set =  new HashSet<>();
    Person p1 = new Person("name1",19);
    Person p2 = new Person("name1",19);
    Person p3 = new Person("name1",20);
    //p1和p2的hashCode一样,为了不重复添加,需要重写HahsCOde和equals方法
}
hashCode(){}//重写
equals(){}//重写

四、LInkedHashSet集合

继承自HashSet结构

具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序 受在 set 中重新插入的 元素的影响。(如果在 s.contains(e) 返回 true 后立即调用 s.add(e),则元素 e 会被重新插入到 set s 中。)

特点
  1. 底层是一个哈希表(数组+链表+红黑树)+链表,多了一条链表(记录元素的存储顺序),保证元素有序
  2. 有序,不允许重复
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值