深入理解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

java hashMap和TreeMap区别深入理解

首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value...

Java中HashMap和TreeMap的区别深入理解

首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。这就是我们平时说的键值对。 ...

Java中HashMap和TreeMap的区别深入理解

Java中HashMap和TreeMap的区别首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做...

Java 集合深入理解(16):HashMap 主要特点和关键方法源码解读

[+] 点击查看 Java 集合框架深入理解 系列 -  -  乾杯 什么是 HashMapHashMap 的特点HashMap 的 13 个成员变量HashMap 的初始容量和加载因子Has...

JAVA_深入理解HashMap

原文地址:http://www.iteye.com/topic/539465   /**      *@author annegu      *@date 2009-12-02   ...
  • jwiang
  • jwiang
  • 2016年03月15日 13:48
  • 167

Java中HashMap和TreeMap的区别深入理解

首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value 首先介绍一下什么是Map。在...

深入理解Java中的HashMap的实现原理

HashMap继承自抽象类AbstractMap,抽象类AbstractMap实现了Map接口。关系图如下所示: Java中的Map接口允许我们将一个对象作为key,也就是可...

Java中HashMap和TreeMap的区别深入理解

首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value 首先介绍一下什么是Map。在数组中...

深入理解HashMap-java

Hashmap是一种非常常用的、应用广泛的数据类型,最近研究到相关的内容,就正好复习一下。网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论。  1、ha...

Java中HashMap和TreeMap的区别深入理解

首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对。   ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入理解java中HashMap的使用
举报原因:
原因补充:

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