1、数组简介
数组是存放在连续内存空间上的相同类型数据的集合。
特点
- 数组下标都是从0开始的
- 数组内存空间都是连续的
因为数组是连续的,所以在再增加和删除的时候,数组前面和后面的元素位置会发生变动
注: 因为数组的大小是固定的,一旦创建就不能改变其长度。所以删除一般是替换操作
一维数组
String[] fruits = {"apple", "banana", "orange", "grape"};
多维数组
String[] fruits = {"apple", "banana", "orange", "grape"};
String[] animals = {"dog", "cat", "lion", "tiger"};
String[] vegetables = {"carrot", "broccoli", "spinach"};
String[][] all = {fruits, animals, vegetables};
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数组在灵活性上更胜一筹。