java中ArrayList和LinkedList的区别详解

 更新时间:2021年01月16日 11:55:34   作者:萌萌萌桃子  
这篇文章主要介绍了java中ArrayList和LinkedList的区别详解,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下

ArrayList和LinkedList都实现了List接口,有以下的不同点:

1、ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
2、相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
3、LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

ArrayList扩容:

总的来说就是分两步:

1、扩容

把原来的数组复制到另一个内存空间更大的数组中

2、添加元素

把新元素添加到扩容以后的数组中
无参构造:

public ArrayList() {
  this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

带参构造:

public ArrayList(int initialCapacity) {
  if (initialCapacity >0) {
    this.elementData =new Object[initialCapacity];
  }else if (initialCapacity ==0) {
    this.elementData = EMPTY_ELEMENTDATA;
  }else {
    throw new IllegalArgumentException("Illegal Capacity: "+
                      initialCapacity);
  }
}

在无参构造中,我们看到了在用无参构造来创建对象的时候其实就是创建了一个空数组,长度为0
在有参构造中,传入的参数是正整数就按照传入的参数来确定创建数组的大小,否则异常
接下来我们来看扩容,扩容的方法就是 add(E e)

public boolean add(E e) {
    ensureCapacityInternal(size + 1); // Increments modCount!!
    elementData[size++] = e;
    return true;
  }
private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
  }
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
      return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
  }
private void ensureExplicitCapacity(int minCapacity) {
   modCount++;

   // overflow-conscious code
   if (minCapacity - elementData.length > 0)
     grow(minCapacity);
 }
private void grow(int minCapacity) {
   // overflow-conscious code
   int oldCapacity = elementData.length;
   int newCapacity = oldCapacity + (oldCapacity >> 1);
   if (newCapacity - minCapacity < 0)
     newCapacity = minCapacity;
   if (newCapacity - MAX_ARRAY_SIZE > 0)
     newCapacity = hugeCapacity(minCapacity);
   // minCapacity is usually close to size, so this is a win:
   elementData = Arrays.copyOf(elementData, newCapacity);
 }

int newCapacity = oldCapacity + (oldCapacity >> 1);
oldCapacity >> 1 右移运算符 原来长度的一半 再加上原长度也就是每次扩容是原来的1.5倍
之前的所有都是确定新数组的长度,确定之后就是把老数组copy到新数组中,这样数组的扩容就结束了
以上的一切都是ArrayList扩容的第一步,第二步就没啥说的了,就是把需要添加的元素添加到数组的最后一位

以上就是java中ArrayList和LinkedList的区别详解的详细内容,更多关于java ArrayList和LinkedList的区别的资料请关注脚本之家其它相关文章!

相关文章

  • Spring实战之使用静态工厂方法创建Bean操作示例

    Spring实战之使用静态工厂方法创建Bean操作示例

    这篇文章主要介绍了Spring实战之使用静态工厂方法创建Bean操作,结合实例形式分析了静态工厂方法创建Bean的相关实现步骤与操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Java线程本地变量导致的缓存问题解决方法

    Java线程本地变量导致的缓存问题解决方法

    使用缓存可以缓解大流量压力,显著提高程序的性能,我们在使用缓存系统时,尤其是大并发情况下,经常会遇到一些疑难杂症,这篇文章主要给大家介绍了关于Java线程本地变量导致的缓存问题的解决方法,需要的朋友可以参考下,
    2024-08-08
  • SpringBoot项目Jar包如何瘦身部署的实现

    SpringBoot项目Jar包如何瘦身部署的实现

    这篇文章主要介绍了SpringBoot项目Jar包如何瘦身部署的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Spring超详细讲解事务和事务传播机制

    Spring超详细讲解事务和事务传播机制

    Spring事务的本质就是对数据库事务的支持,没有数据库事务,Spring是无法提供事务功能的。Spring只提供统一的事务管理接口,具体实现都是由数据库自己实现的,Spring会在事务开始时,根据当前设置的隔离级别,调整数据库的隔离级别,由此保持一致
    2022-06-06
  • java使用反射给对象属性赋值的两种方法

    java使用反射给对象属性赋值的两种方法

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,下面这篇文章主要给大家介绍了关于java使用反射给对象属性赋值的两种方法,需要的朋友可以参考下
    2023-04-04
  • nacos(SpringCloud)配置加载过程

    nacos(SpringCloud)配置加载过程

    Nacos是Spring Cloud的配置中心,通过BootstrapApplicationListener和ConfigFileApplicationListener监听器加载配置文件,并通过PropertySourceBootstrapConfiguration将Nacos配置加载到Spring Boot应用的environment中
    2024-12-12
  • JAVA集合框架专题

    JAVA集合框架专题

    这篇文章主要介绍了JAVA集合框架的相关知识,文中讲解非常细致,帮助大家更好的理解学习JAVA框架,感兴趣的朋友快来了解下
    2020-06-06
  • Java的Lambda表达式和Stream流的作用以及示例

    Java的Lambda表达式和Stream流的作用以及示例

    这篇文章主要介绍了Java的Lambda表达式和Stream流简单示例,Lambda允许把函数作为一个方法的参数,使用Lambda表达式可以写出更简洁、更灵活的代码,而其作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升,需要的朋友可以参考下
    2023-05-05
  • Spring Boot使用profile如何配置不同环境的配置文件

    Spring Boot使用profile如何配置不同环境的配置文件

    ,springboot支持通过不同的profile来配置不同环境的配置,下面就大致介绍一下yml配置文件跟properties配置文件怎么使用profile配置不同环境的配置文件
    2018-01-01
  • Java Apollo环境搭建以及集成SpringBoot案例详解

    Java Apollo环境搭建以及集成SpringBoot案例详解

    这篇文章主要介绍了Java Apollo环境搭建以及集成SpringBoot案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论