一、前言
来不及悼念字符串了,接下来登场的是集合,集合和数组的用法差不多,不同之处就在于存储的内容,数组是固定的长度的,集合的长度不固定。学习的过程中可以参照数组
今天已经是学习java的第八天了,接下来的课程都属于进阶部分了。基础部分已经彻底结束了。还是那句话,面向对象十分重要,接下来还会对面向对象进行深入的学习。
java基础部分一览
运算符、判断、循环
数组、方法
java小型实战项目双色球系统
面向对象基础篇综合训练
面向对象进阶篇综合训练
字符串基础篇
字符串进阶篇
二、ArrayList基本概念
ArrayList
是 Java 中非常常用的动态数组实现,它继承了 AbstractList
并实现了 List
接口。
动态数组实现
ArrayList
内部使用数组来存储元素,相比于普通的数组,它具有以下优点:
- 自动扩容:在需要添加更多元素时,
ArrayList
会自动增加其内部数组的容量,以容纳新的元素。 - 随机访问:可以通过索引快速访问数组中的任何元素,时间复杂度为 O(1)。
实现了List接口
ArrayList
实现了 List
接口,因此具有列表的所有特性:
允许存储重复元素。
保持元素的插入顺序。
提供了丰富的操作方法,如添加、删除、获取元素等。
特点和优点
- 灵活性:可以根据需要动态地增加或减少元素的个数。
- 性能:在大多数情况下,
ArrayList
的性能非常好。在随机访问和尾部插入/删除的操作中表现优异。 - 易用性:API 简单易懂,提供了丰富的方法来操作集合中的元素。
内部实现
ArrayList
内部使用一个 Object[]
数组来存储元素。当需要增加元素时,如果当前数组容量不足,会创建一个新的更大容量的数组,并将原来的元素复制到新数组中。这种机制保证了 ArrayList
的动态性和高效性。
注意事项
- 性能问题:频繁地在中间位置插入和删除元素可能会导致性能问题,因为涉及到数组元素的移动和复制。
- 线程安全:
ArrayList
不是线程安全的,如果需要在多线程环境下使用,可以考虑使用Collections.synchronizedList()
或CopyOnWriteArrayList
。
三、ArrayList常用操作
1. 集合的创建
要创建一个 ArrayList
,需要导入 java.util.ArrayList
并实例化它:
import java.util.ArrayList;public class ArrayList01 {public static void main(String[] args) {//1.创建集合ArrayList<String> list = new ArrayList<String>();}
}
2. 集合的增删改查
2.1 增加元素
//2.添加元素
list.add("A");
list.add("B");
list.add("C");
list.add("D");
2.2 删除元素
//3.删除元素
boolean result1 = list.remove("A");
System.out.println(result1);
System.out.println(list);boolean result2 = list.contains("E");
System.out.println(result2);
System.out.println(list);String str = list.remove(0);
System.out.println(str);
System.out.println(list);
result1为true:因为集合中有A这个元素。
result2为false:因为集合中没有B这个元素。
str为B:list.remove(0)代表list中下标为0的元素。
2.3 修改元素
//4.修改元素
String result3 = list.set(0,"E");
System.out.println(result3);
System.out.println(list);
语法:list.set(想要修改元素的下标,修改后的新值)
2.4 查找元素
//5.查找元素
String result4 = list.get(1);
System.out.println(result4);
System.out.println(list);
语法:list.get(查找元素的下标)
3.集合的遍历
//6.遍历
for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));
}
类似数组的遍历,for、while循环都可以
四、习题讲解
1. 集合的遍历方式
需求:定义一个集合,添加字符串,并进行遍历
遍历格式:[元素一、元素二、元素三]
import java.util.ArrayList;public class text1 {public static void main(String[] args) {//1.创建集合ArrayList<String> list = new ArrayList<>();//2.添加元素list.add("Hello");list.add("World");list.add("!");//3.遍历输出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.print("[");
打印左括号 [
,作为输出的起始标志。
for
循环遍历 list
中的每个元素:
list.size()
返回列表中元素的个数,循环条件 i < list.size()
确保循环遍历到所有元素。
list.get(i)
获取索引为 i
的元素。
根据索引 i
是否是最后一个元素,使用条件判断来决定是直接打印元素还是打印元素后跟随逗号。
System.out.println("]");
打印右括号 ]
,作为输出的结束标志,并换行。
2. 添加数字并遍历
需求:定义一个集合,添加数字,并进行遍历
遍历格式:[元素一、元素二、元素三]
基本数据类型对应的包装类:
public class text2 {public static void main(String[] args) {//1.创建集合ArrayList<Integer> list = new ArrayList<>();//2.添加元素list.add(1);list.add(2);list.add(3);//3.遍历输出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("]");}
}
结果展示:
3. 添加学生对象进行遍历
需求:定义一个集合,添加一些学生对象,并进行遍历。
学生对象的属性:姓名、年龄。
定义学生类:
public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public Student() {}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;}
}
java代码
import java.util.ArrayList;public class text3 {public static void main(String[] args) {//1.创建集合ArrayList<Student>list=new ArrayList<>();//2.创建学生对象Student s1=new Student("张三",18);Student s2=new Student("李四",19);Student s3=new Student("王五",22);//3.添加元素list.add(s1);list.add(s2);list.add(s3);//4.遍历输出学生信息for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i).getName()+'\t'+list.get(i).getAge());}}
}
代码分析:
使用 for
循环遍历 list
中的每个 Student
对象:
list.size()
返回列表中元素的个数,循环条件i < list.size()
确保循环遍历到所有元素。list.get(i)
获取索引为i
的Student
对象。list.get(i).getName()
和list.get(i).getAge()
分别获取当前Student
对象的名字和年龄。System.out.println()
打印每个学生的姓名和年龄,使用'\t'
进行姓名和年龄的分隔。
结果展示:
需求:定义一个集合,键盘录入一些学生对象,并进行遍历。
学生对象的属性:姓名、年龄。
java代码:
public class text3 {public static void main(String[] args) {//1.创建集合ArrayList<Student>list=new ArrayList<>();Scanner sc=new Scanner(System.in);//2.键盘录入学生对象for(int i=0;i<3;i++){Student s=new Student();System.out.println("请输入学生姓名:");s.setName(sc.next());System.out.println("请输入学生年龄:");s.setAge(sc.nextInt());list.add(s);}//3.遍历输出学生信息for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i).getName()+'\t'+list.get(i).getAge());}}
}
结果展示:
4. 添加用户对象并判断是否存在
需求:集合存入用户信息,用户属性有:id,username、password
要求:定义一个方法,根据ID查询用户信息
如果存在,返回true
如果不存在,返回false
定义用户类:
public class User {private int id;private String username;private String password;public User() {}public User(int id, String username, String password) {this.id = id;this.username = username;this.password = password;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
java代码:
public class text4 {public static void main(String[] args) {//1.定义集合ArrayList<User>list=new ArrayList<>();//2.添加用户信息Scanner sc=new Scanner(System.in);for (int i = 0; i < 3; i++) {User user=new User();System.out.print("请输入用户id:");user.setId(sc.nextInt());System.out.print("请输入用户名:");user.setUsername(sc.next());System.out.print("请输入用户密码:");user.setPassword(sc.next());list.add(user);}//3.根据id查找用户信息System.out.print("请输入你要查找的id:");int id=sc.nextInt();for (int i = 0; i < list.size(); i++) {if(list.get(i).getId()==id){System.out.println(true);break;}else{System.out.println(false);break;}}}
}
代码分析:
查找用户信息的循环:
- 使用
for
循环遍历list
中的每个User
对象。 - 每次迭代开始时,提示用户输入要查找的 id。
- 获取用户输入的 id,并与当前
User
对象的 id 进行比较。 - 如果找到匹配的 id,输出
true
并结束循环。 - 如果没有找到匹配的 id,输出
false
并结束循环。
结果展示:
5. 添加手机对象并返回要求的数据
需求:定义一个phone类
phone属性:品牌,价格
定义一个方法,将价格低于3000的手机信息返回
定义手机类:
public class Phone {private String brand;private int price;public Phone() {}public Phone(String brand, int price) {this.brand = brand;this.price = price;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}
}
java代码:
public class text5 {public static void main(String[] args) {//1.创建集合ArrayList<Phone>list=new ArrayList<>();//2.存放手机信息Phone phone1=new Phone("小米",1000);list.add(phone1);Phone phone2=new Phone("苹果",8000);list.add(phone2);Phone phone3=new Phone("鸭梨",2999);list.add(phone3);GetPhone(list);}public static void GetPhone(ArrayList<Phone>list) {int sum=0;for (int i = 0; i < list.size(); i++) {sum+=list.get(i).getPrice();}for (int i = 0; i < list.size(); i++) {if(list.get(i).getPrice()<=(sum/3)){System.out.println(list.get(i).getBrand()+" "+list.get(i).getPrice());}}}
}
代码分析:
-
ArrayList<Phone> list = new ArrayList<>();:创建了一个泛型为
Phone
的动态数组list
,用于存储手机对象。 -
Phone 类:假设
Phone
类有两个属性,品牌 (brand
) 和价格 (price
),并且具有相应的构造函数和获取方法(如getBrand()
和getPrice()
)。 -
主函数
main
:在main
函数中,创建了三个不同品牌和价格的手机对象,并将它们依次添加到list
中。然后调用了GetPhone(list)
方法。 -
GetPhone
方法:- 首先计算了所有手机价格的总和
sum
。 - 然后遍历
list
,检查每个手机的价格是否小于等于sum
的三分之一。 - 如果是,则打印该手机的品牌和价格。
- 首先计算了所有手机价格的总和