java数组

每日一言

In the limited time we have between our births and our deaths, we live life with everything we’ve got. – Ushiromiya Battler
from Umineko: When They Cry

数组声明

java中支持两种数组的声明方式:

1
2
dataType[] arrayRefVar;	//java推荐的方式
dataType arrayRefVar[]; //为了让c/c++程序员更快上手而支持的方式

示例:

1
2
int[] arr;
int arr[];

这两种声明方式效果完全相同。

注意:与c/c++不同,声明中的 []中不能填写数字来表示数组的大小,仅仅只表示该变量为一个数组引用。

数组创建

java通过new操作来为类的实例和数组开辟空间。

创建数组方式如下:

1
arrayRefVar = new dataType[arraySize];
  1. 首先通过new操作为数组开辟所需要的空间。(在堆内存中)
  2. 然后将数组的引用赋值给变量arrayRefVar (在栈内存中)

java中引用的概念

java中没有类似c/c++中指针的概念,而是只存在引用来实现指针的功能。

  • 定义:在 Java 中,引用是一个变量,它存储了对象的内存地址。

当我们使用new操作时,它的返回值就是开辟空间的地址。所以我们通过一个引用变量来指向创建的空间。

  • 特点:
    • 引用变量存储的是对象的内存地址
    • 当我们将一个引用赋值给另一个引用时,其实是将对象的地址复制给了新的变量,此时两个引用指向同一个地址,如:myClass obj2 = obj1
    • 引用可以被赋值为 null,表示不引用任何对象

一个对象可以被多个引用指向,但是当一个对象没有任何引用指向时,它将成为垃圾,会在某个时刻被垃圾回收器回收。

引用本身也是一个变量,存储在栈内存中。

数组创建其二

创建数组时,你也可以直接初始化数组的内容,此时数组的大小将为你初始化元素的个数。

1
dataType[] arrayRefVar = {value0, value1, ..., valuek};

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class PrintMyCar {
public static void main(String[] args) {
Car myCar[] = {new Car("red"), new Car("blue"), new Car("green")};
for (int i = 0; i < myCar.length; i++) {
System.out.println("My car is " + myCar[i].color);
}
}
}

class Car {
public String color;
public static int myCarCount = 0;
public Car(String color){
this.color = color;
myCarCount++;
}
public void changeColor(String color){
this.color = color;
}
}

当对于类创建数组时,你仅仅是创建了一个关于类的引用变量的数组,对于其中每个引用指向的对象,还需要单独通过new操作来实现。

对于数组,可以通过访问 arrayRefVar.lenght 来获得数组的长度。需要注意的是,通过该成员获取的长度是数组的总长度,而非已经初始化元素的个数,如:

1
2
3
4
5
6
7
8
public class PrintMyCar {
public static void main(String[] args) {
Car myCar[] = new Car[5];
myCar[0] = new Car("Red");
myCar[1] = new Car("Blue");
System.out.println(myCar.length);
}
}

输出结果为 5

数组的增强处理

JDK1.5 引进了一种新的循环类型,被称为增强的for循环。

1737560233758

很显然,在遍历数组时,java编译器更加推荐你使用增强的for循环。

格式如下:

1
2
3
4
for(type element: array)
{
System.out.println(element);
}

该遍历方法类似python中数组的遍历方法,我们声明一个局部变量,用该变量来代替数组中每个元素,该局部变量的生命域只在for循环内。

使用实例:

1
2
3
4
5
6
7
8
public class PrintMyCar {
public static void main(String[] args) {
Car myCar[] = {new Car("red"), new Car("blue"), new Car("green")};
for (Car myCar1 : myCar) {
System.out.println("My car is " + myCar1.color);
}
}
}

二维数组

与c/c++中理解的多维数组相似,java中的二维数组也可以认为是一个对于一维数组的数组。

1
String[][] str = new String[3][4];

则可以认为创建了一个引用数组(str),有三个元素,每个元素是一个有四个元素的一维数组的引用。

也可以通过如下的方式生成非矩形的二维数组:

1
2
3
String[][] s = new String[2][];
s[0] = new String[2];
s[1] = new String[3];

Arrays 类

java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。

具有以下功能:

  • 给数组赋值:通过 fill 方法。
  • 对数组排序:通过 sort 方法,按升序。
  • 比较数组:通过 equals 方法比较数组中元素值是否相等。
  • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。

具体说明请查看下表:

序号 方法和说明
1 public static int binarySearch(Object[] a, Object key)``用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-( 插入点 ) - 1)。
2 public static boolean equals(long[] a, long[] a2)``如果两个指定的 long 型数组彼此 相等 ,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
3 public static void fill(int[] a, int val)``将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
4 public static void sort(Object[] a)``对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。

java数组
http://blog.ulna520.com/2025/01/22/java数组_20250122_223835/
Veröffentlicht am
January 22, 2025
Urheberrechtshinweis