Java中有值传递的特性,栈中多个声明的变量引用堆内同一块区域,当操作这些变量中的某一个的时候,修改了堆内引用的这个区域内的属性,其他变量在调用的时候也会发生改变。
案例
我们定义一个商品类
public class Goods {
/**
* 商品id
*/
private Long goodId;
/**
* 商品名称
*/
private String goodName;
/**
* 商品价格
*/
private String goodPrice;
}
定义一个处理集合的方法
/**
* 处理List集合
* 如果为false,则让集合返回为空
* 如果为true,对集合进行操作
*/
private void dealList(List<Goods> goodsList, boolean flag) {
if (!flag) {
goodsList = null;
return;
}
goodsList.forEach(e -> e.setGoodName(e.getGoodName() + " 处理完毕"));
}
然后我们调用
/**
* 值传递测试
*/
@Test
public void testValuePropagation() {
List<Goods> goods = Lists.newArrayList(
new Goods(1L, "apple", "12000"),
new Goods(2L, "Huawei", "8000")
);
dealList(goods, false);
System.out.println(JackSonUtil.objToJson(goods));
}
//打印结果
[{"goodId":1,"goodName":"apple","goodPrice":"12000"},{"goodId":2,"goodName":"Huawei","goodPrice":"8000"}]
并没有将集合置空,我们可以从内存的角度去分析
堆栈空间分析 |
---|
当然,实际上并没有在堆内新开辟一个叫NULL
的空间,这里只是方便说明。
根据值传递,如果我们想将这个集合更改,就必须到这个共同的堆区域,进行操作处理。
goodsList.clear(); //当为false的时候,清空处理
//打印结果
[]