集合ArrayList
- 是一种长度可变的容器
ArrayList
-
问题:能判断集合中存储的是什么类型的数据吗?
如果没有进行限定,此时集合可以存储任意类型的数据; -
但是取数据的时候也会有问题: 取出来的数据用什么变量接受呢? int? Double? 还是对象? 只能通过顶层接受。
Object a = list.get(0);
if(a instanceof int){
...
}else if (...)
...//太复杂了
这时候就涉及多态的弊端了:无法使用子类的独有功能;
- 所以我们会用泛型去限定集合能存储什么数据:
ArrayList<String> list = new ArrayList<>()
ArrayList的常见方法
1.添加数据
-
true: 添加成功 false:添加失败
-
此时add方法在任意情况下都会添加成功;
-
因为在Java中,有很多很多集合 HashSet(元素)要统一 第一次aaa(true) 第二次aaa(false)
-
设计: 跟其他集合保持统一(面向对象的思想)方法肯定不写在ArrayList,这样的话每个集合的add方法可能五花八门,放大发写在最上层的Collection接口中,并定义为抽象;
boolean res = list.add("add");
sout(res); //true
list.add(2,"qqq");//2为插入位置的索引
2.删除数据
- 根据元素内容进行删除:
- 存在: true 不存在 false
boolean res = list.remove("qqq")
- 根据索引进行删除
- 把被删除的索引进行返回
String res = list.remove(1);
3.修改数据
- 将指定位置的数据,修改为新元素、将被替换的元素进行返回;
String res = list.set(0,"ZZZ");
sout(res); //aaa(被替换的元素是aaa)
4.查找数据
- 获取特定索引的数据
String res = list.get(0);
- 遍历: get+size
- 遍历: 把容器里面的数据一个一个的拿出来,可以进行打印,计算,处理;
- 只能看一看集合里有什么,无法操作里面的元素;
sout(list);
基本数据类型对应的包装类
- 因为集合不能存储基本数据类型,所以需要包装类包装;
public class Memory{
psvm{
int a = 10; //基本数据类型
Integer b = 10; //引用数据类型
}
}
- 相当于创建了一个对象;
总结
案例:遍历集合并查找学号
public class Test {
public static void main(String[] args) {
Student s1 = new Student("张三", 18, "20230001");
Student s2 = new Student("李四", 19, "20230002");
Student s3 = new Student("王五", 18, "20230001");
ArrayList<Student> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).toString());
}
int index = Search(list, "20230001");
System.out.println(index);
}
public static int Search(ArrayList<Student> list, String id) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getId().equals(id)) {
return i;
}
}
return -1;
}
}