java集合创建时初始化之{{initcode}}

更新时间:2023-07-08 14:21:43 阅读: 评论:0

java集合创建时初始化之{{initcode}}
最近预研⼀库,发现类似如下代码:
new HashMap() {{
put("xx","xx");
}}
哎,第⼀次遇到此类代码,坑⼤发了。经查,是类似于数组⼀样创建对象时顺带初始化,⽹上称之为⽂艺代码。
1、HashMap 初始化的⽂艺写法
HashMap 是⼀种常⽤的数据结构,⼀般⽤来做数据字典或者 Hash 查找的容器。普通青年⼀般会这么初始化:
HashMap<String, String> map = new HashMap<String, String>();
map.put("name", "test");
35的英语map.put("age", "20");
看完这段代码,很多⼈都会觉得这么写太啰嗦了,⽂艺青年⼀般这么来了:
HashMap<String, String> map = new HashMap<String, String>() {
{
map.put("name", "test");
map.put("age", "20");
}
};
看起来优雅了不少,⼀步到位,⼀⽓呵成的赶脚。然后问题来了,这⾥的双括号”{{}}”到底什么意思,什么⽤法呢?
遗迹双括号”{{}}”,⽤来初始化,使代码简洁易读。
对领导干部的评价
第⼀层括弧实际是定义了⼀个匿名内部类 (Anonymous Inner Class),第⼆层括弧实际上是⼀个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执⾏。
2、推⽽⼴之,可初始化ArrayList、Set
List<String> names = new ArrayList<String>() {
{
for (int i = 0; i < 10; i++) {
add("A" + i);
弘博教育}
}
};
System.out.String());
3、Java7:增加对collections的⽀持
在 Java 7 中你可以像 Ruby, Perl、Python ⼀样创建collections了,但是这些集合是不可变的。
List<String> list = ["item"];
String item = list[0];此外的近义词
Set<String> t = {"item"};
Map<String, Integer> map = {"key" : 1};
int value = map["key"];
4、⽂艺写法的潜在问题
孕妇能不能吃羊肉
⽂章开头提到的⽂艺写法的好处很明显就是⼀⽬了然。这⾥来罗列下此种⽅法的坏处,如果这个对象要串⾏化,可能会导致串⾏化失败。
1.此种⽅式是匿名内部类的声明⽅式,所以引⽤中持有着外部类的引⽤。所以当时串⾏化这个集合时外部类也会被不知不觉的串⾏化,当外部类没有实现rialize接⼝时,就会报错。
2.上例中,其实是声明了⼀个继承⾃HashMap的⼦类。然⽽有些串⾏化⽅法,例如要通过Gson串⾏化
为json,或者要串⾏化为xml时,类库
中提供的⽅式,是⽆法串⾏化Hasht或者HashMap的⼦类的,从⽽导致串⾏化失败。解决办法:重新初始化为⼀个HashMap对象:new HashMap(map);
信赖的近义词
这样就可以正常初始化了。
5、执⾏效率问题
当⼀种新的⼯具或者写法出现时,猿们都会来⼀句:性能怎么样?(这和男⽣谈论妹纸第⼀句⼀般都是:“长得咋样?三围多少?”⼀个道理:))
关于这个两种写法:测试⽂艺写法、普通写法分别创建 10,000,000 个 Map 的结果是 1217、1064,相差 13%。
public class Test {
public static void main(String[] args) {
long st = System.currentTimeMillis();
青团英文
/
*
for (int i = 0; i < 10000000; i++) {
HashMap<String, String> map = new HashMap<String, String>() {
{
put("name", "test");
put("age", "20");
}
};
}
System.out.println(System.currentTimeMillis() - st); // 1217
*/
for (int i = 0; i < 10000000; i++) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("name", "test");
map.put("age", "20");
}
System.out.println(System.currentTimeMillis() - st); // 1064
}
}
和stream⼀样,真正要⽤的时候还是要仔细测试下。

本文发布于:2023-07-08 14:21:43,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1085627.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:写法   代码   类似   部类
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图