`

关于java初始化一个有值的Map

 
阅读更多

转载:http://www.evget.com/article/2009/8/21/12289.html

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

 

Map map = new HashMap() {{ 
  put("Name", "Unmi"); 
  put("QQ", "1125535"); 
  }}; 
  List stooges = new ArrayList() {{ 
  add("Larry"); 
  add("Moe"); 
  add("Curly"); 
  }}; 

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

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

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

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

 Map map = new HashMap() { 
  { 
  put("Name", "Unmi"); 
  put("QQ", "1125535"); 
  } 
  };

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

  final class com.unmi.TestDoubleBrace$1 extends java.util.HashMap{ //创建了一个 HashMap 的子类 TestDoubleBracke$1

  com.unmi.TestDoubleBrace$1();

Code: 
  0: aload_0 
  1: invokespecial #8; //Method java/util/HashMap."":()V //{} 中的代码放到了构造方法中去了 
  4: aload_0 
  5: ldc #10; //String Name 
  7: ldc #12; //String Unmi 
  9: invokevirtual #14; //Method put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 
  12: pop 
  13: aload_0 
  14: ldc #18; //String QQ 
  16: ldc #20; //String 1125535 
  18: invokevirtual #14; //Method put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 
  21: pop 
  22: return 
  }

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

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

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

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

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

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

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

    java中hashmap容量的初始化实现

    从上面的代码可以看出,在已知HashMap中将要存放的KV个数的时候,设置一个合理的初始化容量可以有效地提高性能。 在HashMap中,容量的初始化是非常重要的。我们知道,HashMap是有扩容机制的。所谓的扩容机制,指的...

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

    但是, 有时候我们会想在一个表达式中完成初始化并赋初值的操作,例如: `HashMap, Object> map = new HashMap() { { put("name", "yanggb"); put("lover", "huangq"); }};` 这里使用了双括号 `{{}}` 来初始化,使...

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

    Java的在还没有发现新写法之前时,我一直是这么初始化List跟Map: ... //初始化Map Map map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); //…. some other map.put() code

    java map 实现缓存技术

    在Java编程中,Map接口是数据结构中非常重要的一个部分,它提供了键值对的存储方式,便于快速访问和操作数据。在许多实际应用中,尤其是高性能和高并发的场景,Map常被用来实现缓存技术,以提高数据读取速度和系统...

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

    // 初始化Map Map, String> map = new HashMap, String>(); map.put("key1", "value1"); map.put("key2", "value2"); // ... 添加更多键值对 ``` 这种初始化方式直观明了,但在代码量较多时显得较为繁琐。为了解决...

    java中快速创建带初始值的List和Map实例

    在Java编程中,创建带有初始值的集合类如List和Map是常见的操作。这有助于在程序启动时就设定好一些基础数据,或者用于测试场景。本文将详细介绍如何在Java中快速且简洁地创建带有初始值的List和Map实例。 首先,让...

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

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

    初始java第一讲

    - 继承:一个类可以继承另一个类的属性和方法,实现代码的复用和扩展。 - 多态:允许不同类型的对象对同一消息做出不同的响应,增强了代码的灵活性。 2. Java基础语法 - 主函数:程序的入口点,`public static ...

    Android : 初始化 高德地图Demo

    初始化地图的关键在于创建一个MapView对象,并将其添加到布局文件中。在XML布局文件中,可以这样定义MapView: ```xml <com.amap.api.maps.MapView android:id="@+id/map_view" android:layout_width="match_...

    不用第三方jar的json与object(map、list)互换java类

    - **构造函数**:初始化这个`JSONObject`,可能接受一个`Map`或一个JSON字符串作为输入。 - **方法**:如`put()`、`get()`、`toString()`等,分别用于添加键值对、获取值和将对象转换为JSON格式的字符串。 测试实例...

    浅谈Java之Map 按值排序 (Map sort by value)

    // 初始化map map = map.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, ...

    map.toString()后转换成Map类型

    在Java编程中,有时我们需要将一个`Map`对象转换为字符串形式进行存储或传输,而在接收端又需要将该字符串重新转换回`Map`对象以便进一步处理。本篇将详细介绍如何通过特定的方法实现这一过程,并深入分析其实现细节...

    Java对象属性数据比较,返回变化数据

    // 初始化结果Map,键为属性名,值为比较结果 Map, DiffResult> diffResults = new HashMap(); for (Field field : fields) { // 忽略static和transient属性 if (field.isStatic() || field.isTransient()) {...

    Java源码解析ConcurrentHashMap的初始化

    Java源码解析ConcurrentHashMap的初始化 在Java并发编程中,ConcurrentHashMap是一个非常重要的数据结构,它可以在多线程环境下提供高效的哈希表操作。今天,我们将深入探讨ConcurrentHashMap的初始化过程,并分析...

    通过java反射实现map与bean之间互转

    在上述代码中,`mapToBean()`方法接收一个Map和一个目标类的Class对象,创建并初始化一个新的Bean实例,然后根据Map中的键值对设置Bean的属性。`beanToMap()`方法接收一个对象,创建一个Map并填充对象的字段值。 ...

    详解Java8合并两个Map中元素的正确姿势

    首先,让我们初始化两个Map实例。假设我们有一个`Employee`类,包含`id`和`name`属性,以及对应的getter和setter方法。创建`map1`和`map2`,并将一些`Employee`对象存入其中。值得注意的是,`map1`和`map2`中存在...

    MapUtils_java_Maputils_

    Map接口定义了键值对的数据结构,其中每个键(Key)都是唯一的,并与一个值(Value)关联。主要的方法有: - `put(key, value)`: 添加键值对到Map中。 - `get(key)`: 根据键获取对应的值。 - `remove(key)`: 删除...

    arcobjects sdk for java,一个简单的GIS应用

    首先,我们从标题“arcobjects sdk for java,一个简单的GIS应用”中可以了解到,这是一个基于Java语言利用ArcObjects SDK构建的GIS应用。ArcObjects是Esri的核心组件,它包含了丰富的API和类库,能够访问和操作...

    JAVA记事本,有一元多项式加减乘功能

    在Java中,我们可以先初始化一个空的Map,然后对每一个多项式的每一项,乘以另一个多项式的每一项,生成新的项并添加到结果Map中。这涉及到Map的多次插入和查找操作,需要注意优化以提高效率。 4. **Map在运算中的...

Global site tag (gtag.js) - Google Analytics