关于 TreeMap 和 HashMap 的去重操作

 


HashMap:

  HashMap中的key去重是要重写equals跟hashCode实现

测试代码:

  重写了equals跟hashCode后map的大小是1、如果没有重写map的大小是2。

说明重写了equals跟hashCode后将HashMap集合的key进行了去重操作!

复制代码
import java.util.*;

public class MapDemo {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put(new User(1, "张志喜"), "one");
        map.put(new User(1, "张志喜"), "two");

        System.out.println(map.size());
    }
}

class User {
    private int id;
    private String name;

    public User() {
    }

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof User)) return false;

        User user = (User) o;

        if (getId() != user.getId()) return false;
        return getName() != null ? getName().equals(user.getName()) : user.getName() == null;
    }

    @Override
    public int hashCode() {
        int result = getId();
        result = 31 * result + (getName() != null ? getName().hashCode() : 0);
        return result;
    }
}
复制代码

 

TreeMap:

  TreeMap的去重有两种方式:

    1、实现Comparable 并重写compareTo方法

    2、单独写一个比较器

1、实现Comparable 并重写compareTo方法:

复制代码
 1 import java.util.*;
 2 
 3 public class MapDemo {
 4     public static void main(String[] args) {
 5         Map map = new TreeMap();
 6         map.put(new User(1, "张志喜"), "one");
 7         map.put(new User(1, "张志喜"), "two");
 8 
 9         System.out.println(map.size());
10     }
11 }
12 
13 class User implements Comparable<User> {
14     private int id;
15     private String name;
16 
17     public User() {
18     }
19 
20     public User(int id, String name) {
21         this.id = id;
22         this.name = name;
23     }
24 
25     public int getId() {
26         return id;
27     }
28 
29     public void setId(int id) {
30         this.id = id;
31     }
32 
33     public String getName() {
34         return name;
35     }
36 
37     public void setName(String name) {
38         this.name = name;
39     }
40 
41     @Override
42     public boolean equals(Object o) {
43         if (this == o) return true;
44         if (!(o instanceof User)) return false;
45 
46         User user = (User) o;
47 
48         if (getId() != user.getId()) return false;
49         return getName() != null ? getName().equals(user.getName()) : user.getName() == null;
50     }
51 
52     @Override
53     public int hashCode() {
54         int result = getId();
55         result = 31 * result + (getName() != null ? getName().hashCode() : 0);
56         return result;
57     }
58 
59     public int compareTo(User o) {
60         if (o.id == this.id && o.name.equals(this.name)) {
61             return 0;
62         }
63         return -1;
64     }
65 }
复制代码

 

posted @   Java小白的搬砖路  阅读(438)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示