- 数组是连续的内存空间,因此支持索引
- 数组是一个容器,存储相同类型的一组数据
- 数组的索引从0开始
数组引用类型的变量的默认值为 null。当数组变量实例后,如果没有没有显示的为每个元素赋值,Java 就会把该数组的所有元素初始化为其相应类型的默认值。int型的默认值为0
1.数据声明
@Test
public void test_9() {
int[] arr;
int arr1[];
int[] a, b, c;
}
2. 数组的初始化
初始值:整数 0, 浮点数 0.0, 字符’\u0000’, 布尔 false, 引用类型 null。
@Test
public void test_9() {
//动态初始化
int[] arr = new int[10]; //此时数组中的元素是 对应数据类型的默认值
int[] arr1 = new int[]{1,2,1,231,66};
//静态初始化
int[] arr2 = {1, 2, 3, 4, 7, 2, 3};
}
3. 数组遍历
@Test
public void test_9() {
int[] arr2 = {1, 2, 3, 4, 7, 2, 3};
for (int i : arr2) {
System.out.println(i);
}
System.out.println("------");
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
System.out.println("------");
for (int i = arr2.length - 1; i >= 0; i--) {
System.out.println(arr2[i]);
}
}
基本for 和 增强for不同
增强for只能遍历数组的所有元素
- 遍历范围用基本for
- 增强for只能顺序遍历数组的元素
- 逆序遍历使用基本for
- 增强for循环不能修改数组元素的值(可以修改对象属性的值)
- 修改元素值用基本for
@Test
public void test_9() {
int[] arr2 = {1, 2, 3, 4, 7, 2, 3};
//增强for循环不能修改数组元素的值(可以修改对象属性的值)
for (int i : arr2) {
i = i+2;
}
System.out.println("------");
for (int i : arr2) {
System.out.println(i);
}
}
@Test
public void test_9() {
int[] arr2 = {1, 2, 3, 4, 7, 2, 3};
// 修改元素的值用基本for循环
for (int i = 0; i < arr2.length; i++) {
arr2[i] += 2;
}
for (int i : arr2) {
System.out.println(i);
}
}
4. 数组是引用数据类型
```java
@Test public void test_9() { int n1 = 55; // 基本类型直接存储在栈中 int n2 = 66; n1 = n2; System.out.println(n1); //66 n2 = 77; System.out.println(n1); //66
int[] arr1 = {55}; //引用类型中,栈中只存储引用地址
int[] arr2 = {66};
arr1 = arr2;
System.out.println(arr1[0]); //66
arr2[0] = 77;
System.out.println(arr1[0]); //77
}
<a name="uvcHO"></a>
#### 5. 数组复制
```java
@Test
public void test_13() {
int[] oldArr = {1, 2, 3, 4, 7, 2, 3};
int[] newArr = new int[oldArr.length];
for (int i = 0; i < oldArr.length; i++) {
newArr[i] = oldArr[i];
}
System.out.println(Arrays.toString(newArr)); // [1, 2, 3, 4, 7, 2, 3]
}
@Test
public void test_14() {
int[] oldArr = {1, 2, 3, 4, 7, 2, 3};
int[] newArr = oldArr.clone(); // clone返回的是新的数组
System.out.println(Arrays.toString(newArr)); // [1, 2, 3, 4, 7, 2, 3]
}
@Test
public void test_12() {
int[] oldArr = {1, 2, 3, 4, 7, 2, 3};
int[] newArr = new int[oldArr.length * 2];
//System.arraycopy() 是native的方法
/**
* 第一个参数:原数组
* 第二个参数:原数组从那个索引开始被复制
* 第三个参数:目标数组
* 第四个参数:目标数组从哪个索引开始被填充
* 第五个参数:原数组从指定索引开始复制的元素的个数
*/
System.arraycopy(oldArr, 2, newArr, 4, 3);
System.out.println(Arrays.toString(newArr));//[0, 0, 0, 0, 3, 4, 7, 0, 0, 0, 0, 0, 0, 0]
}
@Test
public void test_20() {
int[] arr1 = {1, 2, 3, 4, 7, 2, 3};
//从0开始复制3个元素,返回新的数组
int[] arr2 = Arrays.copyOf(arr1,3);
System.out.println(Arrays.toString(arr2)); //[1, 2, 3]
//从指定开始索引到指定的结束索引的元素,返回新的数组
int[] arr3 = Arrays.copyOfRange(arr1,1,5);
System.out.println(Arrays.toString(arr3)); //[2, 3, 4, 7]
}
6. 二维数组
Java实际上没有多维数组,本质上都是一维数组。
二维数据的存储示意图
二维数据可以用矩阵表示
比如: int[][] arr = new int[2][3]; 表示2行3列, 每一行表示一个一维数组
0列 | 1列 | 2列 | |
---|---|---|---|
0行 | 0 | 0 | 0 |
1行 | 0 | 0 | 0 |
int[][] arr = { {0,0,0}, {0,0,0} }
int[][] arr = new int[][]{ {0,0,0}, {0,0,0} };
@Test
public void test_21() {
int[][] arr = new int[2][3];
//2 说明arr二维数组有两个元素,每个元素是一个数组,每个元素数组的长度是3
System.out.println(arr.length); //2
//[ [I@b7dd107, [I@42eca56e ] [2]代表的是有两个一维数组
System.out.println(Arrays.toString(arr)); //[ [I@b7dd107, [I@42eca56e ]
for (int i = 0; i < arr.length; i++) {
System.out.println();
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]);
}
}
}
// 增强for循环
@Test
public void test_21() {
int[][] arr = new int[2][3];
for (int[] ints : arr) {
System.out.println();
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
}
}