JAVA ArrayList 02-05 集合练习

1 集合的遍历方式

需求:定义一个集合,添加字符串,并进行遍历
遍历格式参照:[元素1,元素2,元素3]。

package com.bjpowernode;

import java.util.ArrayList;

public class ArrayListDemo02 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<String>  list = new ArrayList<>();

        //添加元素
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");

        //遍历
        System.out.print("[");
        for (int i = 0; i < list.size(); i++) {
            if(i != list.size() -1){
                System.out.print(list.get(i) + ", ");
            } else {
                System.out.print(list.get(i));
            }
        }
        System.out.println("]");
    }
}

运行结果:

2 添加数字并遍历

2.1 基本数据类型对应的包装类

byte           ---->      Byte
short          ---->      Short
char          ---->      Character
int             ---->       Integer

long           ---->       Long
float           ---->       Float
double       ---->       Double
boolean     ---->       Boolean

需求:定义一个集合,添加数字,并进行遍历。
遍历格式参照:[元素1,元素2,元素3]。

package com.bjpowernode;

import java.util.ArrayList;

public class ArrayListDemo03 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<Integer> list = new ArrayList<>();

        //添加元素
        // JDK5 以后 int Integer 之间是可以相互转化的
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        //遍历集合
        System.out.print("[");
        for (int i = 0; i < list.size(); i++) {
            if(i != list.size() -1){
                System.out.print(list.get(i) + ", ");
            } else {
                System.out.print(list.get(i));
            }
        }
        System.out.println("]");
    }
}

运行结果:

sout(list) 效果一样

Integer 是 Java 的一个包装类,它重写了 toString() 方法。所以打印出来的不是地址值

//遍历集合
//        System.out.print("[");
//        for (int i = 0; i < list.size(); i++) {
//            if(i != list.size() -1){
//                System.out.print(list.get(i) + ", ");
//            } else {
//                System.out.print(list.get(i));
//            }
//        }
//        System.out.println("]");

        System.out.println(list);
        //Integer 是 Java 的一个包装类,它重写了 toString() 方法。
        //对于 Integer 类来说,它的 toString() 方法返回的是该整数的字符串表示,而不是内存地址。

3 添加学生对象并遍历

需求:定义一个集合,添加一些学生对象,并进行遍历
学生类的属性为:姓名,年龄。

package com.bjpowernode;

import java.util.ArrayList;

public class Test01 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<Student> list = new ArrayList<>();

        //创建学生对象
        Student s1 = new Student("zhangsan", 23);
        Student s2 = new Student("lisi", 24);
        Student s3 = new Student("wangwu", 25);

        //添加元素
        list.add(s1);
        list.add(s2);
        list.add(s3);

        //遍历集合
//        System.out.println(list);   //打印的是地址值!!
        //Student 类没有重写 toString() 方法,
        // 所以会使用 Object 类的默认 toString() 方法,该方法返回的是对象的内存地址
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            System.out.println(stu.getName() + ", " + stu.getAge());
        }
    }
}

运行结果:

4 添加学生对象并遍 难度 +1

需求:定义一个集合,添加一些学生对象,并进行遍历
学生类的属性为:姓名,年龄。
要求:对象的数据来自键盘录入

4.1 两种错误写法

4.1.1 空指针异常

package com.bjpowernode;

import java.util.ArrayList;
import java.util.Scanner;

public class Test01 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<Student> list = new ArrayList<>();

        //键盘录入学生信息
        Scanner sc = new Scanner(System.in);
        //把信息存入学生对象
        Student[] stu  = new Student[3];
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入学生的姓名:");
            stu[i].setName(sc.next());       //会出现空指针异常!!
            System.out.println("请输入学生的年龄:");
            stu[i].setAge(sc.nextInt());
            //添加到集合中
            list.add(stu[i]);
        }
        System.out.println(list.size());

        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            Student stu2 = list.get(i);
            System.out.println(stu2.getName() + ", " + stu2.getAge());
        }
    }
}

运行结果:

分析:

stu[i].setName(...)stu[i].setAge(...) 这两行代码会导致空指针异常

因为 stu 数组中的元素未初始化。在 Java 中,数组中的元素在创建时默认值为 null,所以在使用 stu[i] 之前需要为它分配一个 Student 对象实例

Student[] stu = new Student[3] 内存变化:
  • 栈内存:stu → 堆内存中数组对象的起始地址
  • 堆内存:[null, null, null]
stu[i] = new Student() 内存变化:
  • 栈内存: stu → 堆内存中数组对象的起始地址
  • 堆内存: [Student0, null, null]
解决:

for 内添加:stu[i] = new Student()

package com.bjpowernode;

import java.util.ArrayList;
import java.util.Scanner;

public class Test01 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<Student> list = new ArrayList<>();

        //键盘录入学生信息
        Scanner sc = new Scanner(System.in);
        //把信息存入学生对象
        Student[] stu  = new Student[3];
        for (int i = 0; i < 3; i++) {
            stu[i] = new Student();
            System.out.println("请输入学生的姓名:");
            stu[i].setName(sc.next());       //会出现空指针异常!!
            System.out.println("请输入学生的年龄:");
            stu[i].setAge(sc.nextInt());
            //添加到集合中
            list.add(stu[i]);
        }
        System.out.println(list.size());

        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            Student stu2 = list.get(i);
            System.out.println(stu2.getName() + ", " + stu2.getAge());
        }
    }
}

运行结果:

4.1.2  值被覆盖

for 外创建对象,值会被覆盖

package com.bjpowernode;

import java.util.ArrayList;
import java.util.Scanner;

public class Test01 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<Student> list = new ArrayList<>();

        //键盘录入学生信息
        Scanner sc = new Scanner(System.in);
        Student stu = new Student();
        for (int i = 0; i < 3; i++) {
            System.out.println(stu);  //会打印三个不一样的地址
            System.out.println("请输入学生的姓名:");
            stu.setName(sc.next());
            System.out.println("请输入学生的年龄:");
            stu.setAge(sc.nextInt());
            //添加到集合中
            list.add(stu);
        }
        System.out.println(list.size());

        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            Student stu2 = list.get(i);
            System.out.println(stu2.getName() + ", " + stu2.getAge());
        }
    }
}

运行结果:

4.2 正确写法

for 循环内,会每次 new 一个新的对象,会有新的地址

package com.bjpowernode;

import java.util.ArrayList;
import java.util.Scanner;

public class Test01 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<Student> list = new ArrayList<>();

        //键盘录入学生信息
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            Student stu = new Student();
            System.out.println(stu);  //会打印三个不一样的地址
            System.out.println("请输入学生的姓名:");
            stu.setName(sc.next());       
            System.out.println("请输入学生的年龄:");
            stu.setAge(sc.nextInt());
            //添加到集合中
            list.add(stu);
        }
        System.out.println(list.size());

        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            Student stu2 = list.get(i);
            System.out.println(stu2.getName() + ", " + stu2.getAge());
        }
    }
}

运行结果:

5 添加用户对象并判断是否存在

需求:
1,main方法中定义一个集合,存入三个用户对象。
用户属性为:id,username,password
2,要求:定义一个方法,根据 id 查找对应的用户信息。
如果存在,返回 索引
如果不存在,返回 -1

package com.bjpowernode;

import java.util.ArrayList;

public class UserTest {
    public static void main(String[] args) {
        //创建集合
        ArrayList<User> list = new ArrayList<>();

        //创建三个用户对象
        User u1 = new User("001", "zhangsan", "123456");
        User u2 = new User("002", "lisi", "1234567");
        User u3 = new User("003", "wanngwu", "123");

        //把用户对象添加到集合中
        list.add(u1);
        list.add(u2);
        list.add(u3);

        //调用方法查看 id 是否存在
        if(contains(list,"001") != -1){
            System.out.println("ID 存在");
        } else {
            System.out.println("ID 不存在");
        }

    }
    public static int contains(ArrayList<User> list, String id){
        for (int i = 0; i < list.size(); i++) {
            if(id.equals(list.get(i).getId())){
                return i;
            }
        }
        return -1;
    }
}

运行结果:

6 添加手机对象并返回要求的数据

6.1 返回多个数据

装进容器/数组内返回

需求:
定义Javabean类:Phone
Phone属性:品牌,价格。
main方法中定义一个集合,存入三个手机对象。
分别为:小米,1000。苹果,8000。锤子2999。
定义一个方法,将价格低于3000的手机信息返回。

package com.bjpowernode;

import java.util.ArrayList;

public class PhoneTest {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList<Phone> list = new ArrayList<>();

        //创建手机的对象
        Phone p1 = new Phone("小米",2999);
        Phone p2 = new Phone("苹果",3999);
        Phone p3 = new Phone("锤子",1999);

        //添加元素
        list.add(p1);
        list.add(p2);
        list.add(p3);

        //定义集合接收
        ArrayList<Phone> phoneInfoList = getPhoneInfo(list,3000);

        //打印集合
        for (int i = 0; i < phoneInfoList.size(); i++) {
            System.out.println(phoneInfoList.get(i).getBrand() + ", " + phoneInfoList.get(i).getPrice());
        }
    }

    //技巧
    //如果我们要返回多个数据,可以把这些数据先放到一个容器当中,再把容器返回
    //集合 、 数组
    public static ArrayList<Phone> getPhoneInfo(ArrayList<Phone> list, int price){
        //定义一个集合用于存储价格低于3000的手机对象
        ArrayList<Phone> resultList = new ArrayList<>();
        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            if(list.get(i).getPrice() < price){   //list.get(i) 拿到手机对象
                //先将手机对象添加到集合中
                resultList.add(list.get(i));
            }
        }
        return resultList;   //返回集合
    }
}

运行结果:

参考链接:

ArrayList-02-集合练习-添加字符串和整数并遍历_哔哩哔哩_bilibili

ArrayList-03-集合练习-添加学生对象并遍历的两个练习_哔哩哔哩_bilibili

ArrayList-04-集合练习-查找用户是否存在_哔哩哔哩_bilibili

ArrayList-05-集合练习-返回多个数据_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值