Java List
ArrayList 和 Array(数组)的区别?加灵活:
ArrayList会根据实际存储的元素动态地扩容或缩容,而Array被创建之后就不能改变它的长度了。ArrayList允许你使用泛型来确保类型安全,Array则不可以。ArrayList中只能存储对象。对于基本类型数据,需要使用其对应的包装类(如 Integer、Double 等)。Array可以直接存储基本类型数据,也可以存储对象。ArrayList支持插入、删除、遍历等常见操作,并且提供了丰富的 API 操作方法,比如add()、remove()等。Array只是一个固定长度的数组,只能按照下标访问其中的元素,不具备动态添加、删除元素的能力。ArrayList创建时不需要指定大小,而Array创建时必须指定大小
ArrayList 和 LinkedList 有什么区别?
ArrayList 是基于数组实现的, LinkedList 是基于链表实现的
多数情况下, ArrayList 更利于查找, LinkedList 更利于增删
ArrayList 的扩容机制了解吗?
当往 ArrayList 中添加元素时,会先检查是否需要扩容,如果当前容量+1 超过数组⻓度,就会进⾏扩容。
扩容后的新数组⻓度是原来的 1.5 倍,然后再把原数组的值拷⻉到新数组中
有哪几种实现 ArrayList 线程安全的方法?
常用的有两种。
可以使用 Collections.synchronizedList() 方法,它可以返回一个线程安全的 List。
SynchronizedList list = Collections.synchronizedList(new ArrayList());内部是通过 synchronized 关键字加锁来实现的。
也可以直接使用 CopyOnWriteArrayList,它是线程安全的 ArrayList,遵循写时复制的原则,每当对列表进行修改时,都会创建一个新副本,这个新副本会替换旧的列表,而对旧列表的所有读取操作仍然在原有的列表上进行。
CopyOnWriteArrayList list = new CopyOnWriteArrayList();通俗的讲,CopyOnWrite 就是当我们往一个容器添加元素的时候,不直接往容器中添加,而是先复制出一个新的容器,然后在新的容器里添加元素,添加完之后,再将原容器的引用指向新的容器。多个线程在读的时候,不需要加锁,因为当前容器不会添加任何元素。这样就实现了线程安全。