Java 集合 03 综合练习(黑马)

文章讨论了Java编程中的问题,如如何避免因未正确初始化集合导致的遍历问题,以及对象赋值时的内存地址问题。重点介绍了如何重写toString()方法以获得对象属性而非地址,以及如何在循环中正确创建并添加对象到集合中。
摘要由CSDN通过智能技术生成

练习1、

 ps:输出结果为地址值,是因为在输出对象时,默认调用了对象的toString()方法。在没有重写toString()方法的情况下,toString()方法返回的是对象的地址值。如果想要输出对象的属性值而不是地址值,可以重写toString()方法。

可以改为这样:

代码:

import java.util.ArrayList;
public class  practice {
    public static void main(String[] args) {
        //定义一个集合
        ArrayList<Student> list = new ArrayList<>();
        //创建学生对象
        Student s1 = new Student("zhangsan",19);
        Student s2 = new Student("lisi",20);
        Student s3 = new Student("wangwu",10);
        Student s4 = new Student("xiaoliu",18);

        //添加元素
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        //遍历集合
        for(int i=0;i< list.size();i++){
            Student stu = list.get(i);
            System.out.println(stu.getName()+","+stu.getAge());
        }
    }
}

结果:

练习2、

问题1、没有执行添加的循环,最后集合长度为0;

因为集合的长度一开始为0;所以size方法返回的for里面的就为0,如下图所示,相当于第一次循环就不执行,循环没有执行;

所以改为固定的数字即可;

问题2、如果将Student s = new Student();放在循环外面,会出现全部被最后一个人替代的问题:

原因是:第一次创建学生对象后,地址是0x0011,将zhangsan 23复制进去后,存储到集合中,接下来并没有再次创建对象,所以还是对同一个对象赋值,变为lisi 24,再将0x0011放进集合中,最后输入的是wangwu 25,仍然是对这个对象赋值,所以,存入集合中的是三个一样的地址都是0x0011,所以指向的都是同一个对象,所以输出的都是wangwu 25;

正确的是这样的:

自己写的代码:(冗余)

import java.util.Scanner;
import java.util.ArrayList;
public class  practice {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        //定义一个集合
        ArrayList<Student> list = new ArrayList<>();
        //创建学生对象
        Student s1 = new Student();
        Student s2 = new Student();
        Student s3 = new Student();

        System.out.println("输入第一个同学的名字:");
        String n1 = input.next();
        s1.setName(n1);
        System.out.println("输入第二个同学的名字:");
        String n2 = input.next();
        s2.setName(n2);
        System.out.println("输入第三个同学的名字:");
        String n3 = input.next();
        s3.setName(n3);
        System.out.println("输入第一个同学的年龄:");
        int a1 = input.nextInt();
        s1.setAge(a1);
        System.out.println("输入第二个同学的年龄:");
        int a2 = input.nextInt();
        s2.setAge(a2);
        System.out.println("输入第三个同学的年龄:");
        int a3 = input.nextInt();
        s3.setAge(a3);

        //添加元素
        list.add(s1);
        list.add(s2);
        list.add(s3);
        //遍历集合
        for(int i=0;i< list.size();i++){
            Student stu = list.get(i);
            System.out.println(stu.getName()+","+stu.getAge());
        }
    }
}
public class Student {
    //私有化成员变量
    private String name ;
    private int age;
    //空参构造
    public Student() {
    }
    //带全部参数的构造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //get/set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

代码结果:

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值