初始化集合的花样new HashMap<String, String>{ {put("str1":"abc");} }(转)
Map集合的普通初始化方法:
Map<String, String> map = new HashMap<String, String>();
map.put("Name", "June");
map.put("QQ", "2572073701");
今天看到这样的写法:
/** 不可重试异常 参数错误 **/
@SuppressWarnings("serial")
public static final Map<String, String> SMS_PARAM_ERROR_UNRETRY =
new HashMap<String, String>() {
{
put(SMS_RESP_208001, "参数错误");
put(SMS_RESP_208101, "有重复请求数据");
put(SMS_RESP_208102, "资源竞争");
put(SMS_RESP_208200, "数据库异常");
put(SMS_RESP_208500, "缓存异常");
}
};
前面以为是jdk7或者jdk8的新特征
后面查看资料是利用继承、代码块、内部类的实现
相当于创建的是一个HashMap的子类对象,且该子类中有实例代码块做一个初始化赋值操作,实例代码块中可以随意调用实例方法。
代码:
Map<String, String> map1 = new HashMap<String, String>() {
{
put("Name", "June");
put("QQ", "");
}
};
for(Map.Entry<String, String> entry : map1.entrySet() ){
System.out.println(entry.getKey() + ", " + entry.getValue() );
}
反编译:
package kunpu.test1; import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry; public class SimpleCollectCreateDemo1
{
public static void main(String[] args)
{
Map<String, String> map1 = new HashMap() {};
for (Map.Entry<String, String> entry : map1.entrySet()) {
System.out.println((String)entry.getKey() + ", " + (String)entry.getValue());
}
}
}
package kunpu.test1; import java.util.HashMap; final class SimpleCollectCreateDemo1$
extends HashMap<String, String>
{
SimpleCollectCreateDemo1$()
{
put("Name", "June");
put("QQ", "");
}
}
同理,ArrayList等也可以使用同样的方式进行初始化:
List<String> stringList = new ArrayList<String>(){
{
add("str1");
add("str2");
remove("str1");
}
};
for(String s : stringList){
System.out.println(s);
}
在jdk1.7的新特征中进行了java集合的增强支持:
摒弃了Java集合接口的实现类,如:ArrayList、HashSet和HashMap。而是直接采用[]、{}的形式存入对象,采用[]的形式按照索引、键值来获取集合中的对象,如下:
所以初始化集合的方式不是仅仅的死板哦。
4、文艺写法的潜在问题
文章开头提到的文艺写法的好处很明显就是一目了然。这里来罗列下此种方法的坏处,如果这个对象要串行化,可能会导致串行化失败。
1.此种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当串行化这个集合时外部类也会被不知不觉的串行化,当外部类没有实现serialize接口时,就会报错。
2.上例中,其实是声明了一个继承自HashMap的子类。然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,从而导致串行化失败。解决办法:重新初始化为一个HashMap对象:
这样就可以正常初始化了。
参考链接:http://blog.163.com/qqabc20082006@126/blog/static/22928525201022094041502/
初始化集合的花样new HashMap<String, String>{ {put("str1":"abc");} }(转)的更多相关文章
- 如何使用List<HashMap<String, String>>详细讲解
场景:要循环界面Table数据源与导出Excel数据源作对比. 说明: List<HashMap<String,String>> List中每一项都是一个HashMap Ha ...
- Java: 分解List<HashMap<String, String>>
分解List<HashMap<String, String>> 的方法: List<HashMap<String, String>> mapList; ...
- 将ArrayList<HashMap<String, String>>转为ArrayList<Bundle>类型的解决方案
Bundle是一种利用键值对存储的数据格式,而我们在程序中通常利用HashMap存储数据.在开发中,通过Http请求得到JSONArray类型的返回值,我选择利用ArrayList<HashMa ...
- List<HashMap<String,String>> list, 根据hashmap中的某个键的值排序
来源https://blog.51cto.com/zhaodan/1725249 //可以使用Collections.sort(List list, Comparator c)来实现 这里举例hash ...
- java自学第4期——:Scanner类、匿名对象介绍、Random类、ArrayList集合、标准类格式、String类、static静态、Arrays工具类、Math类(1)
一.Scanner类 1.api简介: 应用程序编程接口 2.Scanner类: 作用:获取键盘输入的数据 位置: java.util.Scanner. 使用:使用成员方法nextInt() 和 ne ...
- [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...
- Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...
- 集合(四)HashMap
之前的List,讲了ArrayList.LinkedList,最后讲到了CopyOnWriteArrayList,就前两者而言,反映的是两种思想: (1)ArrayList以数组形式实现,顺序插入.查 ...
- java集合框架之java HashMap代码解析
java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...
随机推荐
- 2017-2018-2 20165303 实验二《Java面向对象程序设计》实验报告
实验一 实验要求 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习 提交最后三个JUnit测试用例(正常情况, ...
- English trip V1 - B 21. On a busy day 忙碌的一天 Teacher:Taylor Key: at on in
In this lesson you will learn to tell the time. 说时间 课上内容(Lesson) at time; at 7:30; at midday; ...
- every day a practice —— morning(7)
It is probably because Willow was the last link to her parents and a pastime that goes back to her o ...
- LeetCode--020--括号匹配
题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空 ...
- 02 爬虫数据解析之re,xpath,beautifulsoup
一.正则匹配 简单用法演示: 字符: print(re.findall(".","abccc31223dn哈哈")) ### . 匹配除了换行符以外的任意字符, ...
- laravel App\Kernel.php中的middleware、middlewareGroups、routeMiddleware
万事万物总逃不出一个理字,程序尤其如此,你之所以活得轻松,是因为有人替你负重前行,帮你屏蔽掉了很多乱七八糟的事情,但总有一天你要直面这些事情.程序亦是如此,某个框架你用的很轻松,那是因为底层逻辑已经有 ...
- function_exists
在已经定义的函数列表(包括系统自带的函数和用户自定义的函数)中查找 function_name. 如果 function_name 存在且的确是一个函数就返回 TRUE ,反之则返回 FALSE .
- TeamViewer一直显示“未就绪,请检查您的连接”什么原因?
一.错误 错误:未就绪,请检查您的连接 二.问题原因 1.网络连接有问题 很多用户在点击启动TeamViewer的时候,在下方看到显示未连接状态.这种情况可能是软件自身问题,重启一下或重新下载安装包安 ...
- 迭代FFT
int reverse(int x, int len){ ; ; i < len; i <<= ){ t <<= ; ; } return t; } Complex A[ ...
- Codeforces Beta Round #64D - Professor's task
题意:两种操作1.加点2.查询点是否在之前给定点的凸包内 题解:set维护动态凸包,分别维护上下凸壳,对y取反就行,判断点是否在凸壳内,把点加进去看要不要删除就好了 //#pragma GCC opt ...