数组
通常,数组是具有连续内存地址的相似类型元素的集合。原始数据类型的实际值存储在连续的内存位置,而类的对象实际上存储在堆段中。
-
Java是基于索引的(从0开始),可以使用length成员获取数组的长度(C/C++中则需要使用sizeof运算符)。数组的大小必须由 int 或 short 值而不是 long 指定
-
Java数组继承自Object类,并实现了Serializable和Cloneable接口;可以将原始值或对象存储在数组中。
-
Java 提供了C/C++中没有的匿名数组的特性(即不需要在将数组传递给方法时声明数组,或返回值为匿名函数)。
-
在Java中,所有数组都是动态分配的。
特点: 提供随机访问并且容量有限。
访问:O(1)
插入:O(n)
删除:O(n)
一维数组
声明
dataType[] arr;
dataType []arr;
dataType arr[];
实例化
arr = new dataType[size];
字面量初始化
int[] intArray = new int[]{1, 2, 3, 4};
int[] intArray = {1, 2, 3, 4};
ArrayIndexOutOfBoundsException
遍历数组时,数组的长度为负、等于数组大小或大于数组大小,JVM将抛出ArrayIndexOutOfBoundsException。
多维数组
声明
dataType[][] arr;
dataType [][]arr;
dataType arr[][];
dataType []arr[];
实例化
arr = new dataType[size][size];
初始化
int arr[][]={{ 1 , 2 , 3 },{ 2 , 4 , 5 },{ 4 , 4 , 5 }};
锯齿数组
具有不同列数的数组
int arr[][] = new int[3][];
arr[0] = new int[3];
arr[1] = new int[4];
arr[2] = new int[2];
数组对象的类
Java数组是对象,可以使用getClass()获取对象的类,使用getName()获取类名。
// Java program to demonstrate
// Class Objects for Arrays
class Test
{
public static void main(String args[])
{
int intArray[] = new int[3];
byte byteArray[] = new byte[3];
short shortsArray[] = new short[3];
// array of Strings
String[] strArray = new String[3];
System.out.println(intArray.getClass());
System.out.println(intArray.getClass().getSuperclass());
System.out.println(byteArray.getClass());
System.out.println(shortsArray.getClass());
System.out.println(strArray.getClass());
}
}
输出
class [I //int
class java.lang.Object //超类Object
class [B //byte
class [S //short
class [Ljava.lang.String; //class
复制数组
Java数组实现了Cloneable接口,因此可以创建Java数组的克隆。对于一维数组,克隆意味着复制实际值(深拷贝);而对于多维数组,克隆意味着复制引用(浅拷贝)。
一维数组
// Java program to demonstrate
// cloning of one-dimensional arrays
class Test
{
public static void main(String args[])
{
int intArray[] = {1,2,3};
int cloneArray[] = intArray.clone();
// will print false as deep copy is created
// for one-dimensional array
System.out.println(intArray == cloneArray);
for (int i = 0; i < cloneArray.length; i++) {
System.out.print(cloneArray[i]+" ");
}
}
}
输出
false
1 2 3
多维数组
// Java program to demonstrate
// cloning of multi-dimensional arrays
class Test
{
public static void main(String args[])
{
int intArray[][] = {{1,2,3},{4,5}};
int cloneArray[][] = intArray.clone();
// will print false
System.out.println(intArray == cloneArray);
// will print true as shallow copy is created
// i.e. sub-arrays are shared
System.out.println(intArray[0] == cloneArray[0]);
System.out.println(intArray[1] == cloneArray[1]);
}
}
输出
false
true
true
复制数组
class TestArrayCopyDemo {
public static void main(String[] args) {
char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n', 'a', 't', 'e', 'd' };
char[] copyTo = new char[7];
System.arraycopy(copyFrom, 2, copyTo, 0, 7);
System.out.println(copyFrom == copyTo);
System.out.println(new String(copyTo));
}
}
输出
false
caffein