ArrayList中add后数据被覆盖的探索

来源:互联网 发布:淘宝订单管理 编辑:程序博客网 时间:2024/05/02 04:52

先看这段代码,思路是:从Edittext中得到字符,然后构造成实体类,再传递给ArraryList的add

button_send_TextContent.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {UserTallGalleryBean test = new UserTallGalleryBean();test.setSendContent(sendTextContainter.getText());test.setUserId(10905512);adapter.addDataListItem(test);}});
//添加数据public void addDataListItem(UserTallGalleryBean bean){if(datalist!=null)datalist.add(bean);Iterator<UserTallGalleryBean> iterator = datalist.iterator();while(iterator.hasNext()){Log.i("face", "--->>>"+(iterator.next()).getSendContent());} //this.notifyDataSetChanged();}

最后发现ArrayList的数据都一样了,毋庸置疑,引用问题,引用好比指针,都是一一对应的,但一看觉得我的代码没有问题啊,UserTallGalleryBean都是new后才用的,所以引用都是不一样的,刚开始我也是这么觉得的,所以我重写了UserTallGallery的toString(),在构造器里给toString付动态的数据(即每个new 后都有不同的toString,让后我们打印UserTallGalleryBean的对象就可以知道是不是同一个引用了,当然,你也可以直接用hashcode),最后还是发现addDataListItem是不同的引用,下面再看看修改后的

button_send_TextContent.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {UserTallGalleryBean test = new UserTallGalleryBean();test.setSendContent(sendTextContainter.getText().toString());test.setUserId(10905512);adapter.addDataListItem(test);}});
//添加数据public void addDataListItem(UserTallGalleryBean bean){if(datalist!=null)datalist.add(bean);Iterator<UserTallGalleryBean> iterator = datalist.iterator();while(iterator.hasNext()){Log.i("face", "--->>>"+(iterator.next()).getSendContent());} //this.notifyDataSetChanged();}

有没有发现不一样的?,对就是
sendTextContainter.getText().toString()

上面没有使用tostring()的方法,所以导致,可见的tostring后虚拟机会给字符分配新的存储地址,导致引用不一样

UserTallGalleryBean的setSendContent的数据都是同一个引用,所以打印出来的数据都是一样的,而不是UserTallGalleryBean的问题,还有但当

sendTextContainter这个edittext再次被getstring()时,ArrayList的数据还是会改变的(没有用tostring情况下),所以会造成button_send_TextContent.setOnClickListener事件还没发生,arraylist的数据就已经被覆盖了,那么官方为啥在edittext的gettext中得到同一个对象呢?呵呵,想想如果得到的是不同对象的引用,那得消耗多少内存



0 0
原创粉丝点击