深入理解java中HashMap的使用

原创 2016年08月31日 11:35:20

当你自己创建用作hashMap的键的类,用可能会忘记其中需要覆盖的一些必须方法,而这种会是一个致命的错误
例如,有两个对象,将Person对象与Dog对象联系起来,这看起来很简单,使用Person作为键,Dog作为值:

public class Person{
    protected int number;
    public Person(int i){ number = i;}
    public String toString(){
        return "Person " + number;
    }
}

public class Dog{
    private static Random rand = new Random(47);
    private boolean shadow = rand.nextInt();
    public String toString(){
        if(shadow){
            return "dog is likely";
        }else{
            return "dog is badly";
        }
    }
}

public class App{
    public static <T extends Person> void execute(Class<T> type){
        Constructor<T> ghog = type.getConstructor(int.class);
        Map<Person, Dog> map = new HashMap<Person, Dog>();
        for(int i= 0; i < 10; i ++){
            map.put(ghog.newInstance(i), new Dog());    
        }
        print("map = " + map);
        Person p = ghog.newInstance(3);
        print("Look up for " + p);
        if(map.containsKey(p)){
            print(map.get(gh));
        }else{
            print("key not found: " + p);
        }
    }

    public static void main(String[] args) throws Exception{
        execute(Person.class);
    }

    //output
}

每个Person被赋予一个数字,于是可以在HashMap中查找值,但

Person是自动继承Object的,所以这里的使用了Object的

hashcode()方法生成散列码,而他默认使用对象地址计算散列码,

因此,两者之间其实是不同的键,所以这里,我们需要覆盖原始的hashCode方法和equals方法,

正确的equals方法必须满足五个条件:

  1. 自反性。对任意的x, x.equals(x)一定返回true;
  2. 对称性。对任意x和y,如果y.equals(x)返回true, 则x.equals(y)也 返回true;
  3. 传递性。对任意x,y,z ,如果有x.equals(y)返回true; y.equals(z)返回true,则x.equals(z)一定返回true;
  4. 一致性。对任意x和y,如果对象中用于等价比较的信息没有改变,那么无论调用多少次,返回的都是一致的,
  5. 对任何不是null的x, x.equals(null)一定返回false

深入理解HashMap(精华必看)

原文地址:http://www.iteye.com/topic/539465     Hashmap是一种非常常用的、应用广泛的数据类型,最近研究到相关的内容,就正好复习一下。网上关于has...
  • jdjdndhj
  • jdjdndhj
  • 2017年01月13日 12:00
  • 11045

深入理解Java中的多线程

在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。 对于直接继承Thread的类来说,代码大致框架是: class 类名 extends Thread...
  • hashsound_Wang
  • hashsound_Wang
  • 2013年07月02日 16:26
  • 4947

深入理解Java中的Map

Map中的key是如何确保重复验证的快速性及key值的唯一性呢? 巧妙地利用了Hash算法来实现并达到重复验证的快速性及key值的唯一性。那么Hash又是什么? Hash算法又称为散列算法,其实H...
  • G1248019684
  • G1248019684
  • 2016年05月11日 19:44
  • 1910

Java 深入理解与感悟

Java 不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统,移动终端,企业服务器和大型机等各种...
  • architect_zero
  • architect_zero
  • 2016年07月27日 00:11
  • 570

深入理解Java中的面向对象

深入理解Java中的面向对象
  • a2011480169
  • a2011480169
  • 2016年08月03日 09:13
  • 5178

深入理解java---反射篇

深入理解java---反射篇  背景    在Java中如果我们预先不知道一个对象的确切类型,RTTI可以告诉你,但是有一个限制,那就是在编译的时候这个对象类型必须是确定的(需要有一个确定的编译类型...
  • yinbingqiu
  • yinbingqiu
  • 2016年10月29日 10:37
  • 634

深入理解Java——IO

一、File 类java.io.File类是文件和目录路径名的抽象表示。以下是有关文件的要点: 实例表示实际的文件系统对象,如文件或目录。如果是这样表示这样一个对象,然后该对象位于一个分区。分区是存储...
  • u013249965
  • u013249965
  • 2016年08月11日 17:41
  • 389

【深入理解Java虚拟机】类加载机制

本文内容来源于《深入理解Java虚拟机》一书,非常推荐大家去看一下这本书。本系列其他文章:【深入理解Java虚拟机】Java内存区域模型、对象创建过程、常见OOM【深入理解Java虚拟机】垃圾回收机制...
  • shakespeare001
  • shakespeare001
  • 2016年06月27日 07:53
  • 5921

深入理解Java中的流

首先,流是什么? 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行。设备可以是文件,网络,内存等。 流具有方向性,至于是输入...
  • hhooong
  • hhooong
  • 2016年08月07日 16:08
  • 174

《深入理解Java虚拟机》学习笔记

本篇是《深入理解Java虚拟机-Java 高级特性与最佳实践》学习笔记,周志明著,Understanding the JVM-Advanced Features and Best Practices,...
  • puma_dong
  • puma_dong
  • 2014年02月23日 11:01
  • 4534
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入理解java中HashMap的使用
举报原因:
原因补充:

(最多只允许输入30个字)