转载: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 的匿名子类。因此才回头认真的重新审视了一番这个所谓的双括符初始化语法。
相关推荐
在Java编程中,List集合是开发人员经常使用的一种数据结构,用于存储有序的元素列表。本文将详细介绍6种初始化Java List集合的方法,并通过代码示例帮助理解...在处理Map和Set集合时,也可以参考类似的方法进行初始化。
从上面的代码可以看出,在已知HashMap中将要存放的KV个数的时候,设置一个合理的初始化容量可以有效地提高性能。 在HashMap中,容量的初始化是非常重要的。我们知道,HashMap是有扩容机制的。所谓的扩容机制,指的...
但是, 有时候我们会想在一个表达式中完成初始化并赋初值的操作,例如: `HashMap, Object> map = new HashMap() { { put("name", "yanggb"); put("lover", "huangq"); }};` 这里使用了双括号 `{{}}` 来初始化,使...
Java的在还没有发现新写法之前时,我一直是这么初始化List跟Map: ... //初始化Map Map map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); //…. some other map.put() code
在Java编程中,Map接口是数据结构中非常重要的一个部分,它提供了键值对的存储方式,便于快速访问和操作数据。在许多实际应用中,尤其是高性能和高并发的场景,Map常被用来实现缓存技术,以提高数据读取速度和系统...
// 初始化Map Map, String> map = new HashMap, String>(); map.put("key1", "value1"); map.put("key2", "value2"); // ... 添加更多键值对 ``` 这种初始化方式直观明了,但在代码量较多时显得较为繁琐。为了解决...
在Java编程中,创建带有初始值的集合类如List和Map是常见的操作。这有助于在程序启动时就设定好一些基础数据,或者用于测试场景。本文将详细介绍如何在Java中快速且简洁地创建带有初始值的List和Map实例。 首先,让...
1. 初始化Map对象。 2. 加载图层。 3. 设置地图范围和视图。 4. 渲染地图图像。 5. 可选:执行查询、缓冲区分析等空间操作。 6. 关闭Map对象,释放资源。 总之,配置MapServer与Java的集成涉及到Mapfile的正确编写...
- 继承:一个类可以继承另一个类的属性和方法,实现代码的复用和扩展。 - 多态:允许不同类型的对象对同一消息做出不同的响应,增强了代码的灵活性。 2. Java基础语法 - 主函数:程序的入口点,`public static ...
初始化地图的关键在于创建一个MapView对象,并将其添加到布局文件中。在XML布局文件中,可以这样定义MapView: ```xml <com.amap.api.maps.MapView android:id="@+id/map_view" android:layout_width="match_...
- **构造函数**:初始化这个`JSONObject`,可能接受一个`Map`或一个JSON字符串作为输入。 - **方法**:如`put()`、`get()`、`toString()`等,分别用于添加键值对、获取值和将对象转换为JSON格式的字符串。 测试实例...
// 初始化map map = map.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, ...
在Java编程中,有时我们需要将一个`Map`对象转换为字符串形式进行存储或传输,而在接收端又需要将该字符串重新转换回`Map`对象以便进一步处理。本篇将详细介绍如何通过特定的方法实现这一过程,并深入分析其实现细节...
// 初始化结果Map,键为属性名,值为比较结果 Map, DiffResult> diffResults = new HashMap(); for (Field field : fields) { // 忽略static和transient属性 if (field.isStatic() || field.isTransient()) {...
Java源码解析ConcurrentHashMap的初始化 在Java并发编程中,ConcurrentHashMap是一个非常重要的数据结构,它可以在多线程环境下提供高效的哈希表操作。今天,我们将深入探讨ConcurrentHashMap的初始化过程,并分析...
在上述代码中,`mapToBean()`方法接收一个Map和一个目标类的Class对象,创建并初始化一个新的Bean实例,然后根据Map中的键值对设置Bean的属性。`beanToMap()`方法接收一个对象,创建一个Map并填充对象的字段值。 ...
首先,让我们初始化两个Map实例。假设我们有一个`Employee`类,包含`id`和`name`属性,以及对应的getter和setter方法。创建`map1`和`map2`,并将一些`Employee`对象存入其中。值得注意的是,`map1`和`map2`中存在...
Map接口定义了键值对的数据结构,其中每个键(Key)都是唯一的,并与一个值(Value)关联。主要的方法有: - `put(key, value)`: 添加键值对到Map中。 - `get(key)`: 根据键获取对应的值。 - `remove(key)`: 删除...
首先,我们从标题“arcobjects sdk for java,一个简单的GIS应用”中可以了解到,这是一个基于Java语言利用ArcObjects SDK构建的GIS应用。ArcObjects是Esri的核心组件,它包含了丰富的API和类库,能够访问和操作...
在Java中,我们可以先初始化一个空的Map,然后对每一个多项式的每一项,乘以另一个多项式的每一项,生成新的项并添加到结果Map中。这涉及到Map的多次插入和查找操作,需要注意优化以提高效率。 4. **Map在运算中的...