在使用HashMap的时候,偶然发现,new的两个HashMap对象的mm和mn是一样的内存地址,甚至指定的键值类型不同也会指向同一个地址。但是如果往其中的一个HashMap添加键值对以后,就会变两个不同的内存地址了。而这种情况并不是所有的类都存在的,Object类就不存在这种情况。猜测可能是Java中为了节省内存,空HashMap的时候全都指向同一个地址,当HashMap开始变化的时候才会改变。无论是一开始刚实例化的空HashMap,还是中间增增删删导致HashMap变成的空HashMap,全都指向同一个地址。更深的原理可能必须等我学习透Java的时候再来更新~
而String类型相同的内容就是会指向同一个常量,因为String是不可变的(看源码会发现是带final修饰符的)
package com.hbq.collectionsuse;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
public class HashMapUse {
public static void main(String[] args) {
HashMap<String,Integer> mm =new HashMap<>();
HashMap<String,Integer> mn =new HashMap<>();
HashMap<Integer,String> mnm= new HashMap<>();
System.out.println("mm和mn是同地址吗"+mm.equals(mn));//true 是同一个
System.out.println("mm和mnm是同地址吗"+mm.equals(mnm));//true
mm.put("id",8);
System.out.println("mm和mn是同地址吗"+mm.equals(mn));//false
mm.remove("id");
System.out.println("mm和mn是同地址吗"+mm.equals(mn));//true 删除后又是同一个地址了
System.out.println(mm.hashCode());
System.out.println(mn.hashCode());
Object s=new Object();
Object a= new Object();
System.out.println(s.equals(a));//false
String ss="abc";
String sa="abc";
System.out.println(ss==sa);
}
}