前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HashMap和HashSet

HashMap和HashSet

作者头像
编程思维
发布2023-08-17 08:16:09
2340
发布2023-08-17 08:16:09
举报
文章被收录于专栏:程序员面试小技巧

HashMap

Java中最基本的 k-v 数据结构

k不得为空,v可以任意

可以自由组合各种映射关系

HashSet

HashSet作为Set接口的实现类

它的底层还是基于HashMap来创建的

而HashSet拥有两个特点:

代码语言:javascript
复制
  1、插入元素的顺序和输出元素顺序与HashSet中的位置不一致。
  2、HashSet可以保证集合中的元素唯一。

在实现校验重复数据的时候

我们可以使用Java中Set集合来对数据去重

或者可以过滤不同数据集中不重复的数据或实体对象

当我们需要校验一个实体对象是否是重复的数据的时候

就需要校验这个实体的属性的值是否重复来判断数据是否一致

在往HashSet的对象中添加元素时

首先计算该元素的hashCode

是否与HashSet中元素的hashCode相同

如果不相同,则直接添加到HashSet之中

如果两者的hashCode相同

则还需要接着比较该

对象的equals()方法来检查两者是否真的相同

如果不同,则添加到HashSet中

如果相同,则证明两者真的相同

便不会将元素添加进去。

测试验证

我们先新建一个User实体类

并重写实体类的hashCode方法和equals方法

如下代码所示

可以在使用Set的时候按照我们定义的规则来对数据进行去重处理

代码语言:javascript
复制
public class User {
    private String id;
 
    private String name;
 
    private Integer age;
 
    public User(String id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
 
    public User() {
    }
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((id == null) ? 0 : id.hashCode());
 
        return result;
    }
 
    @Override
    public boolean equals(Object obj) {
        if (this == obj) // 调用的对象和传入的对象是用一个对象
            return true;
        if (obj == null) // 传入的对象为null
            return false;
        if (getClass() != obj.getClass()) // 判断两个对象对应的字节码文件是否是同一个字节码
            return false;
 
        User other = (User) obj; // 向下转型
 
        if (age != other.age) // 调用对象的age不等于传入的对象的age
            return false;
 
        if (name == null) { // 调用对象的name为null
            if (other.name != null) // 传入对象的name不为null
                return false;
        } else if (!name.equals(other.name)) // 调用对象的name不等于传入对象的name
            return false;
 
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
 
        return true;
    }
 
    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

然后写一个测试类

代码语言:javascript
复制
public class TestDemo {
    @Test
    public void exec() {
        // 定义一个存储数据的容器
        HashSet<User> hashSet = new HashSet<>();
 
        // 设定模拟数据
        List<User> l1 = new ArrayList<>();
        l1.add(new User("1", "小明", 22));
        l1.add(new User("1", "小明", 22));
        l1.add(new User("2", "小明", 22));
        l1.add(new User("1", "大伟", 22));
        l1.add(new User("1", "大大伟", 23));
        l1.add(new User("1", "小明", 23));
 
        for (User u : l1) {
            if (!hashSet.add(u)) {
                log.info("重复的数据为:{}" , u.toString());
            }
        }
 
        for (User uset : hashSet) {
            System.out.println(uset.toString());
        }
 
    }
}

这样就能简单区分出差异的数据了

这些资料都可以私信我资料获取

你学会了吗

关注我学习更多技术知识吧

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HashMap
  • HashSet
  • 测试验证
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档