java中map插入相同的key

测试用例:

package test;

import org.junit.Test;
import po.Person;

import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Map;

/**
 * Created by Administrator on 2015/9/16.
 */
public class TestMap {
    /**
     * map插入相同key问题,value会不会覆盖
     */
    @Test
    public void testMap(){
        //HashMap中key的内容相同,则覆盖
        Map<String,Object> map1 = new HashMap<>();
        map1.put("张三",1);
        map1.put("张三",2);
        map1.put(new String("张三"),3);  //根据String特性,这三条内容相同,前两条地址相同
        map1.put("李四", 4);
        for (String s : map1.keySet()) {
            System.out.println(s+"======"+map1.get(s));
        }
        /** 结果
         *   张三======3
             李四======4
         */

        System.out.println("=====================================");
        //IdentityHashMap中key的内存地址必须完全相同才会覆盖
        Map<String,Object> map2 = new IdentityHashMap<>();
        map2.put("张三",1);
        map2.put("张三",2);
        map2.put(new String("张三"),3);//
        map2.put("李四", 4);
        for (String s : map2.keySet()) {
            System.out.println(s+"===="+map2.get(s));
        }
        /**
         * 李四====4
         张三====2
         张三====3
         */

        System.out.println("=====================================");

        Map<Person,Object> map3 = new IdentityHashMap<>();
        map3.put(new Person("张三", 11), 1);
        map3.put(new Person("张三", 11), 3);
        map3.put(new Person("李四", 11), 4);
        for (Person s : map3.keySet()) {
            System.out.println(s.toString()+"===="+map3.get(s));
        }
        /**
         * po.Person@165474cf====1
         po.Person@3ff2caf4====4
         po.Person@2c0cd7d====3
         */
        System.out.println("=====================================");
        Person person = new Person("张三", 11);
        Person person2 = new Person("张三", 11);
        System.out.println(person.equals(person2));

    }
}
package po;

/**
 * Created by Administrator on 2015/9/16.
 */
public class Person {
    int id;
    String name;
    int age;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (id != person.id) return false;
        if (age != person.age) return false;
        return !(name != null ? !name.equals(person.name) : person.name != null);

    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + age;
        return result;
    }

    public Person(String name,int age){

        this.name=name;
        this.age=age;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏塔奇克马敲代码

第 15 章 面向对象程序设计

2003
来自专栏Play & Scala 技术分享

Scala基础 - 柯里化(Currying)及其应用

3169
来自专栏我的技术专栏

java与C++变量初始化的对比

863
来自专栏向治洪

JAVA中重写equals()方法的同时要重写hashcode()方法

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时...

1886
来自专栏精讲JAVA

Java知识点总结之Java泛型

712
来自专栏blackheart的专栏

[C#1] 6-方法

1.实例构造器[.ctor] 默认情况下,对于引用类型,如果我们没有显示的定义实例构造器,则C#编译器会为我们定义一个无参的公有实例构造器。 一个类的实例构造器...

1935
来自专栏Java帮帮-微信公众号-技术文章全总结

int与integer的区别

int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1...

3596
来自专栏微信公众号:Java团长

Java中的String为什么是不可变的?

众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个...

523
来自专栏猿人谷

C++拷贝构造函数

     拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)...

2108
来自专栏Android开发指南

6:异常处理

2678

扫描关注云+社区