ArrayList 算是我们开发中最经常用到的一个集合了,使用起来很方便,对于内部元素的随机访问很快。今天来分析下ArrayList的一些原理方法,对于平常工作和面试都是非常有用的。
另外本人整理收藏了20年多家公司面试知识点整理 ,以及各种Java核心知识点免费分享给大家,我认为对面试来说是非常有用的,想要资料的话请点795983544 暗号CSDN。
ArrayList 是一个数组队列,相当于 动态数组。与 Java 中的数组相比,它的容量能动态增长。它继承于 AbstractList,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。 看过 ArrayList 源码的同学有没有注意过有这么一个细节:为什么 ArrayList 实现了RandomAccess这个接口,但是 LinkedList 却没有实现这个接口?这是一个空接口,里面没有任何的方法,有什么作用呢?
答案: RandomAccess 是一个标志接口,表明实现这个这个接口的 List 集合是支持快速随机访问的。也就是说,实现了这个接口的集合是支持 快速随机访问 策略的。而 LinkedList 是不能实现随机访问的。
ArrayList 包含了两个重要的对象:elementData 和 size。
那是不是有人就会问既然 ArrayList 本质是数组,那为啥它的长度可以改变?
首先,数组的确长度不能改变。不过,ArrayList 内部有一系列骚操作,大概就是它每次觉得长度不够就会 创建一个新数组,这个新数组的容量比原来多出 50%,把原来的数组 copy 过来,然后把以前的数组销毁掉。
// 随机访问
List<String> list = new ArrayList<>();
int size = list.size();
for (int i = 0; i < size; i++) {
value = list.get(i);
}
// 迭代器遍历
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
value = iter.next();
}
// 增强 for 循环
for (String s : list) {
value = s;
}
list.forEach(p -> {
p.hashCode();
});
四种遍历比较
虽然有四种遍历方式,但是能够正确删除数据的方式只有两种
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
iter.next().hashCode();
iter.remove();
}
for(int i = list.size()-1;i>=0;i--){
list.remove(i);
}
下面再演示下错误的删除操作
List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("2");
for(int i=0;i<list.size();i++){
list.remove(i);
}
System.out.println(String.join(",",list));
结果输出:1
谨慎使用 ArrayList 中的 subList 方法
List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("2");
ArrayList<String> strings = (ArrayList)list.subList(0, 1);
运行结果:
Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList$SubList cannot be cast to java.util.ArrayList
at com.workit.demo.listener.ArrayListTest.main(ArrayListTest.java:29)
List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("2");
List<String> subList = list.subList(0, 1);
// 对原 List 增加一个值
list.add("10");
subList.add("11"); // 这一行会报 java.util.ConcurrentModificationException
另外本人整理收藏了20年多家公司面试知识点整理 ,以及各种Java核心知识点免费分享给大家,我认为对面试来说是非常有用的,想要资料的话请点795983544 暗号CSDN。