1. ArrayList 的介绍
-
ArrayList底层使用的是动态数组
-
ArrayList初始化不指定大小时,默认初始容量是10,并且只有当第一次添加数据的时候,才会初始化容量为10
-
ArrayList每次进行扩容变为原来数组的1.5倍,每次扩容都需要进行数组拷贝
-
当前使用的容量+1超过数组长度时,会触发扩容机制,确保数组能够存下下一个数据
2.Linkedlist 的介绍
-
Linkedlist底层使用的是双向链表的数据结构
-
在内存上不连续
3. ArrayList list = new ArrayList(10) 中的list扩容了几次
扩容了0次
这条语句只是声明和实例了一个ArrayList,指定了初始容量为10,没有扩容
4. ArrayList 和 数组直接怎样转换
ArrayList 转 数组
-
使用 List 的 toArray() 方法即可
-
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("1");
list1.add("2");
list1.add("3");
//传入初始化数组的长度,返回该对象的数组,否则返回Object类型的数组
String[] array1 = list1.toArray(new String[list1.size()]);
} -
List转为数组后,如果改变原来List的元素,转为的数组不受影响
数组转ArrayList
-
使用Arrays.asList即可
-
public static void main(String[] args) { String[] array = {"a","b","c"}; List<String> list = Arrays.asList(array); }
-
数组转为List后,改变原数组,转为的List也随之改变
5.ArrayList 和 Linkedlist的区别
-
底层结构不同
-
ArrayList 底层由动态数组实现
-
Linkedlist 底层由双向链表实现
-
-
操作数据效率不同
-
ArrayList 按照下标查询时间复杂度是O(1),Linkedlist 不支持下标查询
-
查找时的时间复杂度都是O(n),都需要遍历
-
ArrayList 尾部插入删除,时间复杂度是O(1),其他地方插入删除,时间复杂度是O(n)
-
LinkedList 头节点插入删除是O(1),其他节点插入删除,时间复杂度是O(n)
-
-
内存空间占用不同
-
ArrayList 内存连续,节省内存
-
Linkedlist 是双向链表,需要额外的空间存储指针,更占空间
-
-
线程安全
-
都是线程不安全的
-
如果保证线程安全,在方法内使用局部变量
-
使用线程安全的ArrayList 和 Linkedlist
-
public static void main(String[] args) {
List<Object> arrayList = Collections.synchronizedList(new ArrayList<>());
List<Object> linkedList = Collections.synchronizedList(new LinkedList<>());
}
-