首页 > 其他分享 >数组(Array)和链表(List)

数组(Array)和链表(List)

时间:2023-07-24 17:32:05浏览次数:34  
标签:Node 元素 List 链表 内存 数组 Array 节点

推荐

https://cloud.tencent.com/developer/article/2304343

引言

在Java编程中,数组(Array)和链表(List)是常用的数据结构,用于在内存中存储和组织数据。两者都有各自的特点和适用场景,本文将深入比较数组与链表的区别,并结合代码示例进行详细解释。

数组(Array)

定义和特点

数组是一种固定大小、连续存储的数据结构,它可以容纳相同类型的元素。数组在内存中的分配是连续的,每个元素占据固定的内存空间,且数组的大小在创建时就确定下来,无法动态调整。

优点

  • 随机访问:由于数组的元素在内存中是连续存储的,可以通过索引快速访问指定位置的元素。
  • 内存效率高:由于元素存储在连续的内存块中,不需要额外的空间来存储指向下一个元素的指针,因此内存使用效率较高。

缺点

  • 大小固定:数组的大小在创建时就被确定,无法动态调整。如果需要存储的元素数量超过数组的大小,就需要重新创建一个更大的数组,并将原数组的元素复制到新数组中,这个过程比较耗时。
  • 插入和删除元素复杂:由于数组的元素在内存中是连续存储的,插入和删除元素时,需要移动其他元素的位置,因此时间复杂度较高。

示例代码

// 创建一个数组并初始化
int[] array = new int[5];

// 增加元素
array[0] = 1;
array[1] = 2;
array[2] = 3;

// 访问指定位置的元素
int element = array[2]; // element = 3

// 遍历数组
for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
}

链表(List)

定义和特点

链表是一种非连续的、动态分配的数据结构,由若干个节点(Node)组成,每个节点包括一个数据元素和一个指向下一个节点的指针。链表的节点可以在内存的任意空间分配,并通过指针进行连接。

优点

  • 动态分配:链表的大小可以动态调整,可以根据实际需要增加或删除节点,而不需要像数组那样重新创建整个数据结构。
  • 插入和删除元素效率高:由于链表的节点通过指针进行连接,插入和删除元素时,只需要更改相应节点的指针,时间复杂度较低。

缺点

  • 访问元素效率低:由于链表的节点不是连续存储的,无法像数组那样通过索引快速访问指定位置的元素,需要从头节点开始逐个遍历,直到找到目标元素。
  • 额外的内存开销:链表的节点需要额外的空间来存储指向下一个节点的指针,因此在存储同样数量的元素时,链表的内存开销比数组大。

示例代码

// 定义链表节点
class Node {
    int value;
    Node next;
    
    public Node(int value) {
        this.value = value;
        this.next = null;
    }
}

// 创建一个链表并初始化
Node head = new Node(1);
Node second = new Node(2);
Node third = new Node(3);

head.next = second;
second.next = third;

// 遍历链表
Node currentNode = head;
while (currentNode != null) {
    System.out.println(currentNode.value);
    currentNode =currentNode.next;
}

// 在链表中插入一个节点
Node newNode = new Node(4);
newNode.next = second.next;
second.next = newNode;

// 删除链表中的一个节点
second.next = third.next;

// 遍历链表
currentNode = head;
while (currentNode != null) {
    System.out.println(currentNode.value);
    currentNode = currentNode.next;
}

数组与链表的比较

访问元素效率

  • 数组的元素在内存中是连续存储的,可以通过索引直接访问指定位置的元素,时间复杂度为O(1)。
  • 链表的节点不是连续存储的,需要从头节点开始逐个遍历,直到找到目标元素,时间复杂度最坏为O(n),其中n为链表的长度。

插入和删除元素效率

  • 数组插入和删除元素时,需要移动其他元素的位置,时间复杂度为O(n),其中n为数组的长度。
  • 链表插入和删除元素时,只需要更改相应节点的指针,时间复杂度为O(1)。

内存使用效率

  • 数组存储元素时,不需要额外的指针来连接元素,内存使用效率较高。
  • 链表的节点需要额外的指针来连接,因此内存使用效率较低。

动态调整大小

  • 数组的大小在创建时就确定,无法动态调整。如果需要存储的元素数量超过数组的大小,需要重新创建一个更大的数组,并将原数组的元素复制到新数组中。
  • 链表的大小可以动态调整,可以根据实际需要增加或删除节点。

应用场景

根据以上的比较,可以得出以下结论:

  • 当需要频繁访问指定位置的元素,且对插入和删除操作要求不高时,适合使用数组。
  • 当需要频繁插入和删除元素,且对访问效率要求不高时,适合使用链表。

具体应用场景如下:

  • 数组适用于需要随机访问的场景,比如实现矩阵、二叉树等数据结构。
  • 链表适用于需要频繁插入和删除元素的场景,比如实现队列、栈、链表等数据结构。

结论

通过本文的比较和示例代码,我们详细了解了数组和链表之间的区别及应用场景。数组适用于需要随机访问的场景,具有较高的访问效率和内存使用效率;链表适用于需要频繁插入和删除元素的场景,具有较高的插入和删除效率,但访问效率较低。根据实际需求选择适合的数据结构,可以提高程序的性能和效率。

希望本文对您理解数组和链表的区别有所帮助,欢迎留言讨论和补充!

标签:Node,元素,List,链表,内存,数组,Array,节点
From: https://blog.51cto.com/u_16188843/6837145

相关文章

  • ValueNotifier<T> ValueListenableBuilder<T> Stack() positioned.fill()
     1、在Column下面增加可以滚动的Row2、在widget外部控件其内部的变量ValueNotifier<T> ValueListenableBuilder<T>(valueListenable:...,builder:()=>)  import'package:flutter/material.dart';classSettingsPageextendsStatelessWidget{finalint_cou......
  • vue项目使用vue-virtual-scroll-list虚拟滚动超多千万条数据 cv可用案例
    当我们有大量数据需要显示在列表中时,传统的滚动列表会将所有数据渲染到DOM中,导致性能下降和内存占用增加。虚拟滚动列表通过仅渲染当前视窗内可见的一小部分数据,动态地根据滚动位置更新列表内容,从而实现更高效的列表渲染。vue-virtual-scroll-list是一个用于Vue.js的虚拟滚动......
  • 运势计算:以双向链表实现: 计算爻卦
    1.0准备开始我们先制定一个计算结构体,一切开始于此。我们首先需要知道参与计算的算子有多少,我们就按最常用的数49来制定。typeDataTaostruct{DefMeanmap[int]string//卦象坐标名称DefValuemap[int]string//卦象坐标值4个GuaData[]......
  • Python list里面定义自定义类型
    PythonList中定义自定义类型在Python中,List(列表)是一种非常常见且强大的数据结构。它允许我们以有序的方式存储和访问多个元素。在List中,我们可以存储各种类型的数据,包括整数、浮点数、字符串等。但是,Python的灵活性还允许我们在List中存储自定义的数据类型,从而提供更高的灵活性和......
  • android layer-list bitmap
    AndroidLayer-ListBitmap实现步骤整体流程概述为了实现AndroidLayer-ListBitmap,我们需要按照以下步骤进行操作:步骤操作1创建一个XML文件来定义Layer-List2在XML文件中添加每个图层的属性和位置3创建一个Bitmap对象并将其绘制到Canvas上4将......
  • Array.from使用以及与[...obj]的区别
    一、Array.from使用通常Array都用于数组去重。下面是Array的详细用法:1.将类似组转化为真正的数组 函数参数转化为数组 dom转化为数组这里强调一下,必须有length属性,否则返回的是空数组。索引必须是字符串数字,否则返回的是[undefined,undefined,undefined,undefined]......
  • redis 查看list 长度
    Redis查看List长度在使用Redis时,我们经常会使用List数据结构来存储和操作一系列的元素。Redis的List是一个有序的、可重复的数据结构,它可以用于实现队列(Queue)和栈(Stack)等数据结构。在某些场景下,我们可能需要查看List中元素的数量,本文将介绍如何使用Redis命令来查看List的长度。Re......
  • redis 查看 redis list数据
    Redis查看RedisList数据Redis是一个开源的内存数据库,常用于存储和处理大量的数据。Redis提供了多种数据结构,其中之一就是List。List是一个有序的字符串列表,可以在列表的两端进行插入和删除操作。在使用Redis时,我们经常需要查看已经存储在List中的数据。本文将介绍如何使用Redis......
  • java list转linkedHashMap
    JavaList转LinkedHashMap在Java编程中,我们经常会遇到需要将一个List转换为LinkedHashMap的场景。List是一个有序的集合,而LinkedHashMap是一个有序的键值对集合,它可以保持插入顺序。这种转换可以帮助我们在处理数据时更方便地按照特定的顺序进行操作。使用Java的StreamAPI进行Li......
  • java list每一项添加单引号
    JavaList每一项添加单引号在Java中,List是一种常用的集合类,它可以用来存储多个元素。有时候我们会遇到需要在List的每一项前后添加单引号的需求,本文将介绍如何实现这一功能。为什么需要添加单引号在某些场景下,我们可能需要将List中的每一项转化为字符串,并在其前后添加单引号。这......