IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java集合框架--HashSet存储结构 & HashSet拓展 -> 正文阅读

[Java知识库]Java集合框架--HashSet存储结构 & HashSet拓展

1. HashSet存储结构

注:hashSet存储过程:

  1. 根据hashCode计算保存的位置,如果位置为空,则直接保存,否则执行第二步。
  2. 执行equals方法,如果方法返回true,则认为是重复,拒绝存储,否则形成链表。

问题: 如何不让新增new出来的匿名对象 & 如何删除new出来的匿名对象?

首先这里有一个Person类:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试代码:

    public static void main(String[] args) {
        HashSet<Person> hashSet = new HashSet<>();
        Person p1 = new Person("小明", 21);
        Person p2 = new Person("小李", 22);
        Person p3 = new Person("小周", 21);
        //1.添加元素
        hashSet.add(p1);
        hashSet.add(p2);
        hashSet.add(p3);
        //重复,添加失败
        hashSet.add(p3);
        //直接new一个相同属性的对象,依然会被添加,不难理解。
        //假如相同属性便认为是同一个对象,怎么修改?
        hashSet.add(new Person("小明", 21)); // 添加成功
        System.out.println(hashSet.toString());
        //如何删除new出来的对象?
        System.out.println();
        hashSet.remove(new Person("小明", 21));
        System.out.println(hashSet.toString());
    }

在这里插入图片描述

假如相同属性便认为是同一个对象,怎么修改?
思路: 要解决该问题问题,可以重写hashCode和equals代码:

现在的Peson类: 重写了hashCode和equals方法

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int hashCode() {
    // 这样对象内容一样 对象的哈希值也相同
        return this.name.hashCode() + age;
    }

    @Override
    public boolean equals(Object obj) {
        //1.是否为同一对象
        if (this == obj) {
            return true;
        }
        //2.判断是否为空
        if (obj == null) {
            return false;
        }
        //3.判断是否是Student类型
        if (obj instanceof Person) {
            Person person = (Person) obj;
            //4.比较属性
            return this.name.equals(person.name) && this.age == person.age;
        }
        //不满足,返回false
        return false;
    }
}

再次运行刚刚的测试代码:
在这里插入图片描述

  • 可以发现已经解决了不让新增new出来的匿名对象 & 删除new出来的匿名对象的问题

2. HashSet拓展:

IDEA可以自动帮我们重写hashCode和equals方法

  1. 鼠标右键,选择Generate
    在这里插入图片描述

  2. 选择equals()和hashCode()
    在这里插入图片描述3. 点击next
    在这里插入图片描述

  3. 选择判断对象相等的依据,然好点击next
    在这里插入图片描述

  4. 与上一步同理
    在这里插入图片描述

  5. 点击Finish
    在这里插入图片描述

可以发现IDEA帮我们自动生成了2个方法:
在这里插入图片描述

运行刚刚的测试代码:

在这里插入图片描述

点进去hashCode源码:

在这里插入图片描述
发现hashCode方法底层实现为:

在这里插入图片描述

hashCode方法里为什么要使用31这个数字大概有两个原因:

  • 31是一个质数,这样的数字在计算时可以尽量减少散列冲突。
  • 可以提高执行效率,因为31*i=(i<<5)-i,31乘以一个数可以转换成位运算。


  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:17:12  更:2021-08-10 13:19:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:24:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码