简述arraylist和linkedlist的插入和查的大体过程
ArrayList和LinkedList是Java中两个常见的数据结构,它们都可以用来存储一系列的元素,但是它们在插入和查方面有着不同的实现方式和性能表现。本文将简述ArrayList和LinkedList的插入和查的大体过程,以帮助读者更好地了解它们的优缺点和适用场景。
一、ArrayList
ArrayList是一个基于数组实现的动态数组,它可以自动扩容以容纳更多的元素。在ArrayList中,每个元素都有一个对应的下标,因此可以通过下标来访问和修改元素。下面我们来看一下ArrayList的插入和查的大体过程。
1. 插入
ArrayList的插入操作可以分为两种情况:在指定位置插入元素和在末尾添加元素。
(1)在指定位置插入元素
当我们需要在ArrayList的指定位置插入一个元素时,ArrayList会先检查当前数组的容量是否
足够,如果不够则会进行扩容。扩容的方式是创建一个新的数组,将原数组中的元素复制到新数组中,并将新元素插入到新数组的指定位置。
具体来说,插入元素的过程如下:
1)检查当前数组容量是否足够,如果不够则进行扩容;
2)将新元素插入到指定位置;
3)将指定位置及其后面的元素向后移动一位,空出插入元素的位置;
4)将新数组的引用赋值给原数组的引用,完成插入操作。
(2)在末尾添加元素
当我们需要在ArrayList的末尾添加一个元素时,ArrayList会先检查当前数组的容量是否足够,如果不够则会进行扩容。扩容的方式是创建一个新的数组,将原数组中的元素复制到新数组中,并将新元素添加到新数组的末尾。
具体来说,添加元素的过程如下:
1)检查当前数组容量是否足够,如果不够则进行扩容;
2)将新元素添加到数组末尾;
3)将新数组的引用赋值给原数组的引用,完成添加操作。
2. 查
ArrayList的查操作是通过下标来实现的,因为每个元素都有一个对应的下标。因此,查元素的过程就是通过下标访问指定位置的元素。具体来说,查元素的过程如下:
1)计算指定元素的下标;
2)访问指定下标的元素,返回元素值。
二、LinkedList
LinkedList是一个基于链表实现的双向链表,它可以用来存储一系列的元素。在LinkedList中,每个元素都包含一个前驱节点和一个后继节点,因此可以通过前驱节点和后继节点来访问和修改元素。下面我们来看一下LinkedList的插入和查的大体过程。
1. 插入
LinkedList的插入操作可以分为三种情况:在指定位置插入元素、在开头插入元素和在末尾插入元素。
(1)在指定位置插入元素
当我们需要在LinkedList的指定位置插入一个元素时,LinkedList会先到指定位置的节点,然后将新元素插入到该节点的前面或后面,具体取决于插入方式(前插或后插)。
具体来说,插入元素的过程如下:
1)到指定位置的节点;
2)将新元素插入到指定位置的前面或后面;
3)调整前驱节点和后继节点的指针,完成插入操作。
数组和链表 (2)在开头插入元素
当我们需要在LinkedList的开头插入一个元素时,LinkedList会创建一个新节点,并将新节点的后继节点指向原来的头节点,然后将新节点设置为头节点。
具体来说,插入元素的过程如下:
1)创建一个新节点;
2)将新节点的后继节点指向原来的头节点;
3)将新节点设置为头节点,完成插入操作。
(3)在末尾插入元素
当我们需要在LinkedList的末尾插入一个元素时,LinkedList会创建一个新节点,并将新节点的前驱节点指向原来的尾节点,然后将新节点设置为尾节点。
具体来说,插入元素的过程如下:
1)创建一个新节点;
2)将新节点的前驱节点指向原来的尾节点;
3)将新节点设置为尾节点,完成插入操作。
2. 查
LinkedList的查操作是通过遍历链表来实现的,因为每个元素都包含一个前驱节点和一个后继节点。因此,查元素的过程就是从头节点开始遍历链表,直到到指定元素为止。具体来说,查元素的过程如下:
1)从头节点开始遍历链表;
2)比较当前节点的元素值和指定元素的值,如果相等则返回节点,否则继续遍历;
3)如果遍历到链表末尾仍未到指定元素,则返回空值。
三、性能比较
ArrayList和LinkedList在插入和查方面有着不同的性能表现,下面我们来进行简单的性能比较。
1. 插入
ArrayList在末尾添加元素的时间复杂度为O(1),因为它只需要在数组末尾添加元素即可。但是在指定位置插入元素的时间复杂度为O(n),因为它需要将插入位置后面的元素全部向后移动一位,以空出插入位置。
LinkedList在末尾添加元素的时间复杂度也为O(1),因为它只需要将新节点插入到尾节点的后面即可。但是在指定位置插入元素的时间复杂度为O(n),因为它需要从头节点开始遍历链表,直到到指定位置的节点,然后将新节点插入到该节点的前面或后面。
总的来说,ArrayList的插入操作比LinkedList的插入操作更快,因为数组的随机访问速度比链表的顺序访问速度更快。但是当需要频繁地在数组中间插入或删除元素时,LinkedList的表现会更好,因为它不需要像ArrayList那样移动大量的元素。
2. 查
ArrayList在查元素时的时间复杂度为O(1),因为它可以直接通过下标访问指定位置的元素。但是在遍历元素时的时间复杂度为O(n),因为它需要遍历整个数组才能到指定元素。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论