一文带你读懂HashMap和HashSet

本文深入探讨Java集合框架中的HashMap和HashSet。HashMap是一个存储键值对的接口,其内部通过哈希函数实现快速查找。HashSet是基于HashMap实现的集合,确保元素唯一性。文章介绍了它们的基本操作,如添加、删除、遍历,以及在面试中常问的HashMap的equals()和hashCode()方法的使用注意事项。

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

集合

Java 集合框架Java Collection Framework ,又被称为容器container ,是定义在 java.util 包下的一组接口interfaces 和其实现类classes
在这里插入图片描述

集合类体系结构

在这里插入图片描述

Set和Map集合的关系

  • 纯key模型
    应用: 查询某个英文单词在不在字典中

  • key-value模型
    应用:统计每个单词出现的次数<单词,出现次数>

Map集合

Map官方文档

  1. Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap
  2. Map中存放键值对的Key是唯一的,value是可以重复的.HashMap集合中keyvalue都可以为null,但是key为null,只能有一个.
  3. Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
  4. Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
  5. Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入

TreeMap

TreeMap集合中key不能为null,value可以为null

HashMap

Mapt集合 TreeMap HashMap
底层数据结构 二分搜索树 哈希表
时间复杂度 O(log2N) O(1)
是否有序 关于key有序 无序
插入删除和查找元素的区别 通过比较大小来进行插入和删除 1. 对象.hashcode()得到该对象的hash值. 2.通过hash值得到hash地址
比较与覆写 key必须能够比较,否则会抛出ClassCastException异常 自定义类型需要覆写equals和hashCode方法

map中如何比较两个对象

map中比较两个对象是否相同的时候必须覆写hashcode()equals方法.

  1. equal相同的两个对象,hashcode是否相同?

    一定相同,equal相同,就是同一对象, 试想,如果hashcode()不相同,那肯定不是同一对象,怎么可能equals()相同

  2. hashcode()相同的两个对象,equals是否相同?

    不一定相同,只能说明发生了哈希冲突.

/**
 * @autor hh
 * @date 2022/07/03 20:50
 */
public class Person {
   
    String name;
    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 boolean equals(Object obj) {
   
        if (this == obj) {
   
            return true;
        }
        if (obj instanceof Person) {
   
            Person person = (Person) obj;
            return this.age == person.age && this.name.equals(person.name);
        }
        return false;
    }

    @Override
    public int hashCode() {
   
        return 0;
    }

    public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值