小实验、小思考(一)------List添加对象引发的小思考

工作一年,一直在做应用,现在晚上终于偷点闲,可以多看看基础了,做做小实验,回顾一下基础,重走一遍学习JAVA的道路,温故而知新。
废话不多说,上代码。
代码 1

结果:
显然,实例的值改变了,存到内存中的值也同样被改变。这也就是我们看到所有实例的值都是最后一次的值的原因。那么?这是否意味着list中存入相同的实例,也会被认为是两个呢? 继续试验:
代码2:

结果:

显然,是可以添加的,也就是说 arrayList的size是和添加次数有关的,并不覆盖。他不检查是否相同重复。那么,在List中取出值进行修改,外面的值会改变么,改完之后是否还需要添加进去呢?继续试验:
代码3:
结果:

哈哈,结果很显然,在list中的实例依然是book这个实例本身,并没有新建一个,那么,list中所保存的不过是book的地址。为什么呢?下面,就要了解下java的内存存储机制啦。
下面转载内容从理论上描述的堆内存和栈内存的关系。
一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配
堆内存用于存放由new创建的对象和数组
数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。
内容表述相对抽象,码友们可以边看文章边对照本文实验进行理解。
在本文的实验中,显然,变量 book 是 栈内存中 对存放在堆内存中Book对象的引用。而list所添加的是book这个变量,而非对象。真正的改变发生在堆内存中的Book中,因而产生了本实验中的效果。
最后,内心依然有一个疑问:在代码1中,我是将变量名book放在循环体外部,在循环体内部创建对象,那么 这种方式和 在循环体内部创建实体 Book book= new Book(); 在内存回收上有什么区别么? 是即时性不同还是 基本没有什么不同呢?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值