AndRoid解决ArrayList的Add总是添加相同值的问题
Android在用ArrayList的add()方法时,总是出现添加相同值的现象。如下图所示:
错误代码如下:
listItem = new HashMap<String, Object>(); for (Item item : resultItems) { // 获取相关车次 listItem.put("Station_train_code", item.getStation_train_code()); System.out.println(listItem); listItems.add(listItem); }
修改后的源码如下:
for (Item item : resultItems) { listItem = new HashMap<String, Object>(); // 获取相关车次 listItem.put("Station_train_code", item.getStation_train_code()); System.out.println(listItem); listItems.add(listItem); }
后经查阅资料得知,若将listItem = new HashMap<String, Object>();置于for循环体外的话,listItem只存在一个对象,而listItems.add(listItem)时只是把listItem的引用传进去了。故listItems中存放的值都是最后一个listItem的值。其内存分配示意图如下图所示:
若将listItem = new HashMap<String, Object>();置于for循环体内的话,则会在每一次循环中创建一个新的listItem对象。从而在执行listItems.add(listItem);时,会把不同的listItem对象的引用传给listItems,从而得到正确结果,如下图所示:
其实在Java中,也可以这样理解:java中是存在指针的!对于基本数据类型(应该是那8种吧),java传的是值,非基本类型,传的是引用!
猜您可能还喜欢
- Android avax.net.ssl.SSLPeerUnverifiedException: No peer certificate 解决方法(httpClient支持HTTPS的访问方式)(2792)
- Android进阶(二)https请求No peer certificate的解决方法.(1548)
- Android进阶(一)几种网络请求方式详解(1130)
- Android几种邮件发送代码(994)
- AndRoid解决ArrayList的Add总是添加相同值的问题(967)
- Android Can't create handler inside thread that has not called Looper.prepare()错误解决方法(946)
- 响应式布局和自适应布局的区别(362)
评论列表
发表评论
文章分类
文章归档
阅读排行
- 1. Windows Server 2008 R2永久激活及Chew-WGA v0.9下载(12644)
- 2.Visual Studio 2017中安装visualSVN及使用详解(4838)
- 3.完美解决iis下JWplayer提示Error loading media: File could not be played错误(3706)
- 4.asp.net mvc+jquery easyui开发基础(一)模块首页及增加、修改、删除模块实现(2930)
- 5.Android avax.net.ssl.SSLPeerUnverifiedException: No peer certificate 解决方法(httpClient支持HTTPS的访问方式)(2792)
- 6..Net Mvc中使用Jquery EasyUI控件讲解(一)表格控件datagrid使用介绍(2637)
- 7.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(三)登录模块开发(2577)
- 8.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(七)权限管理模块之系统菜单动态生成(2541)
- 9. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(六)权限管理模块之初始数据准备(2191)
- 10.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(八)权限管理模块之权限管理实现(2158)