欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

关于ArrayList存储局部变量和全局变量的易错笔记,arraylist易错

来源: javaer 分享于  点击 44270 次 点评:169

关于ArrayList存储局部变量和全局变量的易错笔记,arraylist易错


       对象的声明放在栈内存,在实例化对象的时候,会在堆内存开辟一个内存,然后把这个内存的地址交给对象。这个就是对象的声明和实例化过程。 

(一)关于使用ArrayList存储全局变量

代码如下:

public static void main(String[] args){
Demo demo=new Demo();                                              //这里声明一个全局变量
List<Demo> demoList=new ArrayList<Demo>();            //声明一个arraylist存储对象
for(int i=0;i<3;i++){
demo.setId(i);
demoList.add(demo);
System.out.println(demo);
System.out.println("demoList.get(i):"+demoList.get(i).getId());

}
for(int i=0;i<3;i++){
System.out.println(demoList.get(i).getId());         //用循环打印
}
}

输出结果:

Demo [id=0]
demoList.get(i):0
Demo [id=1]
demoList.get(i):1
Demo [id=2]
demoList.get(i):2
2
2
2

问:为什么在循环输出时候提取list是相同?

个人总结:

 (1)List里面虽然有3个元素,但是元素的对象指向的地址都是同一个内存地址。
(2)你只new一次,但是只为demo分配一个地址,但是每次都是操作这个demo,第一个循环。
(3)另外,因为list是允许元素重复的,所以,你同一个对象可以加N次,另一个集合set是不允许元素重复。
元素重复的意思是,内存地址一样

(4)最后一次则添加id为2,则覆盖之前的id,arraylist则存储最后一个对象的值。

图如下:



(二)使用arraylist存储局部变量

对于上边的程序,把声明放到for循环里面时候,则是不同的指向地址。

public static void main(String[] args){
//Demo demo=new Demo();    //注释掉,换到for循环里面
List<Demo> demoList=new ArrayList<Demo>();
for(int i=0;i<3;i++){
Demo demo=new Demo();
demo.setId(i);
demoList.add(demo);
System.out.println(demo);
System.out.println("demoList.get(i):"+demoList.get(i).getId());

}
for(int i=0;i<3;i++){
System.out.println(demoList.get(i).getId());
}
}

运行结果:

Demo [id=0]
demoList.get(i):0
Demo [id=1]
demoList.get(i):1
Demo [id=2]
demoList.get(i):2
0
1
2



总结:从基础打起,学到的东西更多呢。


相关文章

    暂无相关文章

用户点评