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

您所在的位置:网站首页 hashmap创建对象 聊聊 Java 中 HashMap 初始化的另一种方式

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

2024-07-17 06:14| 来源: 网络整理| 查看: 265

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

1、HashMap 初始化的文艺写法

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

代码语言:javascript复制HashMap map = new HashMap(); map.put("Name", "June");    map.put("QQ", "2572073701");

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

代码语言:javascript复制HashMap map = new HashMap() {     {         put("Name", "June");            put("QQ", "2572073701");       } };

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

代码语言:javascript复制public class Test {     /*private static HashMap map = new HashMap() {         {             put("Name", "June");             put("QQ", "2572073701");         }     };*/     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:

代码语言:javascript复制Static block called:静态块被调用 Instance initializer called:实例初始化被调用 Constructor called:构造器被调用 ======================= Instance initializer called:实例初始化被调用 Constructor called:构造器被调用

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

http://my.oschina.net/leejun2005/blog/193439#OSC_h3_1  为什么 main 方法是 public static void?

http://my.oschina.net/leejun2005/blog/144349#OSC_h3_2  设计模式之:聊聊 java 中的单例模式(Singleton)

也就是说第一层括弧实际是定义了一个匿名内部类 (Anonymous Inner Class),第二层括弧实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。这个块之所以被叫做“实例初始化块”是因为它们被定义在了一个类的实例范围内。 上面代码如果是写在 Test 类中,编译后你会看到会生成 Test$1.class 文件,反编译该文件内容:

代码语言:javascript复制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.kpdus.com/jad.html // 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", "2572073701");     } } D:\eclipse_indigo\workspace_home\CDHJobs\bin\pvuv\>2、推而广之

这种写法,推而广之,在初始化 ArrayList、Set 的时候都可以这么玩,比如你还可以这么玩:

代码语言:javascript复制List names = new ArrayList() {     {         for (int i = 0; i 


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3