直接看代码吧 public static Map<Integer, String> SYSTEM = new HashMap<Integer, String>(){
{
put(1, "aaa");
put(2, "bbb");
put(3, "ccc");
}
};

public static Map<Integer, String> SYSTEM ;
static {
SYSTEM = new HashMap<Integer, String>();
SYSTEM.put(1, "aaa");
SYSTEM.put(2, "bbb");
SYSTEM.put(3, "bbb");
}这两种方法有区别?

解决方案 »

  1.   

    常量应该用Collections.unmodifiableMap(SYSTEM)
      

  2.   

    前者为通知JVM给MAP一个静态对象的内存块,指针指向的是MAP对象,这样的效率会比较高...后者为通知JVM给MAP对象一个静态的内存块,指针指向的是这个内存块的地址,而内存块中的MAP对象需要在每次被通知后,才会够使用到,这样的后果在于,当数据为海量数据时,此MAP的空间会无限加大,从而变为内存溢出错误,原因是此处的内存不是为MAP而分配的,它只是通知JVM我需要这样的一个无需实例化就能拥有的内存块,而前者不一样,因为前者在JVM中的指针已指向了静态MAP对象,所以JVM可以有效地控制此对象的空间大小,GC能隔一时间段检查此对象的状态....
      

  3.   


    第一种方法大概是利用创建匿名类的方式 在HashMap里加入了原本没有的对象代码块(不是类代码块 是对象代码块)
    然后在窗在对象的时候执行这个代码块内部的代码
    第二种是在你当前使用该HASHMAP的类里加入类代码块 一但该类被加载便执行该代码块的代码如果要说有啥不同的话 他俩的意义是不同 因为一个是在创建HASHMAP的时候给他提供个动态对象代码块让他执行初始化操作
    另一个是在使用HASHMAP的类被加载的时候执行该操作 这大概就是区别吧
      

  4.   

    窗在 = 创建Java 超级群群号53596919 大多时间在灌水 不过也会回答技术问题的
      

  5.   

    这样说吧:
    1.我们知道JVM分为两个区域,一个静态区域称为堆,一个动态区称为栈.2.堆存放的是我们使用的对象名称.3.栈存放的是我们实例化后的对象,对象已地址形式存放,其堆中的对象指针会指向栈中的对象地址.4.当我们使用static关键字为某个对象定义时,JVM默认此对象永远保存在堆中,指针永远指向此对象名称.5.如果使用匿名static函数,JVM默认会计算散列,并把结果视为此函数的名称,指针永远指向此函数.那通过上述5点的理解,那应该明白效率谁比较快了,比较安全了,指针直接指向对象是很容易控制的,而通过匿名函数作为介质,而获得的对象是不容易控制的,这里指的不是开发人员的控制,指的是JVM自省机制能否监控,从而能频繁的通知GC扫描对象状态,防止内存溢出和空间不足的错误.以上只是个人经验总结,不代表什么,希望对楼主有所溢出.