何鑫个人博客

数据结构之数组

  • 2021-03-19 16:02:50
  • 技术
  • 146

数组的概念

数组是在内存中连续分布的一组同类型数据集合。

数组的特点

  • 支持随机访问
  • 长度固定
  • 查找快

数组的相关操作

Java创建数组:

// 字面量的方式创建数组
int[] a = {1, 2, 3, 4, 5};

// 声明一个长度为5的int数组,各元素初始值为0
int[] b = new int[5];

数组一旦创建则其长度不可改变!但是我们可以创建一个新数组来做到同样的效果。

// 导入Arrays工具类
import java.util.Arrays;
// 复制原数组并创建一个长度为6的数组
int[] c = Arrays.copy(a, 6);
// 更改第六个元素为想要的元素
c[5] = 6

如果我们想要删除a中等于2的元素,我们可以使用for循环来逐个检查并复制元素,但是lamda表达式可以简化我们的操作:

int[] d = Arrays.stream(a).filter(input -> input != 2).toArray();

如果需要获取或修改指定位置的元素,我们只需要指定对应的索引便可以实现:

// 获取a中的第一个元素
int e = d[0];
// 修改a中的第一个元素
d[0] = 6;

一个有趣的问题:为什么数组索引都是从0开始?

说到这里,我们不妨思考一下,为什么在数组中第一个元素的索引是从0开始,而不是从人类的思维逻辑上1开始呢?这个问题是个很有趣的问题,也有助于我们理解数组的存储结构。
我们可以先考虑我们会怎样去存储数组数据,把所有的索引和元素地址对应然后存储起来?根本不用!我们思考一下数组的特点,连续存储,固定长度,同一类型,好了,我们可以基于这些特点进行换算了,首先我们确定一个数组的基址,假设为a,从a开始存储数组数据,我们只要知道数组中数据类型所占用的空间,因为数组元素连续分布,那么我们就可以计算出第n个的元素的地址为a + (n-1) * typeSize,这是个很简单的数学题,那么为什么索引不从1开始呢?从这个公式中,我们可以知道如果从1开始,那么每次获取对应索引的数据时,都需要执行n-1的操作,对应CPU来说就要多做一次运算,如果从0开始,那么公式就变为a + n * typeSize,少一次运算,在早期,CPU资源都是非常宝贵的,能省则省,所以也就成了惯例,延续至今,当然并不是所有的语言都遵循了这一惯例,但是大多数主流编程语言都是如此。