写这篇博客目的是为了记录自己在学习过程当中填过的坑,如果能够给正在填坑的同学一点启示,荣幸之至。
一言不合,我们先来一段代码!- -
public class TestAndHashMap{
List<HashMap<String,String>> mListMap = new Array<HashMap<String,String>>();
public static void main(String[] args) {
HashMap<String,String> dataMap = new HashMap<String,String>();
dataMap.put("name","暗夜猎手");
dataMap.put("des","让我们来猎杀那些陷入黑暗的人吧吧吧!");
mListMap.add(dataMap);dataMap.put("name","暗影之拳");
dataMap.put("des","你们快点逃命不然人家就享受不到追杀的乐趣了!");
mListMap.add(dataMap);
}
}
让我们猜一下现在mListMap中有几个元素,正确答案是两个。那么到底是那两个元素呢?分别是name为“暗夜猎手”和“暗影之拳”吗?当我们把程序跑起来之后,会发现两个都是name为“暗影之拳”的元素。
why?这是我在学习安卓期间碰到的一个问题,浪费了很多宝贵的时间,Java基础不过关呀!
因为从main函数开始到main函数结束,hashMap还是那个hashMap,hashMap是一个引用,从始至终都指向同一个地址。
我想有必要先了解一下HashMap
下面是Android工程部中一个代码片段和调试运行期间相关变量的值
dataMap.put("phone", "暗夜猎手");
dataMap.put("phone","暗影之拳");
程序运行到第一个put时的Watches值:
0 = {HashMap$HashMapEntry@4355} "name" -> "暗夜猎手"key = {String@4357} "name"
value = {String@4358} "暗夜猎手"
程序运行到第二个put时的Watches值:
0 = {HashMap$HashMapEntry@4355} "name" -> "暗影之拳"
key = {String@4357} "name"
value = {String@4362} "暗影之拳"
到这里可以知道在HashMap里面只能有一个相同的key,一个key对应一个value,当put相同的key时,后面的value会覆盖之前的value。
再来看一看List
当我们给List添加由一个引用添加元素时候,在添加完成之后,我们对这个引用内容的更改都会导致List中元素的相应部分的更改。
和HashMap不同的是List没有key,也就是我们可以往List中添加“相同”的引用到不同的元素当中去。这里的相同指得是完成的相同,不仅是引用所指向内容的相同。包括引用的地址都是相同的。即这个引用根本没有任何变化(不存在销毁和创建)。
值得注意的是下面这段代码
while(1){
HashMap<String,String> dataMap = new HashMap<String,String>();
}
回到最开始的那个问题
mListMap中共有两个元素,name字段都是“暗影之拳”,des字段都是“你们快点逃命不然人家就享受不到追杀的乐趣了!”。
如果有错误的地方,欢迎各位在评论去留下宝贵的意见。共同进步,共同学习。在此感谢!