欢迎使用CSDN-markdown编辑器

来源:互联网 发布:2D动画软件 编辑:程序博客网 时间:2024/06/05 20:03

定义了一个Student类,里面有name,age两个属性。将三个不同Student对象存入ArrayList中,出现最后输出结果一样的问题。

package blog;import java.awt.List;import java.util.ArrayList;import java.util.Scanner;public class Test02 {public static void main(String[] args) {        //定义Student类型的集合        ArrayList<Student> array = new ArrayList<Student>();        //定义Student对象        Student s = new Student();        //定义键盘录入对象        Scanner sc = new Scanner(System.in);//往集合里填入个学生数据                for(int i=0;i<3;i++){            String name;            int age;            System.out.println("请输入姓名:");            name = sc.nextLine();            System.out.println("请输入年龄:");            age = Integer.parseInt(sc.nextLine());            s.setName(name);            s.setAge(age);            array.add(s);        }            //集合遍历      for(int x=0;x<array.size();i++){          System.out.println("姓名"+array.get(i).getName()                          + "----年龄" + array.get(i).getAge());          }      }     

运行结果
这里写图片描述

这里从结果可以看出来,都是我最后输入那个学生信息的结果,这是为什么呢。原因是,我们将Student 对象定义在循环外面,每次循环重新对同一个Student对象赋值,在内存中ArrayList三个位置都指向同一个Student对象,在Student对象内容的改变时,那么ArrayLIst里面装的值也发生改变,为了便于理解我画一张图。
这里写图片描述

图片中可以说明前两次存储的数据都被第三次替代,但是ArrayList中指向的都是一块内存,而不是三个所以会出现最后出现的都是第三个数据也就是name:cnj age:23。

所以我们需要将创建学生对象的语句放到循环中去,这样就会创建三个学生对象,并且集合中不同的索引会指向不同的内存。这时候内存是
这里写图片描述

这样的结果就是正确的
这里写图片描述

第一次图示内存模型,说的有问题欢迎指出!

原创粉丝点击