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 |
|
示例:
1 |
|
这两种声明方式效果完全相同。
注意:与c/c++不同,声明中的 []
中不能填写数字来表示数组的大小,仅仅只表示该变量为一个数组引用。
数组创建
java通过new操作来为类的实例和数组开辟空间。
创建数组方式如下:
1 |
|
- 首先通过new操作为数组开辟所需要的空间。(在堆内存中)
- 然后将数组的引用赋值给变量arrayRefVar (在栈内存中)
java中引用的概念
java中没有类似c/c++中指针的概念,而是只存在引用来实现指针的功能。
- 定义:在 Java 中,引用是一个变量,它存储了对象的内存地址。
当我们使用new操作时,它的返回值就是开辟空间的地址。所以我们通过一个引用变量来指向创建的空间。
- 特点:
- 引用变量存储的是对象的内存地址
- 当我们将一个引用赋值给另一个引用时,其实是将对象的地址复制给了新的变量,此时两个引用指向同一个地址,如:
myClass obj2 = obj1
- 引用可以被赋值为
null
,表示不引用任何对象
一个对象可以被多个引用指向,但是当一个对象没有任何引用指向时,它将成为垃圾,会在某个时刻被垃圾回收器回收。
引用本身也是一个变量,存储在栈内存中。
数组创建其二
创建数组时,你也可以直接初始化数组的内容,此时数组的大小将为你初始化元素的个数。
1 |
|
示例:
1 |
|
当对于类创建数组时,你仅仅是创建了一个关于类的引用变量的数组,对于其中每个引用指向的对象,还需要单独通过new操作来实现。
对于数组,可以通过访问 arrayRefVar.lenght
来获得数组的长度。需要注意的是,通过该成员获取的长度是数组的总长度,而非已经初始化元素的个数,如:
1 |
|
输出结果为 5
数组的增强处理
JDK1.5 引进了一种新的循环类型,被称为增强的for循环。
很显然,在遍历数组时,java编译器更加推荐你使用增强的for循环。
格式如下:
1 |
|
该遍历方法类似python中数组的遍历方法,我们声明一个局部变量,用该变量来代替数组中每个元素,该局部变量的生命域只在for循环内。
使用实例:
1 |
|
二维数组
与c/c++中理解的多维数组相似,java中的二维数组也可以认为是一个对于一维数组的数组。
1 |
|
则可以认为创建了一个引用数组(str),有三个元素,每个元素是一个有四个元素的一维数组的引用。
也可以通过如下的方式生成非矩形的二维数组:
1 |
|
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等)。 |