直接看代码吧 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");
}这两种方法有区别?
{
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");
}这两种方法有区别?
第一种方法大概是利用创建匿名类的方式 在HashMap里加入了原本没有的对象代码块(不是类代码块 是对象代码块)
然后在窗在对象的时候执行这个代码块内部的代码
第二种是在你当前使用该HASHMAP的类里加入类代码块 一但该类被加载便执行该代码块的代码如果要说有啥不同的话 他俩的意义是不同 因为一个是在创建HASHMAP的时候给他提供个动态对象代码块让他执行初始化操作
另一个是在使用HASHMAP的类被加载的时候执行该操作 这大概就是区别吧
1.我们知道JVM分为两个区域,一个静态区域称为堆,一个动态区称为栈.2.堆存放的是我们使用的对象名称.3.栈存放的是我们实例化后的对象,对象已地址形式存放,其堆中的对象指针会指向栈中的对象地址.4.当我们使用static关键字为某个对象定义时,JVM默认此对象永远保存在堆中,指针永远指向此对象名称.5.如果使用匿名static函数,JVM默认会计算散列,并把结果视为此函数的名称,指针永远指向此函数.那通过上述5点的理解,那应该明白效率谁比较快了,比较安全了,指针直接指向对象是很容易控制的,而通过匿名函数作为介质,而获得的对象是不容易控制的,这里指的不是开发人员的控制,指的是JVM自省机制能否监控,从而能频繁的通知GC扫描对象状态,防止内存溢出和空间不足的错误.以上只是个人经验总结,不代表什么,希望对楼主有所溢出.