`
fantaxy025025
  • 浏览: 1248639 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Java_Map_初始化及其他

阅读更多

null

--------------------------摘----------------------------

初看 cgaolei 翻译的 Java技巧之双括弧初始化 一文,走马观花,只知用法,未细看后面的解释。蔚为惊艳,心里想 Java 竟然有这么神奇的语法而一直未得知。因为在初始化集合时确实方便不少。原来做某些测试要初始化集合时会用到 commons-lang 包和 JDK 的 Arrays 工具类,现在知道可以这么用了:


01. Map map = new HashMap() {{
02.          put( "Name" , "Unmi" );
03.          put( "QQ" , "1125535" );
04. }};
05.  
06. List stooges = new ArrayList() {{
07.          add( "Larry" );
08.          add( "Moe" );
09.          add( "Curly" );
10. }};

 
看起来都是在一条语句里完成,而不需要分步骤写成:


1. Map map = new HashMap();
2. map.put( "Name" , "Unmi" );
3. map.put( "QQ" , "1125535" );



一 不小心没好好理解的人可能以为它是什么特别的语法,关键是大括号连一块了,原作者也是在故作姿态,美其名曰:双括弧语法(double-brace syntax)。真是乱花渐欲迷人眼,其实就是匿名类加初始块。该文有解释:第一层括弧 实际是定义了一个内部匿名类 (Anonymous Inner Class),第二层括弧 实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。

那怎么去更好理解它呢?如果我们写成如下的方式应该会更好理解吧,提个技巧,在 Eclipse 中对第一段代码按下 Ctrl + Shift + F 就如下了:


1. Map map = new HashMap() {
2.      {
3.          put( "Name" , "Unmi" );
4.          put( "QQ" , "1125535" );
5.      }
6. };


其 实就是匿名类啊,会创建出一个 HashMap 的子类来,匿名类中一个 {} 括起来的初始化块,里面自然可放置初始化代码。{} 块中的代码编译后会放到 <init>(),也就是构造方法中去,所以可用来初始化实例。如果是写在 TestDoubleBrace 类中,编译后你会看到会生成 TestDoubleBrace$1.class 文件,反编译该文件内容是:


01. final class com.unmi.TestDoubleBrace$1 extends java.util.HashMap{ //创建了一个 HashMap 的子类 TestDoubleBracke$1
02. com.unmi.TestDoubleBrace$1();
03.    Code:
04.     0:   aload_0
05.     1:   invokespecial   #8; //Method java/util/HashMap."<init>":()V   //{} 中的代码放到了构造方法中去了
06.     4:   aload_0
07.     5:   ldc     #10; //String Name
08.     7:   ldc     #12; //String Unmi
09.     9:   invokevirtual   #14; //Method put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
10.     12:  pop
11.     13:  aload_0
12.     14:  ldc     #18; //String QQ
13.     16:  ldc     #20; //String 1125535
14.     18:  invokevirtual   #14; //Method put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
15.     21:  pop
16.     22:  return
17.  
18. }



所以说白了,什么双括弧语法啊,就是代码写得不规范,才使得那么的令人费解。如果还不能理解,再列两个惯用代码来:


01. JFrame frame = new JFrame();
02. frame.addMouseListener( new MouseAdapter() {
03.      public void mouseClicked(MouseEvent e) {
04.          // do womething here.
05.      }
06. });
07.  
08. Thread thread = new Thread() {{ // 也学着样把大括号也连一块写了
09.          this .setName( "作业处理线程" );
10.      } // 如果不重新定义 run() 方法,那么后面那个大括号也能与这个并一块
11.  
12.      public void run() {
13.          // do something here.
14.      }
15. };
16. thread.start();



应该没问题了吧,上面是事件监听器和多线程常用的写法,如果他不把大括号连在一起,而是规范的写代码,相信您一开始也不会对所谓的 Double Brace Syntax 有太多的困惑。要说这种初始化方法运用到集合中还挺方便的,只是无端的多了些匿名类。

刚 开始我看到这种双括符写法也是把它奉若圣经,对它只一知半解,昨天在用 XStream 把一个对象生成 XML 文件时,其中有一个 List 属性,我就借用了这种双括符法来初始化元素,结果生成的 XML 文件走了样,原因是 XStream 的 Converter 能处理 ArrayList,但无法很好的处理生成的 ArrayList 的匿名子类。因此才回头认真的重新审视了一番这个所谓的双括符初始化语法。

 

 

参考:

http://www.iteye.com/topic/412868

http://www.blogjava.net/Unmi/archive/2009/08/12/290845.html

http://www.iteye.com/topic/418542

分享到:
评论

相关推荐

    Java中List与Map初始化的一些写法

    Java的在还没有发现新写法之前时,我一直是这么初始化List跟Map: //初始化List List list = new ArrayList(); list.add("string1"); list.add("string2"); //some other list.add() code…… list.add(...

    Java中List与Map初始化的一些写法分享

    主要介绍了Java中List与Map初始化的一些写法有需要的朋友可以参考一下

    java中hashmap容量的初始化实现

    主要介绍了java中hashmap容量的初始化实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java在hashmap初始化时赋初值过程解析

    主要介绍了java在hashmap初始化时赋初值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java源码解析ConcurrentHashMap的初始化

    今天小编就为大家分享一篇关于Java源码解析ConcurrentHashMap的初始化,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    举例详解Java编程中HashMap的初始化以及遍历的方法

    主要介绍了Java编程中HashMap的初始化以及遍历的方法,是Java入门学习中的基础知识,需要的朋友可以参考下

    Java中如何实现不可变Map详解

    主要给大家介绍了关于Java中如何实现不可变Map的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作工具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    谈谈Java中遍历Map的几种方法

     先初始化一个map public class TestMap {  public static Map&lt;Integer&gt; map = new HashMap();  }  keySet values  如果只需要map的key或者value,用map的keySet或values方法无疑是方便的  // KeySet ...

    Java 基础核心总结 +经典算法大全.rar

    类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...

    骑士飞行棋(JAVA项目案例)

    * 初始化游戏的一局 */ public void init(){ //创建Map对象 //生成地图 map.createMap(); //设置玩家1起始位置 playerPos1 = 0; //设置玩家2起始位置 playerPos2 = 0; //记录玩家1...

    Java面试题合集最新版2024.zip

    数据类型、变量与运算符:理解Java中的基本数据类型、变量声明与初始化,以及常用的运算符和表达式。 控制流语句:熟悉if-else、switch、for、while等控制流语句的用法。 面向对象编程:深入理解Java中的类、对象、...

    java面试宝典

    141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS...

    pay-demo.zip

    使用策略模式构建支付模块,根据spring初始化容器时候,将实现类接口信息放入map中,再根据具体的key值取得具体的实现类

    2024年Java高工面试题 2024年Java高工面试题 2024年Java高工面试题

    2024年Java高工面试题 JVM虚拟机:堆、方法区(元空间)、栈(线程)、本地方法栈、程序计数器 ...推断构造方法、实例化、属性填充、初始化前、初始化、初始化后等其中AOP就是发生在初始化后这一步

    源码deepbeliefnetworksjava-AI_Map:人工智能发展地图

    源码深信网络java AI_Map 人工智能发展地图。 人工智能是一个非常广泛且不断发展的计算机科学领域。 随着时间的推移,这个 repo 将被更新和扩展。 随时欢迎您的贡献。 “人工智能是新的电力”吴恩达。 经典人工智能 ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    2.5.4 初始化托管Bean的属性 85 2.5.5 通过FacesContext访问应用环境 89 2.6 导航模型 91 2.6.1 静态导航 93 2.6.2 动态导航 93 2.7 使用UI标签创建视图页面 94 2.7.1 UI标签概述 94 2.7.2 UI标签的通用属性 97 ...

    疯狂JAVA讲义

    1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发...

    Java并发编程实战

    2.2.2 示例:延迟初始化中的竞态条件 2.2.3 复合操作 2.3 加锁机制 2.3.1 内置锁 2.3.2 重入 2.4 用锁来保护状态 2.5 活跃性与性能 第3章 对象的共享 3.1 可见性 3.1.1 失效数据 3.1.2 非原子的64位操作 ...

    JAVA基础课程讲义

    静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? ...

Global site tag (gtag.js) - Google Analytics