初始化集合的花样new HashMap<String, String>{ {put("str1":"abc");} }(转)
集合 string gt quot 初始化 lt New HashMap
2023-09-14 08:58:29 时间
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", "2572073701"); } }; 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$1 extends HashMap<String, String> { SimpleCollectCreateDemo1$1() { put("Name", "June"); put("QQ", "2572073701"); } }
同理,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/
相关文章
- java map 转string_java-将Map <String,Object>转换为Map <String,String>
- long转string mybatis_Long转String总结
- Java之数组转集合&集合转数组[通俗易懂]
- integer转string java_Integer转换为String类型[通俗易懂]
- Redis五大数据类型之Zset(有序集合)命令操作
- Java-String类&集合ArrayList
- Java集合详解编程语言
- Python推导式(列表推导式、元组推导式、字典推导式和集合推导式)详解
- Mongodb多集合,数据库存储好帮手(mongodb多集合)
- 应用Redis集合强力优势在实际应用(redis集合的场景)
- Redis实现集合求交集的方法(redis 集合求交集)
- Redis集合数据之路从丢失到挽回(redis 集合数据丢失)
- Redis集合实现原理与底层结构研究(redis 集合底层结构)
- Redis实现快速获取集合大小(redis 获取集合大小)
- c#中String和string的区别介绍
- Java中集合和数组的排序方式小结