ArrayList介绍
ArrayList
的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。
ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:
import java.util.ArrayList; // 引入 ArrayList 类
ArrayList<E> objectName =new ArrayList<>(); // 初始化
- E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
- objectName: 对象名。
ArrayList<Integer> objectName =new ArrayList<>();
ArrayList<Character> objectName =new ArrayList<>();
ArrayList
继承于 AbstractList
,实现了 List
, RandomAccess
, Cloneable
, java.io.Serializable
这些接口。
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
}
List
: 表明它是一个列表,支持添加、删除、查找等操作,并且可以通过下标进行访问。RandomAccess
:这是一个标志接口,表明实现这个接口的List
集合是支持 快速随机访问 的。在ArrayList
中,我们即可以通过元素的序号快速获取元素对象,这就是快速随机访问。Cloneable
:表明它具有拷贝能力,可以进行深拷贝或浅拷贝操作。Serializable
: 表明它可以进行序列化操作,也就是可以将对象转换为字节流进行持久化存储或网络传输,非常方便。
ArrayList 和 Vector 的区别?(了解即可)
ArrayList
是List
的主要实现类,底层使用Object[]
存储,适用于频繁的查找工作,线程不安全 。Vector
是List
的古老实现类,底层使用Object[]
存储,线程安全。
ArrayList 可以添加 null 值吗?
ArrayList
中可以存储任何类型的对象,包括 null
值。不过,不建议向ArrayList
中添加 null
值, null
值无意义,会让代码难以维护比如忘记做判空处理就会导致空指针异常。
#补充说明
这里补充一点比较重要,但是容易被忽视掉的知识点:
- Java 中的
length
属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了 length 这个属性. - Java 中的
length()
方法是针对字符串说的,如果想看这个字符串的长度则用到length()
这个方法. - Java 中的
size()
方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!
ArrayList增、删、改、查
ArrayList 是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
import java.util.ArrayList;
public class RunoobTest {
public static void main(String[] args) {
// 1、创建集合
ArrayList<String> sites = new ArrayList<String>();
// 2、添加元素
sites.add("Google"); //----ida快捷键Ctrl+D下一行复制
sites.add("Runoob");
sites.add("Taobao");
sites.add("Weibo");
// 3、访问元素
System.out.println(sites.get(1)); // 访问第二个元素
// 4、修改元素
sites.set(2, "Wiki"); // 第一个参数为索引位置,第二个为要修改的值
System.out.println(sites);
// 5、删除元素
sites.remove(3); // 删除第四个元素
System.out.println(sites);
// 6、遍历元素
for (int i = 0; i < sites.size(); i++) {
System.out.println(sites.get(i));
}
// 也可以使用 for-each 来迭代元素:
for (String i : sites) {
System.out.println(i);
}
// sort() 方法可以对字符或数字列表进行排序
sites.add("Wiki");
sites.add("Runoob");
Collections.sort(sites);
for (String i : sites) {
System.out.println(i);
}
// 检查 Runoob 是否在这个数组中
System.out.print("Runoob是否存在于arraylist: ");
System.out.println(sites.contains("Runoob"));
// arraylist.indexOf(Object obj) 返回动态数组中元素的索引值
// 查找位置索引值为 Runoob 的元素
int position1 = sites.indexOf("Runoob");
System.out.println("Runoob 的索引位置: " + position1);
// 查找位置索引值为 Weibo 的元素
int position2 = sites.indexOf("Weibo");
System.out.println("Weibo 的索引位置: " + position2); // 如果动态数组中不存在指定的元素,则该 indexOf() 方法返回 -1
// arraylist.isEmpty() 检查该数组是否为空
boolean result = sites.isEmpty(); // false
System.out.println("sites 是否为空? " + result);
// arraylist.subList(int fromIndex, int toIndex) 用于截取并返回动态数组中的一部分
System.out.println();
System.out.println(sites);
System.out.println("SubList:" + sites.subList(2, sites.size()));
// arraylist.toArray(T[] arr) ---将Arraylist对象转换为数组T[]arr(可选参数)-用于存储数组元素的数组
System.out.println();
/**
* 创建一个新的String类型的数组, 数组长度和 ArrayList 长度一样
* String[] arr = new String[sites.size()];
* sites.toArray(arr);
*/
Object[] obj = sites.toArray(); //该方法没有参数
for (int i = 0; i < obj.length; i++) {
System.out.println(obj[i]);
}
// arraylist.toString() 将Arraylist对象转换为字符串
String str = sites.toString();
System.out.println("String:" + str);
// arraylist.removeRange(int fromIndex, int toIndex) 用于删除指定索引之间存在的元素
//sites.removeRange(1, 2);
// arraylist.clear() 删除所有元素
sites.clear();
System.out.println("所有 clear() 方法后: " + sites);
}
}
练习题1:
【添加学生对象并遍历】定义一个集合,添加一些学生对象,并进行遍历学生类的属性为:姓名、年龄
要求:对象的数据来自键盘录入
构造 Student javabean
package list.demo.com;
public class Student {
// 标准JavaBean: 1、私有化成员变量 2、空参构造器方法 3、带参数构造器方法 4、set/get方法
private String name;
private int age;
public Student() {
// 快捷键——Arlt+Insert-构造参数—无选择select none
}
public Student(String name, int age) {
// 快捷键——Arlt+Insert-构造参数—全选属性-确定
this.name = name;
this.age = age;
}
public String getName() {
// 快捷键——Arlt+Insert-构造参数—getter和setter-全选-确定
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package list.demo.com;
import java.util.ArrayList;
public class TestAddStudents {
public static void main(String[] args) {
// 创建学生集合
ArrayList<Student> list = new ArrayList<>();
//创建学生对象
Student s1 = new Student("张三",23);
Student s2 = new Student("李四",25);
Student s3 = new Student("王武",27);
// 添加学生属性
list.add(s1);
list.add(s2);
list.add(s3);
System.out.println(list.size());
for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
System.out.println(s.getName() +","+ s.getAge());
}
}
}
package list.demo.com;
import java.util.ArrayList;
import java.util.Scanner;
public class TestAddStudentsList {
public static void main(String[] args) {
// 创建学生集合
ArrayList<Student> list = new ArrayList<>();
// 键盘录入学生信息
Scanner sc = new Scanner(System.in);
//for (int i = 0; i < list.size(); i++) {
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);
}
System.out.println(list.size());
for (int i = 0; i < list.size(); i++) {
// 通过i索引 获取学生对象
Student s = list.get(i);
System.out.println(s.getName() +","+ s.getAge());
}
}
}
输出结果:
请输入学生姓名:
张三
请输入学生年龄:
23
请输入学生姓名:
李四
请输入学生年龄:
25
请输入学生姓名:
王武
请输入学生年龄:
27
3
张三,23
李四,25
王武,27