Java ArrayList面试题

1. 什么是ArrayList?

ArrayList是一个动态数组的实现,它允许我们添加、删除和访问元素。

2. ArrayList和数组有什么区别?

数组的大小是固定的,而ArrayList的大小是动态的。

3. ArrayList是如何保证线程安全的?

可以通过Collections.synchronizedList方法将ArrayList包装为线程安全的列表。

List<Integer> syncList = Collections.synchronizedList(new ArrayList<>());

4. ArrayList中的元素是否可以是null?

可以,ArrayList允许存储null值。

ArrayList<String> list = new ArrayList<>();
list.add(null);

5. ArrayList是如何实现的?

ArrayList内部使用一个数组来存储元素,并使用一个size变量来记录当前列表中的元素数量。

6. ArrayList支持哪些常用的列表操作?

add, remove, get, set, size等。

ArrayList<Integer> list = new ArrayList<>();
list.add(1); // 添加元素
list.remove(0); // 移除元素
int element = list.get(0); // 获取元素
list.set(0, 2); // 修改元素
int size = list.size(); // 获取列表大小

7. ArrayList在添加元素时是如何工作的?

添加元素时,如果数组容量不足以容纳新元素,则会进行扩容操作。

8. ArrayList在删除元素时是如何工作的?

删除元素时,会将被删除元素之后的所有元素向前移动一位,并更新size变量。

9. ArrayList的扩容机制是什么?

ArrayList中的元素数量达到当前容量时,会将容量增加到原来的1.5倍,并复制到新的数组中。

10. ArrayList中是否可以有重复的元素?

可以,ArrayList不保证元素的唯一性。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(1); // 添加重复元素

11. ArrayList是否有序?

是的,ArrayList中的元素有序,按照添加的顺序排列。

12. ArrayList中的for-each循环和迭代器有什么区别?

for-each循环可以直接遍历ArrayList中的元素,而迭代器提供了更多的遍历控制功能,如移除元素。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);

for (Integer num : list) {
    System.out.println(num); // 使用for-each
}

Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
    Integer num = iterator.next();
    // iterator.remove(); // 使用迭代器移除元素
    System.out.println(num);
}

13. 如何检查ArrayList是否包含某个元素?

可以使用contains方法检查ArrayList是否包含某个元素。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
boolean contains = list.contains(1); // 返回true

14. 如何获取ArrayList中的元素?

可以使用get方法通过索引值获取ArrayList中的元素。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
Integer element = list.get(0);

15. 如何修改ArrayList中的元素?

可以使用set方法修改ArrayList中的元素。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.set(0, 2); // 修改索引为0的元素为2

16. 如何获取ArrayList的大小?

可以使用size方法获取ArrayList中的元素数量。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
int size = list.size();

17. 如何清空ArrayList?

可以使用clear方法清空ArrayList中的所有元素。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.clear(); // 清空列表

18. 如何在ArrayList中添加元素?

可以使用add方法在ArrayList的末尾或指定位置添加元素。

ArrayList<Integer> list = new ArrayList<>();
list.add(1); // 在末尾添加
list.add(0, 2); // 在指定位置添加

19. 如何从ArrayList中删除元素?

可以使用remove方法通过索引值或对象删除元素。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.remove(0); // 通过索引删除
list.remove(Integer.valueOf(2)); // 通过对象删除

20. ArrayList中是否可以存储基本数据类型?

ArrayList只能存储对象类型,对于基本数据类型,需要使用它们的包装类。

ArrayList<Integer> list = new ArrayList<>();
list.add(1); // 存储Integer对象

21. ArrayList的迭代器是如何工作的?

迭代器提供了一种在不使用索引的情况下遍历集合的方法,并且可以在遍历时安全地删除元素。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
    Integer num = iterator.next();
    iterator.remove(); // 安全删除元素
}

22. ArrayList中如何进行二分查找?

可以使用binarySearch方法在有序的ArrayList中进行二分查找。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Collections.sort(list); // 排序
int index = list.binarySearch(2); // 返回2的索引

23. ArrayList中如何获取子列表?

可以使用subList方法获取ArrayList的子列表。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
List<Integer> subList = list.subList(1, 3); // 获取索引1到2的子列表

24. ArrayList中如何进行排序?

可以使用Collections.sort方法对ArrayList进行排序。

ArrayList<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
Collections.sort(list); // 升序排序

25. ArrayList中如何实现克隆?

ArrayList实现了Cloneable接口,可以使用clone方法进行浅拷贝。

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
ArrayList<Integer> clonedList = (ArrayList<Integer>) list.clone(); // 浅拷贝