java自定义类型 作为HashMap中的Key值 (Pair<V,K>为例)
由于是自定义类型,所以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>为例)的更多相关文章
- 一个关于自定义类型作为HashMap的key的问题
在之前的项目需要用到以自定义类型作为HashMap的key,遇到一个问题:如果修改了已经存储在HashMap中的实例,会发生什么情况呢?用一段代码来试验: import java.util.HashM ...
- Python开发【笔记】:如何在字典遍历中删除key值?
数据遍历时不能犯傻系列 前言: 针对字典做一些操作时,有时会遇到下面的状况,列如我们需要把data中的key值根据replace中的映射关系进行替换(Caller替换为caller) data = { ...
- 【java基础 12】HashMap中是如何形成环形链表的?
导读:经过前面的博客总结,可以知道的是,HashMap是有一个一维数组和一个链表组成,从而得知,在解决冲突问题时,hashmap选择的是链地址法.为什么HashMap会用一个数组这链表组成,当时给出的 ...
- 使用自定义类型做qmap,qhash的key
map在STL中的定义 template <class Key, class T, class Compare = less<Key>, class Alloc = alloc> ...
- Oracle自定义类型在C#中调用示例
1.C#代码: 1)using Oracle.DataAccess.Types; using System; using System.Collections.Generic; using Syste ...
- React 中的key值
在react中必须要有key值,key不是用来提升react的性能的,react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key p ...
- react中对于key值的理解
1.key是用来帮助react识别哪些内容被更改.添加或者删除.key需要写在用数组渲染出来的元素内部,并且需要赋予其一个稳定的值.如果key值发生了变更,react则会触发UI的重渲染. 2.在相邻 ...
- JS 遍历JSON中每个key值
JS 遍历JSON中的每个key值,可以按键值对进行存储: var myVar = { typeA: { option1: "one", option2: "two&qu ...
- iOS 中plist文件中配置key值冲突的现象
iOS开发一些特殊的软件需要在项目中配置对应的key值,然而近期在项目中发现一个有意思的现象,苹果官方文档中提供的key值很多,但其实有一些彼此可能有冲突,当你同时配置了彼此冲突的key值,可能会出现 ...
随机推荐
- HDU 2255 奔小康赚大钱 KM裸题
#include <stdio.h> #include <string.h> #define M 310 #define inf 0x3f3f3f3f int n,nx,ny; ...
- DDR电源硬件设计要点
一.DDR电源简介 1. 电源 DDR的电源可以分为三类: a.主电源VDD和VDDQ,主电源的要求是VDDQ=VDD,VDDQ是给IO buffer供电的电源,VDD是给但是一般的使用中都是把VDD ...
- vim 模式查找
1. / 正向查找, ?反向查找 2. \v 激活very magic搜索模式,撰写正则表达式更接近于perl的正则表达式,大多数字符不需要进行转义 3. \V 激活noVeryMagic模式,按字符 ...
- Bootstrap学习速查表(三) 表单
表单中常见的元素主要包括:文本输入框.下拉选择框.单选按钮.复选按钮.文本域和按钮等. 一.基础表单 1.初始化:对于基础表单,Bootstrap并未对其做太多的定制性效果设计,仅仅对表单内的fiel ...
- iptables简易使用教程
iptables是linux里比较常用的防火墙,也是centos7.0之前的版本默认自带的防火墙. 配置防火墙需特别注意一件事情:如果服务器在异地机房,需要谨慎配置端口,以免造成新配置生效后无法远程登 ...
- hdu2473 Junk-Mail Filter 并查集+删除节点+路径压缩
Description Recognizing junk mails is a tough task. The method used here consists of two steps: 1) ...
- Spring Cloud 微服务一:Consul注册中心
Consul介绍 Consul is a service mesh solution providing a full featured control plane with service disc ...
- 【React Native开发】React Native控件之RefreshControl组件具体解释(21)
),React Native技术交流4群(458982758)种 enabled bool android平台适用 用来设置下拉刷新功能是否可用 progressBackgroundColo ...
- 消息队列activeMq 使用介绍
深入浅出 消息队列 ActiveMQhttp://blog.csdn.net/jwdstef/article/details/17380471 一. 概述与介绍 ActiveMQ 是Apache出 ...
- MANIFEST.MF 文件内容完全详解(转)
打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录, 这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANI ...