JAVASE高级 day_4 集合3:HashSet、LinkedSet

本文探讨了Java中的Set接口实现,重点关注HashSet和LinkedHashSet。HashSet依赖哈希表确保元素不重复,其存储位置由对象的hashCode计算得出。而LinkedHashSet则额外维护元素插入顺序。要确保HashSet中元素的唯一性,需重写equals和hashCode方法。LinkedHashSet则保持插入顺序。

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

set

特点:

1. 元素不能重复,只能有一个null 判断元素是否重复的标准->equals
2. 元素无序

Set接口的常用方法:

使用同Collection

Set接口的常见实现:HashSet、TreeSet、LinkedHashSet

public static void main(String[] args) {
    //创建一个Set集合
    Set set = new HashSet();
    //存入元素
    set.add("java");
    set.add("html");
    set.add("mysql");
    set.add("oracle");
    //遍历集合
    //使用增强for来遍历
    for(Object  obj : set){
        System.out.println(obj);
    }
}

遍历结果
在这里插入图片描述
在这里插入图片描述
使用迭代器迭代

 //使用迭代器遍历
Iterator iter =  set.iterator();
  while(iter.hasNext()){
      Object obj = iter.next();
      System.out.println(obj);
  }

Set集合的典型实现

HashSet

特点:

1. 底层数据结构的实现:哈希表
2. 线程不同步
3. 不保证元素的迭代顺序和存入顺序的一致性
4. 元素不重复

哈希表:
哈希值:是jdk根据对象的地址或者字符串或者数字计算得出的int类型的数值
获取对象的哈希值的方法:Object类提供
在这里插入图片描述
哈希值的特点:

1. 同一对象对此获取的hashcode值总是相同的
2. 不同对象的hashcode值肯定是不同的
3. 在自定义类中 需要重写hashcode方法,保证每一个对象的hash值是独有的
public static void main(String[] args) {
    // 同一对象的hashCode值 是相同的 ,不同对象的hashCode值是不同的
    //在特殊情况下, 可以通过重写hashCode来实现不同对象返回相同的哈希值
    Student stu = new Student("张三",22);
    System.out.println(stu.hashCode());
    System.out.println(stu.hashCode());
    Student stu1 = new Student("李四",23);
    System.out.println(stu1.hashCode());
    //特殊情况
    System.out.println("---------------------------");
    System.out.println("hello".hashCode());
    System.out.println("world".hashCode());
    System.out.println("java".hashCode());
    System.out.println("hello".hashCode());
    System.out.println("---------------------------");
    System.out.println("通话".hashCode());//1179395
    System.out.println("重地".hashCode());//1179395 在计算hashCode值的时候 有可能不同的对象返回相同的hanshCode
    System.out.println("通话".equals("重地"));
    //不同对象的equals返回false  但是他们的hashCode值 有可能相同
}

HashSet底层借助于HashMap实现

HashSet的初始容量是16,默认的负载因子为0.75

HashSet如何保证元素不可重复

在这里插入图片描述

  1. HashSet中存储对象的位置,是由对象的HashCode值计算所得

  2. 存储方式的模拟解释
    在这里插入图片描述

  3. 判断元素是否重复 :是hashCode值相同且equals方法返回true 此时才会认定这两个对象重复

HashSet集合存储元素,元素不能重复的保障:

元素的唯一性:重写对象类的equals和hashCode 同时当hashCode方法返回相同的hash值 且equals返回true 此时才会认定这两个元素是重复的。

LinkedHashSet

特点:

底层实现是哈希表和链表的实现。具有可预知的迭代次序
元素是有序的 (有序是由链表保障的)
元素也是不可重复的(哈希表保障了唯一性)

此实现不同步

public static void main(String[] args) {
    LinkedHashSet lhs = new LinkedHashSet();
    lhs.add("hello");
    lhs.add("world");
    lhs.add("java");
    lhs.add("world");
    lhs.add(null);
    for(Object obj : lhs){
        System.out.println(obj);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值