数组

46 阅读3分钟

1、数组简介

数组是存放在连续内存空间上的相同类型数据的集合。

特点

  • 数组下标都是从0开始的
  • 数组内存空间都是连续的

因为数组是连续的,所以在再增加和删除的时候,数组前面和后面的元素位置会发生变动

注: 因为数组的大小是固定的,一旦创建就不能改变其长度。所以删除一般是替换操作

一维数组

String[] fruits = {"apple", "banana", "orange", "grape"};

image-20241209210315875.png

多维数组

String[] fruits = {"apple", "banana", "orange", "grape"};
String[] animals = {"dog", "cat", "lion", "tiger"};
String[] vegetables = {"carrot", "broccoli", "spinach"};
String[][] all = {fruits, animals, vegetables};

image-20241209212041408.png

Java中的数组

特点

  • 类型安全: 数组是类型安全的,数组只能存储特定类型的元素。
  • 固定大小: 数组一旦创建,其长度就固定了,不能增加或减少。
  • 连续内存分配: 数组的元素在内存中是连续存储的,这使得数组的访问速度很快,因为可以通过基址和偏移量直接计算出元素的地址。
  • 零基索引: 数组的索引从0开始。
  • 多维数组: Java支持多维数组,如二维数组、三维数组等(可能不是完全连续的)。
  • Arrays类: Java提供了Arrays类,其中包含许多静态方法。
方法名功能
sort()对数组进行排序。有多种重载版本,可以对基本类型数组和对象数组进行排序。
binarySearch()对已经排序的数组执行二分查找。如果数组未排序,结果将不可预测。
equals()比较两个数组是否相等。只有当两个数组的元素逐个比较都相等时,才返回true
fill()使用指定的值填充整个数组。
copyOf()创建一个新的数组,并将其内容复制自原数组的一部分或全部。
copyOfRange()创建一个新的数组,包含原数组中指定范围的元素。
asList()将数组转换为固定大小的列表。
toString()返回数组内容的字符串表示形式。
deepToString()返回多维数组内容的字符串表示形式。
hashCode()计算数组的哈希码。
setAll()使用给定的生成器函数设置数组的元素。
parallelSetAll()类似于setAll(),但是可以并行执行。
parallelPrefix()对数组中的元素应用一个二元操作,可以并行执行。
stream()返回一个流,用于创建数组的流式处理。
fill()从指定的索引开始,使用给定的值填充数组的某一部分
......

Rust中的数组

特点

  • 固定大小: Rust中的数组大小是固定的,一旦声明就不能改变。
  • 类型统一: 数组中的所有元素必须具有相同的类型。
  • 存储在栈上: Rust的数组是存储在上的,而Java的数组是存储在上。意味着Rust数组的内存分配和回收更加高效。
  • 内存连续: Rust数组在内存中是连续存储的,这与Java数组一样,有助于提高访问速度。
  • 多维数组: Rust中的多维数组需要在编译时知道所有的维度大小,这意味着它们的大小是固定的。
  • 所有权和借用: Rust的数组遵循所有权和借用规则,有助防止内存安全问题。
  • 零成本抽象: Rust的数组可以实现零成本抽象,这意味着使用数组时不会引入额外的性能开销。

Rust与Java数组的对比

与Java相比,Rust数组的特点主要在于其内存安全性和性能优化。Rust的所有权系统和借用规则使得数组使用更加安全,而固定大小和栈存储则使得数组性能更优。Java数组则更灵活,可以动态创建和修改大小,但可能会涉及垃圾回收的性能开销。总的来说,Rust数组在安全性和性能上具有优势,而Java数组在灵活性上更胜一筹。