设为首页 加入收藏

TOP

Java 中 HashMap 初始化的另一种方式详解
2014-11-23 22:15:48 来源: 作者: 【 】 浏览:11
Tags:Java HashMap 初始 方式 详解

目录


1、HashMap 初始化的文艺写法
2、推而广之
3、Java7:增加对 collections 的支持
4、文艺写法的潜在问题
5、执行效率问题
6、Refer:
如果你接触过不同的语言,


如果你接触过不同的语言,从语法和代码层面来说,Java 是一种不折不扣的“臃肿、啰嗦”的语言,从另一方面来说这种臃肿和啰嗦也体现了它严谨的一面,作为适合构建大型、复杂项目的理由之一。


1、HashMap 初始化的文艺写法


HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化:


HashMap map = new HashMap();
map.put("Name", "June");
map.put("QQ", "4889983");


看完这段代码,很多人都会觉得这么写太啰嗦了,对此,文艺青年一般这么来了:


HashMap map = new HashMap() {
{
put("Name", "June");
put("QQ", "4889983");
}
};


嗯,看起来优雅了不少,一步到位,一气呵成的赶脚。然后问题来了,有童鞋会问:纳尼?这里的双括号到底什么意思,什么用法呢?哈哈,其实很简单,看看下面的代码你就知道啥意思了。


public class Test {


/*private static HashMap map = new HashMap() {
{
put("Name", "June");
put("QQ", "4889983");
}
};*/


public Test() {
System.out.println("Constructor called:构造器被调用");
}


static {
System.out.println("Static block called:静态块被调用");
}


{
System.out.println("Instance initializer called:实例初始化块被调用");
}


public static void main(String[] args) {
new Test();
System.out.println("=======================");
new Test();


}
}


output:


Static block called:静态块被调用
Instance initializer called:实例初始化被调用
Constructor called:构造器被调用
=======================
Instance initializer called:实例初始化被调用
Constructor called:构造器被调用


Note:关于 static 的作用与用法如果不了解,请参考:


也就是说第一层括弧实际是定义了一个匿名内部类 (Anonymous Inner Class),第二层括弧实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。这个块之所以被叫做“实例初始化块”是因为它们被定义在了一个类的实例范围内。


上面代码如果是写在 Test 类中,编译后你会看到会生成 Test$1.class 文件,反编译该文件内容:


D:\eclipse_indigo\workspace_home\CDHJobs\bin\pvuv\>jad -p Test$1.class
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.linuxidc.com
// Decompiler options: packimports(3)
// Source File Name: Test.java


package pvuv.zhaopin;


import java.util.HashMap;


// Referenced classes of package pvuv.zhaopin:
// Test


class Test$1 extends HashMap // 创建了一个 HashMap 的子类
{


Test$1()
{ // 第二个 {} 中的代码放到了构造方法中去了
put("Name", "June");
put("QQ", "4889983");
}
}


D:\eclipse_indigo\workspace_home\CDHJobs\bin\pvuv\>


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇设计模式之 Java 中的单例模式(S.. 下一篇Linux驱动的两种加载方式过程分析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: