手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Java 中 HashMap 初始化的另一种方式详解

[日期:2014-06-22] 来源:Linux社区  作者:leejun2005 [字体: ]

目录

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

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

1、HashMap 初始化的文艺写法

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

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

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

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

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

public class Test {

    /*private static HashMap<String, String> map = new HashMap<String, String>() {
        {
            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 的作用与用法如果不了解,请参考:

http://www.linuxidc.com/Linux/2014-06/103541.htm 为什么 main 方法是 public static void?

http://www.linuxidc.com/Linux/2014-06/103542.htm 设计模式之 Java 中的单例模式(Singleton)

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

编写高质量代码 改善Java程序的151个建议 PDF高清完整版 http://www.linuxidc.com/Linux/2014-06/103388.htm

Java 8简明教程 http://www.linuxidc.com/Linux/2014-03/98754.htm

Java对象初始化顺序的简单验证 http://www.linuxidc.com/Linux/2014-02/96220.htm

Java对象值传递和对象传递的总结 http://www.linuxidc.com/Linux/2012-12/76692.htm

Java对象序列化ObjectOutputStream和ObjectInputStream示例 http://www.linuxidc.com/Linux/2012-08/68360.htm

本文永久更新链接地址http://www.linuxidc.com/Linux/2014-06/103535.htm

上面代码如果是写在 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\>

更多详情见请继续阅读下一页的精彩内容http://www.linuxidc.com/Linux/2014-06/103543p2.htm

linux
相关资讯       HashMap  Java HashMap  HashMap初始化 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款