目录
一、集合概述
集合类:面向对象类,对事物的描述都是通过对象实现。为方便对多个对象进行操作,必须对多个对象进行存储,因此需要容器类。容器类特点是长度可变。
1. 为什么要有集合?
如果我们想要同时存储多个元素,我们该怎么办?
- 数组可以做 但是有弊端。
- 数组的长度是固定不变的,数组创建完毕后,其其长度就不能再被改变。
所以,此时我们就要考虑有没有长度可变的容器呢?
因此,我们就引入了集合。(集合底层实现自动扩容。)
2. 集合和数组的对比
长度 | 存储类型 | |
数组 | 可以存基本数据类型 可以存引用数据类型 | |
集合 | 可以存引用数据类型 基本数据类型 —> 包装类 |
二、 ArrayList
让我们打开API帮助文档搜索 ArrayList 显示:
public static void main(String[] args) {
//1.创建集合对象
//泛型:限定集合中存储数据的类型
//ArrayList<int> 会报错 因为集合不能直接存储基本数据类型
//ArrayList<String> list =new ArrayList<String>();
//jdk7
//此时,创建的是Arraylist对象,而ArrayList是写好的类
//这个类在底层做了一些处理
//打印对象不是地址值,而是集合中存储数据内容
//在展示的时候会拿[]把所有的数据源进行包装
ArrayList<String> list =new ArrayList<>();
System.out.println(list); // []
}
1. ArrayList 成员方法
方法名 | 说明 | |
增 | boolean add(String element) | 添加元素,返回值表示是否添加成功 |
删 | boolean remove(String element) | 删除指定元素,返回值表示是否删除成功 |
remove(int index) | 删除指定索引的元素,返回被删除元素 | |
改 | set(int index,String element) | 修改指定索引下的元素,返回原来的元素 |
查 | get(int index) | 获取指定索引下的元素 |
int size() | 集合的长度,也就是集合中元素的个数 |
public static void main(String[] args) {
//1.创建一个集合对象
ArrayList<String> list = new ArrayList<>();
//2.添加元素
boolean result = list.add("aaa");
System.out.println(result);
//add()不管添加什么都会添加成功
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list);
//3.删除元素
//集合索引规则与数组、字符串索引规则一样(从0开始)
boolean result1 = list.remove("aaa");
System.out.println(result1);
System.out.println(list);
boolean result2 = list.remove("ddd");
System.out.println(result2);
//4.根据索引删除元素
String str = list.remove(0) ;
System.out.println(str);
//5.修改元素
String str1 = list.set(1, "ddd");
System.out.println(str1); //被覆盖元素返回
//6.查询元素
String str2 = list.get(0);
System.out.println(str2);
//7.遍历集合
for (int i = 0; i < list.size(); i++) {
String str3 = list.get(i);
System.out.println(str3);
}
}
2. 基本数据类型对应包装类
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
三、综合练习
1. 集合的遍历方式
需求:定义一个集合,添加字符串,并进行遍历遍历格式参照:[元素1,元素2,元素3]。
public static void main(String[] args) {
//1.创建集合
ArrayList<String> list = new ArrayList<>();
//2.添加元素
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
//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.print("]");
}
2. 添加学生对象并遍历
需求:定义一个集合,添加一些学生对象,并进行遍历
学生类的属性为︰姓名,年龄。要求:对象的数据来自键盘录入
//Student.java
public class Student {
//标准JAVA Bean
//1.私有成员变量
//2.空参构造方法
//3.带全部参数的构造方法
//4.get/set方法
private String name;
private int age;
public Student(){}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
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;
}
}
StudentTest.java
public static void main(String[] args) {
// 1.创建集合
ArrayList<Student> list = new ArrayList<>();
// 一开始创建 集合长度为0(集合长度是可变的)
// 2.键盘录入学生信息并添加到集合中
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
Student stu = new Student();
System.out.println("请输入学生姓名:");
String name = sc.next();
System.out.println("请输入学生年龄:");
int age = sc.nextInt();
// 把name和age添加到学生对象
stu.setName(name);
stu.setAge(age);
list.add(stu);
}
// 4.遍历集合
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
// 此时直接输出stu 获取的是地址值 要通过get方法获取变量值
System.out.println(stu.getName() + "," + stu.getAge());
}
}
运行结果:
思考:如果将Student stu = new Student() 放在循环外,结果还会是上图所示吗?
Student stu = new Student(); Scanner sc = new Scanner(System.in); for (int i = 0; i < 3; i++) { System.out.println("请输入学生姓名:"); String name = sc.next(); System.out.println("请输入学生年龄:"); int age = sc.nextInt(); stu.setName(name); stu.setAge(age); list.add(stu); }
运行结果:
原因:没有创建新的学生对象,同一个对象被赋值不同的学生信息,后添加的学生信息会覆盖之前的学生信息,最后添加的学生信息会最终存在集合当中。
3. 添加用户信息并判断是否存在
需求:
1 , main方法中定义一个集合,存入三个用户对象。
用户属性为: id,username, password
2,要求:定义一个方法,根据id查找对应的用户信息。
如果存在,返回true
如果不存在,返回false
User.java
public class User {
private String id;
private String username;
private String password;
public User() {
}
public User(String id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public String getId() {
return id;
}
public void setId(String 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;
}
}
UserTest.java
public class UserTest {
public static void main(String[] args) {
// 1.创建集合
ArrayList<User> list = new ArrayList<>();
//2.创建三个用户对象
User u1 = new User("user001","张三","123456");
User u2 = new User("user002","李四","123456");
User u3 = new User("user003","王五","123456");
//3.用户信息添加到集合当中
list.add(u1);
list.add(u2);
list.add(u3);
//4.调用方法查看id是否存在
int index =getIndex(list, "user001");
boolean flag = contains(list, "user004");
//5.输出结果
System.out.println(index); //0
System.out.println(flag); //flase
}
public static boolean contains(ArrayList<User> list,String id) {
return getIndex(list, id)>=0;
}
public static int getIndex(ArrayList<User> list,String id) {
for (int i = 0; i < list.size(); i++) {
User u=list.get(i);
String uid = u.getId();
if (uid.equals(id)) {
//找到了返回true
return i;
}
}
//集合内所有元素都对比玩 都没有一样的
return -1;
}
}
4. 添加手机对象并返回要求的数据
需求:
定义Javabean类: PhonePhone属性:品牌,价格。
main方法中定义一个集合,存入三个手机对象。分别为:小米,1000。苹果,8000。锤子2999。
定义一个方法,将价格低于3000的手机信息返回。
//Phone.java
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;
}
}
//PhoneTest.java
public class PhoneTest {
public static void main(String[] args) {
//1.创建集合对象
ArrayList<Phone> list= new ArrayList<>();
//2.创建手机对象
Phone p1 = new Phone("小米",1000);
Phone p2 = new Phone("苹果",8000);
Phone p3 = new Phone("华为",2999);
//3.添加手机对象到集合当中
list.add(p1);
list.add(p2);
list.add(p3);
//4.调用方法
ArrayList<Phone> phones = getPhoneInfo(list);
//5. 遍历循环
for (int i = 0; i < phones.size(); i++) {
Phone p = phones.get(i);
System.out.println(p.getBrand() +"," + p.getPrice());
}
}
//技巧:
//以后我们要返回多个数据,可以把这些数据先存放到一个容器中,再把容器返回
//集合 数组
public static ArrayList<Phone> getPhoneInfo(ArrayList<Phone> list) {
ArrayList<Phone> resultPhone = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
Phone p= list.get(i);
int price = p.getPrice();
if (price < 3000) {
resultPhone.add(p);
}
}
return resultPhone;
}
}