用自定义的类型作为HashMap的key,必须同时重载hashCode()和equals(),才可以实现在HashMap中的查找自定义键。

  例如自定义Point类:

public class Point {
private int x;
private int y; public Point(int x,int y) {
this.x = x;
this.y = y;
} public void setX(int x) {
this.x = x;
} public int getX() {
return x;
} public void setY(int y) {
this.y = y;
} public int getY() {
return y;
} @Override
public String toString() {
return "["+x+","+y+"]";
}
}

  示例:

  clusters数据示例:<String, Set<Point>> <用户,所有簇中心坐标列表>

  Point作为Map的键:

Map<Point, Set<String>> usersOfCertainPoint = new LinkedHashMap<Point, Set<String>>();//<网格坐标, 聚类中心点为该坐标的所有用户列表>
Iterator<Map.Entry<String, Set<Point>>> iterator = clusters.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String, Set<Point>> entry = iterator.next();
for(Point p : entry.getValue()){
if(!usersOfCertainPoint.containsKey(p)){//containsKey()出错
Set<String> userSet = new HashSet<String>();
userSet.add(entry.getKey());
usersOfCertainPoint.put(p, userSet);
}else{
usersOfCertainPoint.get(p).add(entry.getKey());
}
}
}

  错误输出示例:

  问题出在Point自动地继承自基类Object,所以这里使用Object的hashCode()方法生成散列码,而它默认是使用对象的地址计算散列码。因此即使是两个值相同的Point对象如[4515,-8198],因为其地址不同,所以生成的散列码不同。

  若只重载hashCode(),还是无法正常运行,必须同时重载equals()方法。在HashMap中,查找key的比较顺序为:

  1. 计算对象的hashCode,看在表中是否存在;
  2. 检查对应hashCode位置中的对象和当前对象是否相等。

  重载hashCode()和equals():

           @Override
public boolean equals(Object o){
if(this == o)//是否是本类的一个引用
return true;
if(!(o instanceof Point))
return false;
Point p = (Point)o;
return (p.x == this.x) && (p.y == this.y);
}
@Override
public int hashCode(){
int result = 17;
result = 31 * result + x;
result = 31 * result + y;
return result;
}

  正确输出示例:

最新文章

  1. 框架Hibernate笔记系列 基础Session
  2. linux下文件的特殊权限s和t
  3. javascript中String的fromCharCode()方法
  4. 模拟退火解决TSP问题
  5. spring 框架通过new Object()获取applicationContext 中的bean方案
  6. shutdown 和closesocket
  7. mongodb 数据备份,还原笔记
  8. 使用区域组织 ASP.NET MVC 应用程序
  9. poj-3895-Cycles of Lanes 简单DFS
  10. 基于jenkins搭建一个持续集成服务器
  11. 转贴---Linux服务器性能评估
  12. Java 读取Excel文件
  13. 全面解读Java NIO工作原理(1)
  14. redis的spring的xml配置
  15. Notyf - 超级简单、响应式的 JS 通知插件
  16. echarts2 饼图处理标签文字过长使之达到指定字数换行的目的
  17. day 24 socket 黏包
  18. Django settings介绍
  19. 面试:----Nginx的一理解
  20. The New Virtual List Box in Delphi 6 - lbVirtual lbVirtualOwnerDraw

热门文章

  1. PopupWindow 从底部弹出窗体
  2. Spring Cloud 简介
  3. CEPH安装教程(下)
  4. linux 内核与用户空间通信机制netlink初探
  5. JS的几条规则
  6. python之02数据类型学习-作业练习
  7. bzoj2502: 清理雪道(有源汇有上下界最小流)
  8. kuangbin专题十二 HDU1029 Ignatius and the Princess IV (水题)
  9. AT2044 Teleporter
  10. nexus私服的搭建和使用