欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > Java基础知识回顾-Set之HashSet集合

Java基础知识回顾-Set之HashSet集合

2025/7/29 5:50:42 来源:https://blog.csdn.net/u012190388/article/details/142315847  浏览:    关键词:Java基础知识回顾-Set之HashSet集合

文章目录

  • 三个特点
  • 哈希值
  • 三个实现类
    • 1、HashSet
      • 1.1 实例演示
      • 方案一、去重机制
        • 1)重写hashCode
        • 2)重写equals
      • 方案二、添加注解
    • 2、LinkedHashSet
    • 3、TreeSet

在Java中Set集合是一种重要的数据结构,可使用其去重特性,完成特定场景下的业务需要,记录下来,方便备查。

三个特点

无序、不重复、无索引

哈希值

int类型的随机值,每个Java对象都有一个哈希值,可调用Object的hashCode方法,返回对象自己的哈希值
特点
1、同一个对象多次调用hashCode方法返回的哈希值是相同的
2、不同对象,对应的哈希值一般是不相等,可能存在哈希碰撞,导致相等。

三个实现类

1、HashSet

特点:无序不重复无索引
底层是 哈希表存储

其详细流程如下:
第一步、创建一个默认长度为16,默认加权因子为0.75的数组,数据名为table;
第二步、根据元素的哈希值与数据长度计算出应存入的位置;
第三步、判断当前位置是否为null,若是null就直接存入,若位置不是null,表示有元素,则调用equals方法比较属性值,若是一样,则无需进行存放,如不一样,则要存入数组;
第四步、当数组存满到16*0.75=12时,即自动扩容,每次扩容成原来的两倍。

在JDK8之前,哈希表=数组+链表
数据因子 0.75
在JDK8以后,哈希表=数组+链表+红黑树,即当链表长度超过8,且数组长度大于等于64时,自动将链表转成红黑树。

1.1 实例演示

定义学生类Student

public class Student {private String name;private int age;private String phone;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", phone='" + phone + '\'' +'}' +"\n";}
}

分别定义3个student对象,放到HashSet对象中,运行代码查看效果。

public static void main(String[] args){Student s1 = new Student();s1.setName("Tom");s1.setAge(10);s1.setPhone("1111111");Student s2 = new Student();s2.setName("Tom");s2.setAge(10);s2.setPhone("1111111");Student s3 = new Student();s3.setName("Jerry");s3.setAge(11);s3.setPhone("222222");Set<Student> set = new HashSet<>();set.add(s1);set.add(s2);set.add(s3);System.out.println("结果输出为:"+set);
}

运行结果如下图所示。
在这里插入图片描述
运行结果发现 相同的对象并没有去重,可采用两种方案处理

方案一、去重机制

重写对象的hashCodeequals方法。
即在 student类中重写两个方法

1)重写hashCode
@Override
public int hashCode() {return Objects.hash(name, age, phone);
}
2)重写equals
@Override
public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name) && Objects.equals(phone, student.phone);
}

右键 -> Generate -> equals() and hashCode(),即可生成两个方法。
在这里插入图片描述
执行结果如下图所示。
在这里插入图片描述

方案二、添加注解

在 student 类上加上 Data 注解

import lombok.Data;
@Data
public class Student {private String name;private int age;private String phone;
}

执行结果如下所示。
在这里插入图片描述

2、LinkedHashSet

有序,不重复,无索引

3、TreeSet

排序,不重复,无索引,默认按大小升序排序

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词