软件优化中的一个小问题

在软件优化中,为了保证相同的数据只从数据库或者本地xml文件读取一次到内存中,我使用的单利模式,解决了读取一次的问题。但在解决这个问题以后却发现,之前同事调用该块程序还有一定的问题,大致如下:
在读取数据库或者本地xml文件的数据到一个List 对象中:List list1 = new ArrayList();在该list1中存上了大约几万条数据,使用单利模式就是为了不让该数据在内存中出现多次,后来发现很多模块使用该数据的时候都是进行了如下调用:
List list2 = new ArrayList();list2 = list1;

我可以确定的是:如果List list2=null;list2=list1;这样使用的话是list2和list1声明的对象指向一处,内存中出现的数据不会被复制一份出去。
但是List list2 = new ArrayList();list2 = list1;这种情况就不知道是不是被复制出去一份了,如果这样使用是把数据复制一份的话,就跟我的初衷有悖了。

经过自己查找资料和了解java栈和堆的内存分配原理,知道了在堆中声明对象都是要开辟内存空间的,他们每个对象都是引用出去,list1的数据内存地址会赋给list2,赋给的是引用,不是整个数据。List list2= new ArrayList();分配了内存给list2
list2=list1; list2指向list1的内存入口;原来List2的内存就回收了。
如下程序进行了验证操作:
import java.util.ArrayList;
import java.util.List;

public class Test {
public static void main(String... args){
List list1 = new ArrayList();
List list2 = new ArrayList();
List list3 = list2;
for(int i=0;i<10000;i++){
list1.add(i);
}
System.out.println(list2==list3);

list2=list1;
System.out.println(list2==list3);

}

}
这个程序的最后:list2==list3是输出false的,list2==list1输出true。在list2=list1之前list2==list3是为true的,这样看来,list2和list3初始化的对象是一样的,在堆中的引用也是一样的,list2=list1之后,把list1的引用给了list2,list2就不是原来的list2了。它的引用变的和list1的引用一致。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值