List
ArrayList 和 Array(数组)的区别?
- ArrayList 内部基于动态数组实现,比 Array(静态数组) 使用起来更加灵活
- ArrayList会根据实际存储的元素动态的扩容,但是Array不能改变长度
- ArrayList使用泛型来确保类型安全 但是Array不可以
- ArrayList中只能存储对象,对于基本类型数据,需要使用其对应的包装类,Array可以存储基本数据类型和对象
- ArrayList支持插入、删除、遍历等常见操作 并且提供丰富的API操作
- ArrayList创建不需要指定大小,但是Array创建需要指定大小
Array
// 初始化一个 String 类型的数组
String[] stringArr = new String[]{"hello", "world", "!"};
// 修改数组元素的值
stringArr[0] = "goodbye";
System.out.println(Arrays.toString(stringArr));// [goodbye, world, !]
// 删除数组中的元素,需要手动移动后面的元素
for (int i = 0; i < stringArr.length - 1; i++) {
stringArr[i] = stringArr[i + 1];
}
stringArr[stringArr.length - 1] = null;
System.out.println(Arrays.toString(stringArr));// [world, !, null]
ArrayList
// 初始化一个 String 类型的 ArrayList
ArrayList<String> stringList = new ArrayList<>(Arrays.asList("hello", "world", "!"));
// 添加元素到 ArrayList 中
stringList.add("goodbye");
System.out.println(stringList);// [hello, world, !, goodbye]
// 修改 ArrayList 中的元素
stringList.set(0, "hi");
System.out.println(stringList);// [hi, world, !, goodbye]
// 删除 ArrayList 中的元素
stringList.remove(0);
System.out.println(stringList); // [world, !, goodbye]
ArrayList和vector
- ArrayList 是 List 的主要实现类,底层使用 Object[]存储,适用于频繁的查找工作,线程不安全 。
- Vector 是 List 的古老实现类,底层使用Object[] 存储,线程安全
ArrayList 可以添加 null 值吗?
- ArrayList 中可以存储任何类型的对象,包括 null 值。不过,不建议向ArrayList 中添加 null 值, null 值无意义,会让代码难以维护比如忘记做判空处理就会导致空指针异常。
ArrayList 插入和删除元素的时间复杂度?
对于插入
- 头部插入:由于需要将所有元素向后移动一个位置,时间复杂度是O(n)
- 尾部插入:当ArrayList容量没有满,o(1),如果需要扩容,那么需要赋值到更大的数据,然后添加元素
- 指定位置插入,将目标位置之后的所有元素向后移动一个位置,O(n)
对于删除
- 头部删除:由于需要将所有元素依次向前移动一个位置,因此时间复杂度是 O(n)。
- 尾部删除:当删除的元素位于列表末尾时,时间复杂度为 O(1)。
- 指定位置删除:需要将目标元素之后的所有元素向前移动一个位置以填补被删除的空白位置,因此需要移动平均 n/2 个元素,时间复杂度为 O(n)。