介绍
数组构建的大多数编程语言。它们是计算机科学中所有人最基本的数据结构。阵列是许多其他更复杂的数据结构的构建块。
为什么我们需要一个数组来存储元素?为什么我们不能使用INT原始类型?
为什么不利用原语?
在Java Int中获得4个字节。因此,以下声明占据了4个字节。
int a = 100;
如果我们想存储六个int
值(或24
字节)怎么办?我们需要单独使用六个不同的变量,每个变量占据4
字节,以便总计将是6 * 4 = 24
字节。
// each of the following occupies 4 bytes, which is 6 * 4 bytes
int a1 = 100;
int a2 = 200;
int a3 = 300;
int a4 = 400;
int a5 = 500;
int a6 = 600;
创建六个不同的变量有点脏,不是一个好主意。如果我们想存储一百万个条目,我们应该创建一百万个不同的变量吗? ð¢这不是不好的编码吗?
相反,我们将百万个物品顺序存储在int[] array
中。通过遵循声明和初始化,可以轻松实现这一点。
int[] array = {100, 200, 300, 400, 500, 600};
阵列不是很漂亮吗? ðÖ©
什么是数组?
在Java和许多其他语言中,数组是静态的(固定尺寸)。数组在内存中依次组织项目。
这些项目可以是Integer
,String
,Object
,任何东西。这些项目存储在连续(彼此相邻)内存位置中。
阵列中的每个位置都有一个索引,从0
th索引开始。在Java中,整数取4
字节,因此每个相邻元素的内存地址由4
字节添加。
草图
简单的草图如下。
如果我们说我们的数组内存,位置/地址从100
开始,则以下整数地址将从104(100+4)
字节开始,等等。
在上面的插图/图中,我们有一个带有6
元素的数组,其中一个从100
到120
的内存地址。因此,从理论上讲,我们在此数组后存储的任何东西从124
获取地址。
注意:在Java中,我们必须在初始化数组之前提前指定数组的大小。
我们知道计算机上的所有内容都存储在bits 0
或1
中。让我们看看上面草图中的这些数组编号是如何存储在内存中并以二进制解决的。
声明和初始化
考虑具有5
元素的阵列A[]
。要访问数组的最后一个元素,我们使用A[4]
。
有了这些知识,如果N
是数组长度,则(N-1)
就是我们访问最后一个元素的方式。我们可以通过两种方式声明和初始化Java中的数组。
如果我们声明数组如下,会发生什么?
int[] A = new int[3];
// stores 3 items, capacity = 3 and size is 0(no items added, so far)
System.out.println(Arrays.toString(A)); // [0, 0, 0]
最初,我们没有在数组中添加任何项目,因此数组值默认为0
,如上所述。
让我们看到另一种声明和初始化数组的方式。
// approach 1
int[] A = new int[5];
A[0] = 1;
A[1] = 2;
A[2] = 3;
A[3] = 4;
A[4] = 5;
// approach 2
int[] A = {1, 2, 3, 4, 5};
带有char
数据类型和String
类的数组如下。
// String arrays
String[] fruits = new String[3]; // contains 3 strings
// char arrays
char[] chars = new char[256]; // contains 256 items
这个小插图可帮助您了解我们如何使用其索引访问数组元素。
如何访问元素?
以下是一个简单的草图A
,其容量N
。
由于Java中的数组从0
th Index开始。如果要访问第一个元素,则需要给予A[0]
,而A[1]
以访问第二个元素,等等在A[N-1]
上访问了最后一个元素。
如果我们做A[-100]
,A[N]
和A[N+1]
会发生什么? ðρ
你猜对了。我们遇到了ArrayIndexOutOfBoundsException
。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 100 out of bounds for length 5
at array.ArrayIntroduction.main(ArrayIntroduction.java:20)
最多可以使用A[N-1]
访问数组的最后一个元素。
如何打印数组元素
一个简单的片段,用于打印从0
到(N-1)
索引的数组元素。
public class PrintElements {
public static void main(String[] args) {
int[] A = {1, 2, 3, 4, 5};
int N = A.length;
for (int i = 0; i < N; i++) {
System.out.println(A[i]);
}
}
}
打印这些数组元素的时间和空间复杂性是:
时间复杂性 -O(N)
-我们在大小N
的所有数组元素上迭代,因此时间复杂性是线性的。
空间复杂性 -O(1)
-这里没有使用算法存储器。我们只是使用了输入A[]
内存,因此恒定时间。
容量与长度
数组多长时间?
如果有人问您一个数组多长时间,讨论数组的时间有两个可能的答案。
- 可以存放多少个项目,
- 当前数组中有多少个项目?
第一点是关于容量的,第二点大约是长度。
让我们创建一个阵列A[10]
,其容量为10
,但没有添加项目。从技术上讲,我们可以说长度是0
。
int[] A = new int[10];
让我们插入整数1
,2
,3
和4
A[0] = 1;
A[1] = 2;
A[2] = 3;
A[3] = 4;
此时,数组的长度/大小为4
,并且具有存储元素空间的数组的容量为10
。
以下代码段解释数组长度与容量之间的差异。
容量
可以通过查看其length
属性的值来检查Java中数组的容量。这是使用A.length
A
阵列的名称为。
完成的。
public class ArrayCapacityLength {
public static void main(String[] args) {
int[] A = new int[10];
System.out.println("Array Capacity " + A.length); // 10
}
}
运行上述片段给出
// Array Capacity is 10
长度
这是A[]
数组中当前的项目数量。
import java.util.Arrays;
public class ArrayCapacityLength {
public static void main(String[] args) {
int[] A = new int[10];
int currentItemsLength = 0;
for (int i = 0; i < 4; i++) {
currentItemsLength += 1;
A[i] = i + 10;
}
System.out.println(Arrays.toString(A)); // [10, 11, 12, 13, 0, 0, 0, 0, 0, 0]
System.out.println("Array length is " + currentItemsLength); // 4
System.out.println("Array Capacity is " + A.length); // 10
}
}
运行上述片段给出
// Array length is 4
// Array Capacity is 10