ArrayList常见问题
1、ArrayList是什么?可以用来干嘛?
ArrayList是一个可以动态扩容的存储结构。底层是一个Object类型数组。可以用来按照顺序存放数据。是Object类型可以存放任意类型的数据,如果是自定义类型必须重写equals方法,要不然remove(Object o)方法【通过值删除】无法正常使用,或者是indexOf(Object o)等方法
而且我们装载基本类型 int byte double float short boolean long char 只能使用他们的包装类,底层使用的是Object 数组
//你想找到张三这个人,但是你不重写equals方法,使用的是Object类的方法,直接比较地址,就不可能找到
public static void main(String[] args) {
ArrayList<Person> all = new ArrayList();
all.add(new Person("张三",20));
all.add(new Person("李四",18));
all.add(new Person("王五",30));
System.out.println(all.indexOf(new Person("张三", 20)));
all.remove(new Person("张三", 20));
System.out.println(all.toString());
}
static class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
-
ArrayList与LinkedList的区别?
1. ArrayList底层是数组,有扩容机制,查找修改元素快,但是增加删除元素慢,LinkedList 底层是双向链表,增删效率比较高且不需要初始化容量 2. 两者都可以存放null值,都线程不安全
-
那要多线程环境下使用什么代替ArrayList?
1.使用Collections.synchronizedList(arraylist) 2.使用CopyOnWriteArrayList 3.使用Vector
-
ArrayList初始化流程?1.7和1.8有什么区别?
1. 1.7是直接初始化一个大小为10的数组 2. 1.8是无参默认是Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}数组,当第一次add添加元素时,才会创建一个大小为10的数组 指定参数:为0时使用Object[] EMPTY_ELEMENTDATA = {}数组,大于0则直接创建大小为该参数的数组
-
ArrayList数组扩容机制
1. 简单描述:假设有一个大小为10的数组,已经存放了10个元素。在增加下一个元素的时候,就会去判断是否扩容。扩容是旧容量的1.5倍。然后将旧数组内容复制到新数组直接将elementData重新指定到新数组
-
说说ArrayList 为什么增删慢
1. 指定位置添加:创建一个新数组,将index之前的内容放进去,再把之后的放进去,空出index位置放置新值 需要扩容:每次add都会去进行扩容检测,然后如果要扩容就会调用system.arraycopy方法,新创建一个数组,将旧值copy过去,是一个耗费性能的操作 2. 删除的话也是会使用copy,创建一个新数组,将index之前的内存放到新数组,index之后的内容再放到新数组,跳过index位置
-
ArrayList的遍历如何?
遍历最大的优势再与底层是个数组,而数组存储是使用一片连续的内存,cpu会缓存连续的内存,可以降低cpu读取内存的性能开销