由于是自定义类型,所以HashMap中的equals()方法和hashCode()方法都需要自定义覆盖。

不然内容相同的对象对应的hashCode会不同,无法发挥算法的正常功能,覆盖equals方法,应该就相当于c++重载==运算符来保证能判断是否相等。只不过java没有自定义重载运算符这个功能的,需要进行方法覆盖。

equals的方法原型是 boolean equals(Object o);注意括号内,因为是继承自Object类,覆盖的是超类的方法。hashCode的方法原型就是int hashCode();

先看一段代码:

import java.util.*;
class Pair<V,K>{
V first;
K second;
public Pair() {first = null;second = null;}
public Pair(V f,K s){
first = f;
second = s;
}
// public boolean equals(Object o) {
// if(!(o instanceof Pair))
// {
// return false;
// }
// Pair<V,K> pn = (Pair<V,K>)o;
// return pn.first.equals(first) && pn.second.equals(second);
// }
// public int hashCode() {
// return first.hashCode() + second.hashCode();
// }
}
public class Main { public static void main(String[] args) {
Pair<String,String> p = new Pair<>("a","b");
Pair<String,String> q = new Pair<>("a","b");
System.out.println(p.equals(q));
System.out.println(p.hashCode() + " " + q.hashCode());
Map<Pair<String,String>,Integer> map = new HashMap();
map.put(p, 1);
System.out.println(map.containsKey(q));
map.put(q, 2);
for(Pair<String,String> key : map.keySet()) {
System.out.println(map.get(key));
}
}
}

这段代码把覆盖重写的两个方法给注释掉了,然后判断了值相同的两个Pair对象p和q是否相等,并输出了他们的hashCode,同时把p放进建立的HashMap中,用q来判断p是否存在,再把q放入,并遍历map的values。答案是:

false
2018699554 1311053135
false
1
2

然后:

import java.util.*;
class Pair<V,K>{
V first;
K second;
public Pair() {first = null;second = null;}
public Pair(V f,K s){
first = f;
second = s;
}
public boolean equals(Object o) {
if(!(o instanceof Pair))
{
return false;
}
Pair<V,K> pn = (Pair<V,K>)o;
return pn.first.equals(first) && pn.second.equals(second);
}
public int hashCode() {
return first.hashCode() + second.hashCode();
}
}
public class Main { public static void main(String[] args) {
Pair<String,String> p = new Pair<>("a","b");
Pair<String,String> q = new Pair<>("a","b");
System.out.println(p.equals(q));
System.out.println(p.hashCode() + " " + q.hashCode());
Map<Pair<String,String>,Integer> map = new HashMap();
map.put(p, 1);
System.out.println(map.containsKey(q));
map.put(q, 2);
for(Pair<String,String> key : map.keySet()) {
System.out.println(map.get(key));
}
}
}

然后把注释去掉之后的结果是:

true
195 195
true
2

虽然说这里的hashCode重写的没有什么道理,但是至少值相同的两个对象他们的hashCode是相同的,这样在HashMap中第一关判断hashCode是否相同就过了,接着再遍历判断是否有值相同的元素,可以判断是否含有某个键值,并更新键值的value等等。

而且要注意equals的覆盖,参数列表不可以因为是对于Pair对象的判断就改成Pair p,这样只是重载了并不是覆盖。

java自定义类型 作为HashMap中的Key值 (Pair<V,K>为例)的更多相关文章

  1. 一个关于自定义类型作为HashMap的key的问题

    在之前的项目需要用到以自定义类型作为HashMap的key,遇到一个问题:如果修改了已经存储在HashMap中的实例,会发生什么情况呢?用一段代码来试验: import java.util.HashM ...

  2. Python开发【笔记】:如何在字典遍历中删除key值?

    数据遍历时不能犯傻系列 前言: 针对字典做一些操作时,有时会遇到下面的状况,列如我们需要把data中的key值根据replace中的映射关系进行替换(Caller替换为caller) data = { ...

  3. 【java基础 12】HashMap中是如何形成环形链表的?

    导读:经过前面的博客总结,可以知道的是,HashMap是有一个一维数组和一个链表组成,从而得知,在解决冲突问题时,hashmap选择的是链地址法.为什么HashMap会用一个数组这链表组成,当时给出的 ...

  4. 使用自定义类型做qmap,qhash的key

    map在STL中的定义 template <class Key, class T, class Compare = less<Key>, class Alloc = alloc> ...

  5. Oracle自定义类型在C#中调用示例

    1.C#代码: 1)using Oracle.DataAccess.Types; using System; using System.Collections.Generic; using Syste ...

  6. React 中的key值

    在react中必须要有key值,key不是用来提升react的性能的,react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key p ...

  7. react中对于key值的理解

    1.key是用来帮助react识别哪些内容被更改.添加或者删除.key需要写在用数组渲染出来的元素内部,并且需要赋予其一个稳定的值.如果key值发生了变更,react则会触发UI的重渲染. 2.在相邻 ...

  8. JS 遍历JSON中每个key值

    JS 遍历JSON中的每个key值,可以按键值对进行存储: var myVar = { typeA: { option1: "one", option2: "two&qu ...

  9. iOS 中plist文件中配置key值冲突的现象

    iOS开发一些特殊的软件需要在项目中配置对应的key值,然而近期在项目中发现一个有意思的现象,苹果官方文档中提供的key值很多,但其实有一些彼此可能有冲突,当你同时配置了彼此冲突的key值,可能会出现 ...

随机推荐

  1. Java 嵌套类和内部类演示样例&lt;二&gt;

    嵌套类(nested class)是一个在还有一个类或接口内部声明的类. 嵌套类分为两种:静态内部类(static inner class)和非静态嵌套类(non-static nested clas ...

  2. 吐血整理:PyTorch项目代码与资源列表 | 资源下载

    http://www.sohu.com/a/164171974_741733   本文收集了大量基于 PyTorch 实现的代码链接,其中有适用于深度学习新手的“入门指导系列”,也有适用于老司机的论文 ...

  3. 实现RTSP网站微信直播方案EasyNVR(linux版)部署问题之:ERR_CONTENT_LENGTH_MISMATCH

    发现问题: 想要优化一下EasyNVR相关功能,内部测试软件,于是在linux系统中部署了一台EasyNVR.当部署好,运行起来发现问题: EasyNVR的配置页面数据出不来. 分析问题: 基于是we ...

  4. 常用脚本--查看死锁和阻塞usp_who_lock(转)

    USE [master] GO /****** Object: StoredProcedure [dbo].[sp_who_lock] Script Date: 02/07/2014 11:51:24 ...

  5. protect,internal的区别

    protected: 爷爷有一张银行卡,爸爸可以用,儿子也可以用,隔壁老王不可以用(因为老王跟爷爷没有继承关系) internal: 王总有一张银行卡,秘书可以用,经理可以用,王总儿子不可以用(因为银 ...

  6. 如果这种方式导致程序明显变慢或者引起其他问题,我们要重新思考来通过 goroutines 和 channels 来解决问题

    https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/09.3.md 9.3 锁和 sync 包 在一些复杂的程序中,通常通 ...

  7. java参数的值传递和引用传递

    今天抽了点时间继续啃java核心基础,即使出来做web挺长时间了,始终觉得基础极其重要. 遇到了java参数的传递类型,豁然开朗之时不忘写下记录. java中采用的总是值传递,包括对对象参数的传递,采 ...

  8. Oozie-1-安装、配置 让Hadoop流动起来

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wl101yjx/article/details/27881739 写在前面一: 本文总结 基于Had ...

  9. 【python】python调用shell方法

    在python脚本中,有时候需要调用shell获取一下信息,下面介绍两种常用的调用方法. 第一种,os.system() 这个函数获取的是命令的执行状态,比如 >>> import ...

  10. Java for LeetCode 088 Merge Sorted Array

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. 解题思路一: ...