Java 面试复习_2
2019-5-18
作者:水不要鱼
(注:能力有限,如有说错,请指正!)
- ArrayList 底层使用数组,每一次空间满了就进行扩容,
先创建一个容量为原来容量 1.5 倍的新数组,然后再将数据复制到新数组完成扩容 - 由于数组在内存上是连续的,这就意味着一旦要往中间插入数据或者删除数据,
这个位置后面的所有数据都要重新进行排列,这就会带来性能上的消耗 - LinkedList 底层使用的是链表,所以在内存上不一定连续,而且即使是连续的也不要紧,
因为它是靠两个指针来找到下一个和上一个数据的,所以它不需要进行扩容,
或者说每一次新增数据就是一次扩容 - 由于链表底层不连续,所以要找到第 n 个元素就需要从头遍历,在查找上性能会比较低,
另外链表结构中使用两个节点来保存上一个和下一个元素的节点地址,所以每一个元素就会多浪费两个地址大小,
如果是 64 位系统,就是 16 字节,当元素特别多时,相比 ArrayList 更浪费内存
扩展:多线程下的操作
我们先来看这个例子:
class Test {
public static void main(String[] args){
List<Integer> list = new ArrayList<>();
// 装一些数据
for (int i = 0; i < 10; i ++) {
list.add(i);
}
// 边遍历便删除
for (Integer num : list) {
// 如果 num 是奇数,就删除
if ((