- 数组是连续的内存空间,因此支持索引
- 数组是一个容器,存储相同类型的一组数据
- 数组的索引从0开始
数组引用类型的变量的默认值为 null。当数组变量实例后,如果没有没有显示的为每个元素赋值,Java 就会把该数组的所有元素初始化为其相应类型的默认值。int型的默认值为0
1.数据声明
@Testpublic void test_9() {int[] arr;int arr1[];int[] a, b, c;}
2. 数组的初始化
初始值:整数 0, 浮点数 0.0, 字符’\u0000’, 布尔 false, 引用类型 null。
@Testpublic 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. 数组遍历
@Testpublic 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
@Testpublic 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);}}
@Testpublic 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]); //66arr2[0] = 77;System.out.println(arr1[0]); //77
}
<a name="uvcHO"></a>#### 5. 数组复制```java@Testpublic 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]}
@Testpublic 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]}
@Testpublic 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]}
@Testpublic 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} };
@Testpublic void test_21() {int[][] arr = new int[2][3];//2 说明arr二维数组有两个元素,每个元素是一个数组,每个元素数组的长度是3System.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循环@Testpublic 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");}}}
