`
zhangxiang390
  • 浏览: 214861 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Map中键为自定义类型时注意的问题

阅读更多

Map的get()源码如下:

public V get(Object key) {

        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode()); //返回key对应的hash值
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) { // 调用equals()逐个比较key集合中有无与形参相同的键值
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
}

当Map的key是自定义的对象类型时,要在自定义类中,重载Object类的两个方法,hashCode()和equals(),使得满足自己定义的“相同”的含义,这样才能用“相同”的key取到合适的value。

例子:

 

public class Point {
	private int x;
	private int y;

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public String toString(){
		return "["+x+" , "+y+"]";

	}
	public static void main(String[] args){
               Map<Point,Integer> m=new Map<Point,Integer>();
               m.put(new Point(1,2),3);
               System.out.println(m.get(new Point(1,2));// result: null
	}
}

  以上代码的不足之处是没有重载hashCode和equals方法,纠正如下:

public class Point {
	private int x;
	private int y;

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public String toString(){
		return "["+x+" , "+y+"]";

	}
	public boolean equals(Object o){
		System.out.println(">> in Point.equals()");
		if(((Point)o).getX()==x && ((Point)o).getY()==y)
			return true;
		return false;
	}
	public int hashCode(){
		System.out.println(">> in Point.hashCode()");
		return x*10+y;
	}
	public static void main(String[] args){
               Map<Point,Integer> m=new Map<Point,Integer>();
               m.put(new Point(1,2),3);
               System.out.println(m.get(new Point(1,2));// result: 3
	}
}
 
分享到:
评论

相关推荐

    MAPGIS地质制图工具

    本系统是在Windows XP系统和MapGis6.7(B20051118)基础上,以Microsoft VC++ 6.0为编程语言,MapGis 6.7 SDK为开发平台进行开发的地质图件制作软件。系统基于MapGis输入编辑子系统强大的图形编辑能力,添加专业的地质...

    魔兽rpg编程 脚本 j文件编辑 Jass shop

    如果已经有一个JassShopPro在运行中,再次双击注册为用JSP打开的类型的文件时,将在已启动的文档中打开文件。同样,支持拖放操作,可以直接将文件拖到窗口中打开 自动完成功能 输入“set ”,将自动显示本地变量与...

    MCUTool.exe 源代码

    可以设为固定长度或定义首/尾标志,设置内存中实际起始地址,显示时和计算变量时用;由map文件自动读取内存变量(因条件所限,目前只支持由 ImageCraft C(ICC) 编译器产生的map文件,欢迎提供其他编译器的map文件...

    基于C++与SDL实现的迷宫游戏源码+项目说明(大一课设).zip

    2. 在制造地图时,↑↓←→ 控制地图视角,左键可以画点、更换点类型,右键可以删除点 3. 注意!制造地图时,绿色块是墙(就是游玩时候的树),树是开始点,end 是结束点! 为了制作方便我就这么设置了 QAQ 4. 制造...

    BaiduMapAPI:百度Map API及其扩展

    具体的设置方法是在Info.plist文件中添加一个键Bundle display name,类型String,值填写你的应用的名字。 iOS9下百度地图不能联网 苹果在iOS9中默认情况下要去开发者必须全部使用HTTPS方式进行安全通信。但是事实是...

    jQuery 1.6 API 中文版

    默认: true, dataType为"script"和"jsonp"时默认为false 如果设置为 false ,浏览器将不缓存此页面。 complete(jqXHR, textStatus)Function, Array 请求完成后回调函数 (请求成功或失败之后均调用)。这个回调...

    jquery-1.1.3 效率提高800%

    jQuery.get( url, [data], [callback] )参数: url (String): 装入页面的URL地址 Map(可选): (可选)发送到服务端的键/值对参数 callback (Function): (可选) 当远程页面装入完成时执行的函数 ...

    effective stl stl 技巧

    条款24:当关乎效率时应该在map::operator[]和map-insert之间仔细选择 条款25:熟悉非标准散列容器 迭代器 条款26:尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator 条款27:用...

    Effective STL(中文)

    在删除选项中仔细选择 条款10:注意分配器的协定和约束 条款11:理解自定义分配器的正确用法 条款12:对STL容器线程安全性的期待现实一些 vector和string 条款13:尽量使用vector和string来代替动态...

    超级有影响力霸气的Java面试题大全文档

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    java 面试题 总结

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    C++MFC教程

    对于初学者:应该选择一些内容比较全面的书籍,并且书籍中的内容应该以合理的方式安排,在使用该书时可以达到循序渐进的效果,书中的代码要有详细的讲解。尽量买翻译的书,因为这些书一般都比较易懂,而且语言比较...

    scala从入门到精通技术教学视频

    2,生动形象,化繁为简,讲解通俗易懂。 3,结合工作实践及分析应用,培养解决实际问题的能力。 4,每一块知识点, 都有配套案例, 学习不再迷茫。 课程简介 第一章 环境搭建 00.导学 01.Scala简介 02.Scala程序和Java...

    freemarker总结

    在表达式中使用算术运算符时要注意以下几点: 1,运算符两边的运算数字必须是数字 2,使用+运算符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串再连接,如:${3 + "5"},结果是:35 使用内建的int函数可...

    网管教程 从入门到精通软件篇.txt

    如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。 Diskpart  创建和删除硬盘...

    精通ANDROID 3(中文版)1/2

    6.6.5 为各种设备配置自定义布局  6.7 使用Hierarchy Viewer调试和优化布局  6.8 参考资料  6.9 小结  第7章 使用菜单  7.1 Android菜单  7.1.1 创建菜单  7.1.2 使用菜单组  7.2 响应菜单项  7.3...

    精通Android 3 (中文版)2/2

    6.6.5 为各种设备配置自定义布局  6.7 使用Hierarchy Viewer调试和优化布局  6.8 参考资料  6.9 小结  第7章 使用菜单  7.1 Android菜单  7.1.1 创建菜单  7.1.2 使用菜单组  7.2 响应菜单项  7.3...

    net学习笔记及其他代码应用

    33.写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。 答:解1: select top 10 * from A where id not in (select top 30 id from A) 解2: select top 10 * ...

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

    arcgis工具

    在ArcCatalog下新建一个要素类(要素类型为:多边形),命名为:ClipPoly.shp 在ArcMap中,加载栅格数据:Landuse、和ClipPoly.shp 打开 编辑器工具栏,开始编辑ClipPoly ,根据要剪切的区域,绘制一个任意形状的多...

Global site tag (gtag.js) - Google Analytics