Java数组全解析:从基础到高级应用
立即解锁
发布时间: 2025-09-02 00:27:31 阅读量: 8 订阅数: 50 AIGC 

### Java数组全解析:从基础到高级应用
#### 1. 数组大小的动态指定与固定性
在Java中,数组的大小可以在运行时通过变量或算术表达式的值来指定。例如:
```java
int N = 20;
int[] A = new int[N];
int[] B = new int[N * N];
```
不过,一旦数组创建完成,其大小就固定了,后续无法更改。值得注意的是,Java数组的长度可以为零。
数组变量在定义后,可以被赋予其他兼容的数组或者常量值`null`。例如:
```java
A = B;
// A now references the data in B
B = null;
```
当执行`A = B`时,最初由`A`引用的数组就无法再访问,从而变成了垃圾数据。与C和C++不同,在Java中,不必要的存储会由内置的“垃圾回收器”自动处理。而且,新创建的数值基本类型(如`int`、`float`、`double`等)的数组会自动初始化为零。
#### 2. 数组大小的获取
由于数组可以动态创建,所以在运行时确定其实际大小非常重要。这可以通过访问数组的`length`字段来实现,示例如下:
```java
int k = A.length;
// number of elements in A
```
数组的大小是数组本身的一个属性,因此(与C语言不同)在Java中,不需要将数组的大小作为单独的方法参数传递。
如果数组是多维的,那么每个维度的大小(长度)都需要单独查询。并且,数组不一定是矩形的,例如二维数组的每一行可能有不同的长度(包括零)。
#### 3. 数组元素的访问
在Java中,数组第一个元素的索引始终是0,对于一个总共有N个元素的数组,最后一个元素的索引是N - 1。
要遍历任意大小的一维数组A,通常可以使用如下结构:
```java
for (int i = 0; i < A.length; i++) {
// do something with A[i]
}
```
或者,如果只关心数组的值而不需要数组索引(i),可以使用更简单的“for-each”循环结构:
```java
for (int a : A) {
// do something with array values a
}
```
在这两种情况下,Java编译器都可以生成非常高效的运行时代码,因为源代码明确表明for循环不会访问数组范围之外的元素,所以在执行时不需要进行显式的边界检查。这对于在Java中实现高效的图像处理程序非常重要。
图像在Java和ImageJ中通常存储为一维数组(可以通过ImageJ的`ImageProcessor`方法`getPixels()`访问),像素按行优先顺序排列。因此,统计计算和大多数点操作可以通过直接访问底层的一维数组来高效实现。例如,对比度增强插件的`run`方法可以按以下方式实现:
```java
public void run(ImageProcessor ip) {
// ip is assumed to be of type ByteProcessor
byte[] pixels = (byte[]) ip.getPixels();
for (int i = 0; i < pixels.length; i++) {
int a = 0xFF & pixels[i];
// direct read operation
int b = (int) (a * 1.5 + 0.5);
if (b > 255)
b = 255;
pixels[i] = (byte) (0xFF & b);
// direct write operation
}
}
```
#### 4. 二维数组
多维数组常常容易让人混淆。在Java中,原则上所有数组都是一维的,多维数组是通过一维数组的嵌套来实现的。
例如,一个3×3的矩阵:
```java
int[][] A = {{1,2,3},
{4,5,6},
{7,8,9}};
```
这里的`A`实际上是一个包含三个元素的一维数组,每个元素又是一个一维数组。`A[0]`、`A[1]`和`A[2]`的类型是`int[]`,分别对应矩阵`A`的三行。
通常假设数组元素按行优先顺序排列,第一个索引对应行号(r),第二个索引对应列号(c),即:
```java
ar,c ≡ A[r][c];
```
这符合数学惯例,使得上述代码段中的数组定义看起来与原始矩阵完全相同。需要注意的是,在这种方案中,第一个数组索引对应垂直坐标,第二个索引对应水平坐标。
然而,如果使用数组来指定图像`I(u, v)`或滤波器内核`H(i, j)`的内容,通常假设第一个索引(分别为`u`或`i`)与水平x坐标相关联,第二个索引(`v`或`j`)与垂直y坐标相关联。例如,要将滤波器内核:
```java
double[][] H = {{-1,-
```
0
0
复制全文
相关推荐









