JAVA随时笔记(二):Java面试题---基础之ArrayList相关

1、ArrayList的扩容原理

答:ArrayList的底层是一个数组结构,在jdk8之前,无参构造默认初始化容量为10,jdk8以后,容量默认为0,只有在添加第一个元素时,才扩容为默认的10。Arraylist的扩容是创建一个1.5倍长度的新数组,然后用Arrays.copyOf方法(内部调用的system.copy方法,system.copy是一个native方法,可以快速高效的对数组进行复制)把旧数组的值全部复制到新的数组中。再把内部的数组成员指向新的数组。

2、Arraylist和vector的区别

答:ArrayList是线程不安全的,vector是线程安全的,如果要让ArrayList线程安全,可以使用Collections.synchronizedList方法把Arraylist包装成线程安全的集合。vector的无参构造直接默认创建一个长度为10的数组。Arraylist只有再添加第一个元素才把长度为0的数组扩容为10。扩容的时候vector是将容量翻倍,即为原来的2倍,Arraylist是扩容0.5倍,即原来的1.5倍。因为vector是线程安全的,使用需要维护集合的同步,效率低于Arraylist。一般都是使用Arraylist,只有在需要考虑线程安全的情况下才使用vector。

3、ArrayList和LinkedList的区别

答:ArrayList是基于数组结构的,而LinkedList是基于链表结构实现的双向链表。ArrayList内部是使用的数组。在查询数组的时候直接根据索引就能找到对应的数组,时间复杂度为O(1),而LinkedList是链表结构,查询数组的时候是从头节点(或者尾节点)进行遍历。时间复杂度为O(n),使用在查询和修改比较多的场景下,优先考虑使用ArrayList。在插入元素的时候,ArrayList是把元素插入目标位置,然后把目标位置后面全部的元素都后移一位。删除的时候同理,时间复杂度为O(n)。而LinkwdList插入和删除元素只是把node节点的next和perv指向进行更改就行,时间复杂度为O(1)。所以在插入和删除比较多的场景下,优先考虑使用LinkedList。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值