文档章节

Java 在 Map 中使用复杂数据类型作为 Key

傅易
 傅易
发布于 2016/10/16 00:30
字数 274
阅读 393
收藏 1

有时候你想这么做:

Map<User, Profile> map = new HashMap<>();
// 添加一些数据
map.put(new User(1), getProfile(1));
// 取用这些数据
if (map.containsKey(new User(1)) {
    doSomething();
}

但默认情况下这是不能成功的,因为在 HashMap 的实现中,是这么处理的:

// 代码有精简,改变了对 null 值的判断逻辑,不过这不是重点
if (key != null
    && e.hash == key.hashCode()
    && (e.key == key || key.equals(e.key)) {
    return e;
}

注意,hashCode 相同,不一定 equals() 返回 true。

也就是说,我们要手动实现 equals()hashCode() 才能达到我们的目的。

class User {

    private Integer id;

    @Override
    public int hashCode() {  
        return this.id != null ? this.id : 0;  
    }  

    @Override
    public boolean equals(Object obj) {  
        return obj instanceof User && (this.id.equals(((User) obj).id));  
    }  
}

大功告成。

Think in Java 中设计 equals() 的五条原则

  1. 自反性。 即 x.equals(x) 为 true
  2. 对称性。 若 x.equals(y) 为 true,那么 y.equals(x) 为 true
  3. 传递性。 若 x.equals(y) 为 true 且 y.equals(z) 为 true,那么 x.equals(z) 也为 true
  4. 一致性。 对于 x.equals(y),只要判定信息不变,无论比较多少次结果均应相同。
  5. x != null 为 true,那么 x.equals(null) 为 false

© 著作权归作者所有

傅易
粉丝 28
博文 111
码字总数 69348
作品 0
海淀
后端工程师
私信 提问
Go语言_通神路之灵胎篇(6)

1、映射 1.1 概念 go的映射在java中被叫做集合 type Vertex struct { } var m map[string]Vertex 上面是go的映射m,如果用java代替的话,Vertex就是实体类,这样用java8可以写成 Map m = ne...

木九天
2018/08/22
34
0
Java ThreadLocal的内存泄漏问题

ThreadLocal提供了线程独有的局部变量,可以在整个线程存活的过程中随时取用,极大地方便了一些逻辑的实现。常见的ThreadLocal用法有: - 存储单个线程上下文信息。比如存储id等; - 使变量线...

我爱春天的毛毛雨
2018/11/14
13
0
深入JDK源码之ThreadLocal类

学习JDK中的类,首先看下JDK API对此类的描述,描述如下:该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程...

陶邦仁
2015/03/26
2.3K
6
探究ThreadLocal原理(基于Java8)

线程封闭 避免并发最简单的方法就是线程封闭。 即把对象封装到一个线程里,只有这一个线程能看到此对象。那么这个对象就算不是线程安全的也不会出现任何安全问题。 使用ThreadLocal是实现线程...

芥末无疆
2018/02/10
0
0
Groovy 快速开始

设置你的java环境 Groovy 需要 Java, 因此你需要有一个有效的版本(1.4 或者更高的版本是必需的),如果你尚未安装java,那么以下是你要做的步骤: 从站点 http://java.sun.com 获取最新版的...

红薯
2011/11/08
3K
6

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot-MVC RequestBody中LocalDateTime的自适应配置

请求的json报文中可能会出现 一下几种: ['2019-01-01','2019-01-01 12:03:34','20190101120334'] 但是接收的Request实体类日期字段是LocalDateTime类型 LocalDateTime applyDate; 希望的情况......

汉堡OSC
30分钟前
5
0
小招喵所在的国家正处于怪兽入侵的战场中,这个国家一共有n+1个城市

import java.util.Arrays; import java.util.Scanner; public class test3 { public static long max=0;public static void main(String[] args) { Scanner sc = new Scanner(System.i......

南桥北木
32分钟前
4
0
活动策划思维导图模板分享,怎样绘制思维导图操作方法介绍

对于一场活动的举办可以事先使用思维导图简略的将整个过程进行总结归纳使用,这样清晰的思维导图即利于工作的进行,也可以清晰明了了熟悉整个过程,下面是为大家分享的几款活动策划思维导图模...

干货趣分享
38分钟前
5
0
Android高级xml布局之输入框EditText设计

今天给大家介绍一下如何实现一款简约时尚的安卓登陆界面。大家先看一下效果图 当用户输入时动态出现删除按钮 现在先罗列一下技术点: 1.如何使用圆角输入框和按钮背景 2.如何实现“手机号”、...

shzwork
今天
4
0
RxJava进行单元测试的方式

@Test public void completeTask_retrievedTaskIsComplete() { // Given a new task in the persistent repository final Task newTask = new Task(TITLE, ""); ......

SuShine
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部