首先说明一下什么是传值传引用:
传引用:简单的说,引用其实就像是一个对象的名字或者别名 (alias),一个对象在内存中会请求一块空间来保存数据,根据对象的大小,它可能需要占用的空间大小也不等。访问对象的时候,我们不会直接是访问对象在内存中的数据,而是通过引用去访问。引用也是一种数据类型,需要一定的内存空间来保存。但是它们的值是相同的,都指示同一个对象在内存的中位置,我们可以把它想象为类似 C 语言中指针的东西,它指示了对象在内存中的地址——只不过我们不能够观察到这个地址究竟是什么。
传值:Java是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。
通过以上说明可以总结出:
1、引用是一种数据类型,保存了对象在内存中的地址,这种类型即不是我们平时所说的简单数据类型也不是类实例(对象);
2、不同的引用可能指向同一个对象,换句话说,一个对象可以有多个引用,即该对象数据类型的变量;
3、改变一个引用的值,其他引用的值也会改变;
4、在java中只有简单的数据类型,在传递的时候是传递的值;
通过以上学习解决了最近遇到的数据更新后,MyAdapter刷新问题。
刚开始我是这么做的:
在Activity中new了一个复杂的数据类型:List<HashMap<String,Object>> data;
一个setData方法:
public void setData(List<HashMap<String, Object>> data) {
MangeTroubleActivity.this.data.clear();
for(HashMap<String, Object> map:data){
this.data.add(map) ;
}
}
MyAdapter也new了一个复杂的数据类型:
List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
写了set方法:
public void setData(List<HashMap<String, Object>> list) {
this.list = list;
}
在Activity中使用MyAdapter的对象调用setData(data); /*这里使用的就是传引用*/
之后在MyAdapter中修改了list后,使用list.clear();清除数据,后使用setData(list)方法放入Activity、MyAdapter改变后的数据,notifyDataSetChanged()更新界面;
这时候发现数据为空。到底哪里出了问题呢?
经过测试发现当在list改变后Activity中setData(0的时候传递的值为空了,这时候想应该是 MangeTroubleActivity.this.data.clear(); 的时候把传过来的数据都清空了,所以设了断点DeBug一下。果然如此。。。。
那为什么会造成清除Activity中data对象,MyAdapter中的list也会改变呢?然后就想到是不是两个对象引用的是同一个值。
对MyAdapter中set方法做了如下修改
public void setData(List<HashMap<String, Object>> list) {
this.list.addAll(list);
// this.list = list;
}
测试。。。结果数据更新成功,也不会被清除了。这其中的原因就是:通过addAll()方法实例化list对象,java中复杂数据类型传递的时候是传引用,改变一个对象的值,另一个也会跟这变;