- 浏览: 1309323 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (732)
- Java_about (146)
- Spring_Hibernate_Struts_OpenSource (27)
- linux_unix (62)
- life_sth (22)
- js_css_html_xml_nodejs (69)
- design_pattens (1)
- Perl (8)
- php_ecshop (4)
- DB_Mysql_Oracle_Informix_SqlServer (43)
- JSTL (8)
- Testing_自动化测试 (42)
- DB_ID_UUID (4)
- SEM_SEO (1)
- english_study_improvement (4)
- SVN_Git (9)
- WebService_SOA_CloudComputing (3)
- E-Commerce (1)
- Lucene_Solr (7)
- others (2)
- Regex (2)
- tomcat_jetty (8)
- zeroc-ice (1)
- java_excel (5)
- ant_maven_gradle (5)
- Unity_VR_AR_C# (2)
- jmeter (1)
- XPath_dom4j (1)
- Ruby_and_Rails (68)
- write_a_rails (17)
- manage_and_team (1)
- getting_real (1)
- ubuntu (20)
- git_and_git_flow (7)
- TODO (1)
- PM_design (2)
- Python_and_Django (8)
- NoSql_mongo_redis (24)
- C/C++ (3)
- vi_vim_gvim (0)
- c#_.Net_windows编程_dll (10)
- Php_and_Yii (9)
- Android_IOS (31)
- Mysql (5)
- sa_运维_network_硬件 (37)
- lua (2)
- c_cpp_VisualStudio (21)
- 硬件-RM-Arduino (6)
最新评论
-
shenkun58:
...
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
liaojia1:
正解,感谢
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
flingfox63:
谢谢分享,电脑上有IPV6,导致了Guard启动不了……
ruby错误解决: Address family not supported by protocol - connect(2) -
c39274936:
s = "hello_world_ruby" ...
驼峰格式和下划线格式转换_translation between camel and snake format -
yfj300:
学习了学习了学习了学习了
硬盘基本知识(磁道、扇区、柱面、磁头数、簇、MBR、DBR)
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.
}};
看起来都是在一条语句里完成,而不需要分步骤写成:
一
不小心没好好理解的人可能以为它是什么特别的语法,关键是大括号连一块了,原作者也是在故作姿态,美其名曰:双括弧语法(double-brace
syntax)。真是乱花渐欲迷人眼,其实就是匿名类加初始块。该文有解释:第一层括弧 实际是定义了一个内部匿名类 (Anonymous
Inner Class),第二层括弧 实际上是一个实例初始化块 (instance initializer
block),这个块在内部匿名类构造时被执行。
那怎么去更好理解它呢?如果我们写成如下的方式应该会更好理解吧,提个技巧,在 Eclipse 中对第一段代码按下 Ctrl + Shift + F 就如下了:
其
实就是匿名类啊,会创建出一个 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
发表评论
-
如何在IDEA单元测试中使用Scanner获取输入内容
2024-10-25 21:19 38如何在IDEA单元测试中使用Scanner获取输入内容 = ... -
java播放音频声音mp3等
2024-05-22 15:16 413java播放音频声音mp3等 = = = 这个方法 ... -
打包Java程序为.exe文件
2023-09-27 16:25 374= = = 打包Java程序为.exe文件 fro ... -
Java怎么生成exe可执行文件【图文讲解】
2023-09-27 16:21 380= 开发的工具,让客户体验一下再说。此时又不想发源码,怕 ... -
Java8 List集合Stream流方法操作详解
2023-09-27 16:02 145= = = from: https://zhuanl ... -
Java8 List集合Stream流方法操作详解
2023-09-27 15:59 548= = = from: https://zhuan ... -
Java8 List集合Stream流方法操作详解
2023-09-27 15:56 99= = = from: https://zhuanl ... -
【原创】Cannot create property=xxx for JavaBean=【lombok 和 yaml包 混合报错】
2023-02-04 23:31 987= = = 问题: 同时使用lombok 和 ... -
【摘】Java文档注释用法+JavaDoc的使用详解
2022-09-12 16:32 446= = 节约重复注释 使用@inheritDo ... -
【朝花夕拾】java内部类,原理,使用
2022-08-09 22:52 377= 碰到类似问题,多读《thinking in java ... -
【拾遗】java数组copy拷贝复制的工具类方法
2022-06-11 21:20 620= 对工具类来说,copyOfRange 最好用。 这 ... -
利用Httpclient下载图片,java不用httpClient下载图片
2022-05-30 22:25 463= = = from:https://blog.csd ... -
为什么要使用lombok?
2022-04-04 20:46 399= = = 参考:https://blog.csd ... -
朝花夕拾:java-向上转型中变量覆盖要小心使用_继承过程中Java子类父类属性的覆盖问题
2022-01-13 17:31 414==== 现在的代码结构设计的复杂起来了,为了后来人编写 ... -
【Mysql数据库】Cause: java.sql.SQLException: The table 'xxx' is full
2022-01-04 17:03 1506= 本地开发测试,怎 ... -
JAVA工具类学习-java 两个list 交集 并集 差集 去重复并集
2021-09-10 16:17 870= = = List<String> ... -
java汉字判断,中文符号判断,中文标点符号判断
2021-09-02 19:07 1188=== = = 一、判断中文汉字 st ... -
velocity的模板笔记总结文档-方便查阅
2020-04-28 14:41 384= 最好把这几个官网文档看了: 官网官方文档refer ... -
mjson:像python和ruby一样好用的java类库操作json_js
2020-04-17 20:54 526= = = JSON Library for Jav ... -
关于idea2019.2-2019.3版本中文控制台乱码问题,tomcat7-tomcat8乱码
2020-04-04 23:20 478= 1 idea2019.2-2019.3版本中文控制台乱 ...
相关推荐
Java的在还没有发现新写法之前时,我一直是这么初始化List跟Map: //初始化List List list = new ArrayList(); list.add("string1"); list.add("string2"); //some other list.add() code…… list.add(...
这个名为"MapUtils_java_Maputils_"的资源可能是一个包含静态方法的工具类,用于简化Map的常见操作,如初始化、添加元素、获取值等。下面将详细介绍Map接口和MapUtils类在Java中的使用及其相关知识点。 **1. Map...
"Java中HashMap容量的初始化实现" Java中HashMap容量的初始化实现是非常重要的,特别是在大规模数据处理时。HashMap的容量初始化可以极大地影响程序的性能。在本文中,我们将详细介绍Java中HashMap容量的初始化实现...
1. 初始化Map对象。 2. 加载图层。 3. 设置地图范围和视图。 4. 渲染地图图像。 5. 可选:执行查询、缓冲区分析等空间操作。 6. 关闭Map对象,释放资源。 总之,配置MapServer与Java的集成涉及到Mapfile的正确编写...
在Java编程中,List集合是开发人员经常使用的一种数据结构,用于存储有序的元素列表。本文将详细介绍6种初始化Java List集合的方法,并通过代码示例帮助理解...在处理Map和Set集合时,也可以参考类似的方法进行初始化。
- 变量声明与初始化:理解变量的作用域和生命周期。 - 控制流语句:如条件语句(if-else)、循环(for、while、do-while)。 4. **类与对象**: - 类的定义:包括属性(字段或成员变量)和方法(函数)。 - ...
类是Java中面向对象编程的核心概念,而构造函数则是用于初始化类的实例的重要方法。构造函数的命名与类名相同,没有返回类型,并在创建类的新实例时自动调用。构造函数可以有参数,也可以不带参数,用于不同的初始化...
Java 在 HashMap 初始化时赋初值过程解析 Java 中的 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。在初始化并赋初值时,我们通常使用 `HashMap, Object> map = new HashMap();` 的方式...
1. **缓存初始化**:创建Map实例,可以是HashMap、ConcurrentHashMap或其他适合并发访问的实现,根据实际需求选择。 2. **缓存加载**:当请求的数据不在缓存中时,从其他数据源(如数据库、网络请求)获取并添加到...
这份笔记由毕向东老师授课,涵盖了Java的基础知识及进阶主题,具体章节包括编程基础、数组、面向对象程序设计等多个方面。接下来,我们将详细探讨每一章的主要内容。 ### 第一章:编程基础 #### 1. Java的特性和...
本文将详细介绍Java中初始化List和Map的几种常见方法,并对比它们的优缺点。 首先,我们来看传统的初始化方式: ```java // 初始化List List<String> list = new ArrayList(); list.add("www.jb51.net"); list.add...
3. **数据类型与变量**:讲解Java中的基本数据类型(整型、浮点型、字符型、布尔型)和引用类型,以及声明、初始化和使用变量的方法。 4. **运算符与控制结构**:涵盖算术、比较、逻辑、位运算符,以及条件语句(if...
在`MapView`初始化完成后,我们可以通过`getMapAsync()`回调获取到`GoogleMap`对象,然后调用`setMapType()`、`addMarker()`等方法进行地图的自定义。例如,添加一个中心点标记: ```java mapView.getMapAsync(new ...
- **JRE**包含Java虚拟机、核心类库和其他支持文件。 - **JDK**是JRE的超集,包含了编译器、调试器等工具,用于开发Java应用。 4. **JRE的主要功能**: - **加载代码**:由类加载器负责。 - **代码校验**:确保...
在对应的Activity或Fragment中,需要初始化MapView,并设置其生命周期回调。例如,在onCreate()方法中: ```java mapView = findViewById(R.id.mapView); mapView.onCreate(savedInstanceState); mapView....
数组的操作包括声明、初始化、遍历和排序。 6. **集合框架**:Java集合框架提供了一组接口和类,如List(ArrayList、LinkedList)、Set(HashSet、TreeSet)和Map(HashMap、TreeMap),它们是处理对象集合的常用...
在对应的Activity或Fragment中,我们需要初始化MapView,并设置地图的中心点、缩放级别等参数。 百度地图提供了丰富的API接口,可以实现地图的加载、移动、缩放、旋转、倾斜等功能。例如,通过MapController对象...
4. **数组**:数组是存储同类型数据的集合,示例可能会演示如何声明、初始化和操作数组,包括单维和多维数组。 5. **方法**:方法是Java中的函数,用于封装代码。示例中会展示如何定义、调用方法以及传递参数。 6....
你可以声明和初始化一维、二维或多维数组,并通过索引访问其元素。 6. **类与对象**:Java是面向对象的语言,这意味着它基于类和对象的概念。类是对象的蓝图,包含属性(变量)和行为(方法)。对象是类的实例。 7...
2. 初始化:设置聚类中心,通常随机选取数据点作为初始的类代表。 3. 迭代过程:在每一轮迭代中,每个数据点会根据其与当前聚类中心的距离被分配到最近的类,然后更新对应的聚类中心。 4. 停止条件:当聚类结果不再...