Map数组初始化与赋值
2015-09-18 00:00
876 查看
摘要: Map类型数组初始化、实例化、赋值,空指针异常问题。
事情是这样的
我在后台存放一些示例数据,每个map都手动赋值再存到mapList里,随着数据量的增多,代码中出现了一串一串的超相似代码。map.put()由于要放不同的值也就算了,map初始化和mapList.add()真是难以容忍。
于是想到用map数组的方法。
Map<String,String>[] mapArray=new Map
;
mapArray[i].put();
这样是可以编译通过的,可是运行时却出现了空指针异常。
原因是泛型具有类型的不确定性,而数组的定义必须确定其元素类型,所以泛型数组在初始化时会面临类型擦除的问题。
也就是对于编译器来说HashMap<Integer,Integer>和HashMap<String,String>是相同的。初始化并没有完成,所以出现了空指针异常。
那该如何办嘞?上网去查,原来大家都知道原因啊,但是没有人给出解决办法,什么不支持、无法编译、无法转化,什么这样不对要用mapList。哼!
还好我灵机一动,没有初始化,那就给它初始化被。
for(int i = 0; i < n; i++){
mapArray[i] = new HashMap<String,String>();
}
这样再进行赋值就没有问题了。
如果你仍需要List类型
List<Map<String,String>> mapList= Arrays.asList(mapArray);
我之所以没有还原成List方法而是仍然找Array的方法,因为既然编译通过了,那它一定可以变成可行方法,关键要看你的强大逻辑和神秘直觉。
事情是这样的
我在后台存放一些示例数据,每个map都手动赋值再存到mapList里,随着数据量的增多,代码中出现了一串一串的超相似代码。map.put()由于要放不同的值也就算了,map初始化和mapList.add()真是难以容忍。
于是想到用map数组的方法。
Map<String,String>[] mapArray=new Map
;
mapArray[i].put();
这样是可以编译通过的,可是运行时却出现了空指针异常。
原因是泛型具有类型的不确定性,而数组的定义必须确定其元素类型,所以泛型数组在初始化时会面临类型擦除的问题。
也就是对于编译器来说HashMap<Integer,Integer>和HashMap<String,String>是相同的。初始化并没有完成,所以出现了空指针异常。
那该如何办嘞?上网去查,原来大家都知道原因啊,但是没有人给出解决办法,什么不支持、无法编译、无法转化,什么这样不对要用mapList。哼!
还好我灵机一动,没有初始化,那就给它初始化被。
for(int i = 0; i < n; i++){
mapArray[i] = new HashMap<String,String>();
}
这样再进行赋值就没有问题了。
如果你仍需要List类型
List<Map<String,String>> mapList= Arrays.asList(mapArray);
我之所以没有还原成List方法而是仍然找Array的方法,因为既然编译通过了,那它一定可以变成可行方法,关键要看你的强大逻辑和神秘直觉。
相关文章推荐
- 部分喷墨机初始化方法
- C#中数组初始化与数组元素复制的方法
- C#中结构(struct)的部分初始化和完全初始化实例分析
- c#对象初始化顺序实例分析
- 在windows下手动初始化PostgreSQL数据库教程
- 解析C语言中空指针、空指针常量、NULL & 0的详解
- js判断变量初始化的三种形式及推荐用的形式
- javascript 定义初始化数组函数
- js二维数组定义和初始化的三种方法总结
- C++类的静态成员初始化详细讲解
- 浅析C++中结构体的定义、初始化和引用
- 函数外初始化与函数内初始化详细解析
- PHP cURL初始化和执行方法入门级代码
- Java中List与Map初始化的一些写法分享
- java类中元素初始化顺序详解
- java 代码中预防空指针异常的处理办法
- python类继承与子类实例初始化用法分析
- C++直接初始化与复制初始化的区别深入解析
- libevent 初始化与event_init
- JVM 之 类的加载与初始化