关于ArrayList存储局部变量和全局变量的易错笔记,arraylist易错
关于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
总结:从基础打起,学到的东西更多呢。
相关文章
- 暂无相关文章
用户点评