`
fantaxy025025
  • 浏览: 1279137 次
  • 性别: 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(...

    MapUtils_java_Maputils_

    这个名为"MapUtils_java_Maputils_"的资源可能是一个包含静态方法的工具类,用于简化Map的常见操作,如初始化、添加元素、获取值等。下面将详细介绍Map接口和MapUtils类在Java中的使用及其相关知识点。 **1. Map...

    java中hashmap容量的初始化实现

    "Java中HashMap容量的初始化实现" Java中HashMap容量的初始化实现是非常重要的,特别是在大规模数据处理时。HashMap的容量初始化可以极大地影响程序的性能。在本文中,我们将详细介绍Java中HashMap容量的初始化实现...

    mapserver+java 配置及实例,网上项目报错已修改

    1. 初始化Map对象。 2. 加载图层。 3. 设置地图范围和视图。 4. 渲染地图图像。 5. 可选:执行查询、缓冲区分析等空间操作。 6. 关闭Map对象,释放资源。 总之,配置MapServer与Java的集成涉及到Mapfile的正确编写...

    6种方法初始化JAVA中的list集合

    在Java编程中,List集合是开发人员经常使用的一种数据结构,用于存储有序的元素列表。本文将详细介绍6种初始化Java List集合的方法,并通过代码示例帮助理解...在处理Map和Set集合时,也可以参考类似的方法进行初始化。

    java_Java_学习笔记.zip

    - 变量声明与初始化:理解变量的作用域和生命周期。 - 控制流语句:如条件语句(if-else)、循环(for、while、do-while)。 4. **类与对象**: - 类的定义:包括属性(字段或成员变量)和方法(函数)。 - ...

    java_JAVA_WEB基本教程

    类是Java中面向对象编程的核心概念,而构造函数则是用于初始化类的实例的重要方法。构造函数的命名与类名相同,没有返回类型,并在创建类的新实例时自动调用。构造函数可以有参数,也可以不带参数,用于不同的初始化...

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

    Java 在 HashMap 初始化时赋初值过程解析 Java 中的 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。在初始化并赋初值时,我们通常使用 `HashMap, Object&gt; map = new HashMap();` 的方式...

    java map 实现缓存技术

    1. **缓存初始化**:创建Map实例,可以是HashMap、ConcurrentHashMap或其他适合并发访问的实现,根据实际需求选择。 2. **缓存加载**:当请求的数据不在缓存中时,从其他数据源(如数据库、网络请求)获取并添加到...

    Java_se基础毕向东老师全程笔记

    这份笔记由毕向东老师授课,涵盖了Java的基础知识及进阶主题,具体章节包括编程基础、数组、面向对象程序设计等多个方面。接下来,我们将详细探讨每一章的主要内容。 ### 第一章:编程基础 #### 1. Java的特性和...

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

    本文将详细介绍Java中初始化List和Map的几种常见方法,并对比它们的优缺点。 首先,我们来看传统的初始化方式: ```java // 初始化List List&lt;String&gt; list = new ArrayList(); list.add("www.jb51.net"); list.add...

    The_Java_Tutorial.rar_The java tutorial_java Tutorial

    3. **数据类型与变量**:讲解Java中的基本数据类型(整型、浮点型、字符型、布尔型)和引用类型,以及声明、初始化和使用变量的方法。 4. **运算符与控制结构**:涵盖算术、比较、逻辑、位运算符,以及条件语句(if...

    Android_Google_Map.rar_Google api_android_android google map_and

    在`MapView`初始化完成后,我们可以通过`getMapAsync()`回调获取到`GoogleMap`对象,然后调用`setMapType()`、`addMarker()`等方法进行地图的自定义。例如,添加一个中心点标记: ```java mapView.getMapAsync(new ...

    传智播客Java_SE基础毕向东老师全程笔记

    - **JRE**包含Java虚拟机、核心类库和其他支持文件。 - **JDK**是JRE的超集,包含了编译器、调试器等工具,用于开发Java应用。 4. **JRE的主要功能**: - **加载代码**:由类加载器负责。 - **代码校验**:确保...

    google-Map.zip_android_android google map_android map_google map

    在对应的Activity或Fragment中,需要初始化MapView,并设置其生命周期回调。例如,在onCreate()方法中: ```java mapView = findViewById(R.id.mapView); mapView.onCreate(savedInstanceState); mapView....

    JavaSE_java基础_

    数组的操作包括声明、初始化、遍历和排序。 6. **集合框架**:Java集合框架提供了一组接口和类,如List(ArrayList、LinkedList)、Set(HashSet、TreeSet)和Map(HashMap、TreeMap),它们是处理对象集合的常用...

    Baidu_map-Android.zip_android_android baidu map_baidu map androi

    在对应的Activity或Fragment中,我们需要初始化MapView,并设置地图的中心点、缩放级别等参数。 百度地图提供了丰富的API接口,可以实现地图的加载、移动、缩放、旋转、倾斜等功能。例如,通过MapController对象...

    Java_examples.zip_java examples

    4. **数组**:数组是存储同类型数据的集合,示例可能会演示如何声明、初始化和操作数组,包括单维和多维数组。 5. **方法**:方法是Java中的函数,用于封装代码。示例中会展示如何定义、调用方法以及传递参数。 6....

    java_study.zip_java

    你可以声明和初始化一维、二维或多维数组,并通过索引访问其元素。 6. **类与对象**:Java是面向对象的语言,这意味着它基于类和对象的概念。类是对象的蓝图,包含属性(变量)和行为(方法)。对象是类的实例。 7...

    ISODATA.rar_isodata_isodata java_isodata java

    2. 初始化:设置聚类中心,通常随机选取数据点作为初始的类代表。 3. 迭代过程:在每一轮迭代中,每个数据点会根据其与当前聚类中心的距离被分配到最近的类,然后更新对应的聚类中心。 4. 停止条件:当聚类结果不再...

Global site tag (gtag.js) - Google Analytics