黑马程序员技术交流社区
标题:
一道面试题,大家给点意见,能看懂不。。
[打印本页]
作者:
姜浩
时间:
2014-10-27 01:34
标题:
一道面试题,大家给点意见,能看懂不。。
本帖最后由 姜浩 于 2014-11-8 10:21 编辑
package com.itheima;
/**
*4、 分析运行结果,说明原理。(没有分析结果不得分)
import java.util.ArrayList;
class Data {
int val;
}
public class Test {
public static void main(String args[]) {
Data data = new Data();
ArrayList<Data> list = new ArrayList<Data>();
for (int i = 100; i < 103; i++) {
data.val = i;
list.add(data);
}
for (Data d : list) {
System.out.println(d.val);
}
}
}
*
* @author Administrator
*
*/
/*
*
* 运行结果:
* 102
* 102
* 102
* 分析:
* 在下面的循环中可以看出问题,
* for (int i = 100; i < 103; i++)
{
data.val = i;
list.add(data);
}
* 1,在for之前已经创建了Data类的实例对象data,所以在for中的3次循环时,
* 所用的data.val变量是同一个变量。也就是在3次重复的对data.val进行赋值。
* 这就会导致了,前一结果被后一结果覆盖,data.val最终结果为102。
*
* 2,list.add(data); data代表是Data类对象的引用,因为list集合的可重复特点,
* for循环中list 3次存储了Data类对象的引用,切存储的是同一对象。
* 这一点可以通过:System.out.println(list);可以看出。
*
* 3, for (Data d : list)
{
System.out.println(d.val);
}
这时d循环取到是同一个data对象,又因之前data.val最终赋值为102,
所以打印结果为102
102
102
*
*/
import java.util.ArrayList;
class Data
{
int val;
}
public class Test4
{
public static void main(String args[])
{
Data data = new Data();
ArrayList<Data> list = new ArrayList<Data>();
for (int i = 100; i < 103; i++)
{
data.val = i;//102
list.add(data);// Data类对象的引用
}
for (Data d : list)
{
System.out.println(d.val);
}
// System.out.println(list);
}
}
复制代码
大家给点意见,能不能看懂?这样作答可以吗?谢谢大家。
作者:
马嘉
时间:
2014-10-27 09:01
我个人觉得你的回答已经挺好了,这个题就是,往arraylist集合里存储了三个对象,在arraylist存储的都是同一个对象的地址值。(不好意思,我也不太清楚,集合存储的是不是对象的地址值呀?有知道的帮我解答一下,集合低层是怎么存储的)
作者:
◆﹎尛、言斤♀
时间:
2014-10-27 10:05
我觉得解释的很到位呀,赞一个
作者:
WJN_YES
时间:
2014-10-27 10:14
还是可以看懂的,就是d.val不太用过,看起来可能费点劲
作者:
MeryStyle
时间:
2014-10-27 11:33
第 59 行,List 中保存三个引用,这三个引用指向同一个内存地址,而内存地址中的值最终被修改为102,这也就是三个引用指向的值。道理你懂但好像没说的太清楚
作者:
sean
时间:
2014-10-27 12:06
MeryStyle 发表于 2014-10-27 11:33
第 59 行,List 中保存三个引用,这三个引用指向同一个内存地址,而内存地址中的值最终被修改为102,这也就 ...
终于看到一个说得很精准的回答。
作者:
肌肉男小虎
时间:
2014-10-27 12:19
水一发
作者:
ジ旋律
时间:
2014-10-27 16:18
我顶一个
作者:
计算机小菜鸟
时间:
2014-10-30 22:39
我来顶一下
作者:
cvnmklop
时间:
2014-10-31 21:33
嘿嘿~~楼主我来了:)
作者:
cvnmklop
时间:
2014-10-31 21:38
可以的,这个回答很好了。我刚刚就错了,没注意data对象只有一个,在集合中存储的都是对象的引用
作者:
邹中源
时间:
2014-11-11 12:59
以后就牛逼了呵呵呵
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2