ArrayList是什么

ArrayList表示一种集合,它是一个容器,用来装数据的,类似于数组。

Q: 那有了数组,为什么要有集合呢?

A: 因为数组一旦创建大小不变,比如创建一个长度为3的数组,就只能存储3个元素,想要存储第4个元素就不行。而集合是大小可变的,想要存储几个元素就存储几个元素,在实际工作中用得更多。

ArrayList常用方法

  • 创建一个ArrayList的集合对象ArrayList <String> list = new ArrayList<>()
  • 往集合中的某个索引位置处添加一个数据list.add(0,"小威");
  • 根据索引获取集合中某个索引位置处的值list.indexOf("小威")
  • 获取集合的大小list.size()
  • 根据索引删除集合中的某个元素值,会返回被删除的元素值list.remove(0)
  • 根据元素值删除某个元素,删除成功会返回true,反之false.list.remove("小华")
  • 修改某个索引位置处的数据,修改后会返回原来的值list.set(1, "我")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ArrayList<String>  list = new ArrayList<>();  // 创建一个ArrayList的集合对象
list.add("小明");
list.add("小张");
list.add("小李");
System.out.println(list);
// 往集合中的某个索引位置处添加一个数据
list.add(0,"小威");
System.out.println(list); // 感觉跟Python的list差不多
// 根据索引获取集合中某个索引位置处的值
int index = list.indexOf("小威");
System.out.println(index);
// 获取集合的大小(返回集合中存储的元素个数)
System.out.println(list.size());
// 根据索引删除集合中的某个元素值,会返回被删除的元素值给我们
String s1 = list.remove(0);
System.out.println(s1);
// 直接删除某个元素值,删除成功会返回true,反之false. 默认删除的是第一次出现的这个小明的数据的
System.out.println(list.remove("小华"));
// 修改某个索引位置处的数据,修改后会返回原来的值给我们
String s2 = list.set(1, "我");
System.out.println(s2);
System.out.println(list);

ArrayList应用案例1

1.用户可以选购多个商品,可以创建一个ArrayList集合,存储这些商品
2.按照需求,如果用户选择了”枸杞”批量删除,应该删除包含”枸杞”的所有元素
1)这时应该遍历集合中每一个String类型的元素
2)使用String类的方法contains判断字符串中是否包含”枸杞”
3)包含就把元素删除
3.输出集合中的元素,看是否包含”枸杞”的元素全部删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ArrayList<String> list = new ArrayList<>();
list.add("枸杞");
list.add("Java入门");
list.add("宁夏枸杞");
list.add("黑枸杞");
list.add("人字拖");
list.add("特级枸杞");
list.add("枸杞子");
// 解决这种删除元素后list数组元素会移动的问题有两种方法
/*
第一种:for (int i = 0; i < list.size(); i++){
list.remove(i) // 可以通过下标,也可以通过元素的值进行删除
i--;
}
第二种:倒叙遍历数组 for (int i = list.size() - 1; i >= 0; i--) {
list.remove(i)
}
*/
for (int i = 0; i < list.size(); i++) {
String s = list.get(i); // 获取第i个元素的字符
if (s.contains("枸杞")){
list.remove(s);
}else continue;
i--;
}
System.out.println(list);

}

ArrayList应用案例2

  1. 在外卖系统中,每一份菜都包含,菜品的名称、菜品的原价、菜品的优惠价、菜品的其他信息。那我们就可以定义一个菜品类(Food类),用来描述每一个菜品对象要封装那些数据。
  2. 接着再写一个菜品管理类(FoodManager类),提供展示操作界面、上架菜品、浏览菜品的功能。

具体步骤

  • 首先我们先定义一个菜品类(Food类),用来描述每一个菜品对象要封装那些数据。
  • 接下来写一个菜品管理类,提供上架菜品的功能、浏览菜品的功能、展示操作界面的功能。
  • 最后在写一个测试类Test,在测试类中进行测试。其实测试类,只起到一个启动程序的作用

Food类(实体类, POJO, JavaBean类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class Food {
//私有属性,构造方法(空参,全参),setXxx,getXxx方法
private String name; //菜品名称
private double originalPrice; //菜品单价
private double specialPrice; //菜品优惠价
private String info; //菜品其他信息

public Food() {
}

public Food(String name, double originalPrice, double specialPrice, String info) {
this.name = name;
this.originalPrice = originalPrice;
this.specialPrice = specialPrice;
this.info = info;
}

public String getName() {
return name;
}

public double getOriginalPrice() {
return originalPrice;
}

public double getSpecialPrice() {
return specialPrice;
}

public String getInfo() {
return info;
}

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

public void setOriginalPrice(double originalPrice) {
this.originalPrice = originalPrice;
}

public void setSpecialPrice(double specialPrice) {
this.specialPrice = specialPrice;
}

public void setInfo(String info) {
this.info = info;
}
}

FoodManager类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.itheima.takeout;

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

/*
为了存储多个菜品, 预先创建一个ArrayList集合,
上架菜品就是往集合中添加菜品对象,
浏览菜品就是遍历集合中的菜品,并打印菜品对象的属性信息
*/
public class FoodManager {
private ArrayList<Food> foods = new ArrayList<>();
//提前创建好Scanner对象,方便后续键盘录入
private Scanner sc = new Scanner(System.in);
//负责添加菜品的方法
public void add(){
System.out.println("===菜品上架===");
//创建对象
Food food = new Food();
System.out.println("请您输入上架菜品的名称: ");
String name = sc.next();
food.setName(name);
System.out.println("请您输入上架菜品的价格: ");
double price = sc.nextDouble();
food.setOriginalPrice(price);
System.out.println("请您输入上架菜品的优惠价: ");
double specialPrice = sc.nextDouble();
food.setSpecialPrice(specialPrice);
System.out.println("请您输入上架菜品的其他信息: ");
String info = sc.next();
food.setInfo(info);
//把菜品添加到集合容器中
foods.add(food);
System.out.println("恭喜你,上架菜品成功!");
}
//负责打印菜品具体信息
public void printAllFoods(){
System.out.println("===当前菜品信息如下===");
for(int i = 0; i < foods.size(); i++){
//创建菜品对象(因为对象属性私有,所以要通过对象的get方法获取私有属性
Food food = new Food();
System.out.println("菜品名称:" + food.getName());
System.out.println("菜品原价:" + food.getOriginalPrice());
System.out.println("菜品优惠价:" + food.getSpecialPrice());
System.out.println("其他描述信息:" + food.getInfo());
System.out.println("------------------------");
}
}
//负责展示系统界面的
public void start(){
while (true){
System.out.println("====欢迎进入商家后台管理系统=====");
System.out.println("1、上架菜品(add)");
System.out.println("2、浏览菜品(query)");
System.out.println("3、退出系统(exit)");
System.out.println("请您选择操作命令:");
String command = sc.next();
switch (command){
case "add":
add(); //调用上架菜品的函数
break; //如果不适用break会出现switch穿透
case "query":
printAllFoods();
break;
case "exit":
return; //结束当前方法
//如果上面的都没有匹配到
default:
System.out.println("您输入的命令有误....");
}
}
}
}

测试类

1
2
3
4
5
6
7
public class ArrayListDemo {
public static void main(String[] args) {
//创建菜品管理对象
FoodManager fm = new FoodManager();
fm.start();
}
}