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