Java学习笔记 --- HashSet

本文介绍了Java中的HashSet数据结构,详细讲解了其作为HashMap实现的特性,包括不保证元素顺序、不允许重复、允许一个null值。深入探讨了HashSet添加元素的底层机制,涉及到哈希函数和equals方法的使用,以及在Java8中的树化转换条件。此外,还提供了两个实际操作案例,演示如何创建和使用HashSet,特别是在比较Employee对象时的注意事项。
摘要由CSDN通过智能技术生成

一、基本介绍

1、HashSet 实现了 Set 接口

2、HashSet 实际上是 HashMap 

3、可以存放 null 值,但是只能有一个 null

4、HashSet 不保证元素是有序的,取决于hash后,再确定索引的结果

5、不能有重复元素/对象

import java.util.HashSet;
import java.util.Set;

public class HashSet01 {
    public static void main(String[] args) {
        //1. 构造器的源码
        /*
        public HashSet() {
            map = new HashMap<>();
        }
         */
        //2. 可以存放null值,但是只能有一个,即元素不能重复
        Set hashSet = new HashSet();
        hashSet.add(null);
        hashSet.add(null);
        System.out.println(hashSet);

        //在执行add方法后,会返回一个boolean值
        //如果添加成功,返回true 否则返回false
        System.out.println(hashSet.add("张三"));//true
        System.out.println(hashSet.add("李四"));//true
        System.out.println(hashSet.add("老六"));//true
        System.out.println(hashSet.add("张三"));//false
        System.out.println(hashSet.add("铁蛋"));//true

        //可以通过remove指定删除哪个对象
        hashSet.remove("张三");
        System.out.println(hashSet);

        hashSet = new HashSet();
        hashSet.add("张三");//添加成功
        hashSet.add("张三");//添加失败
        hashSet.add(new Dog("小黑"));//添加成功
        hashSet.add(new Dog("小黑"));//添加成功
        System.out.println(hashSet);

        //经典面试题
        //看源码分析
        hashSet.add(new String("老六"));//加入成功
        hashSet.add(new String("老六"));//加入失败
        System.out.println(hashSet);
    }
}

class Dog {
    private String name;

    public Dog(String name) {
        this.name = name;
    }

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

二、HashSet底层机制说明

分析 HashSet 底层是 HashMap,HashMap 底层是(数组+链表+ 红黑树)

public class HashSetStructure {
    public static void main(String[] args) {
        //1. 创建一个数组,数组的类型是 Node[]
        //2. 有些人直接把 Node[] 数组称为 表
        Node[] table = new Node[16];

        //3. 创建节点
        Node zs = new Node("张三", null);
        table[2] = zs;//将节点存放到数组的索引2的位置

        Node ls = new Node("李四", null);
        zs.next = ls;//将ls 节点挂载到 zs

        Node ll = new Node("老六", null);
        ls.next = ll;//将ll 节点挂载到 ls

        Node td = new Node("铁蛋", null);
        table[3] = td;//将节点存放到数组的索引3的位置
        System.out.println(table);
    }
}

class Node {//节点,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值