Java中除了一維數組外,還有二維數組,三維數組等多維數組。本文以介紹二維數組來了解多維數組。
1.二維數組的基礎
二維數組的定義:二維數組就是數組的數組,數組里的元素也是數組。
二維數組表示行列二維結構
2.二維數組的聲明
二維數組有三種聲明方式。
2.1.根據二維數組的定義
1 import java.util.Arrays; 2 public class Test05{ 3 public static void main(String[] args){ 4 //根據二維數組的定義 5 //二維數組 6 //int[] arr; 7 //(int[])[]arr; 8 9 //聲明 10 int[][] arr; 11 //初始化一個能存三個一維數組的二維數組 12 arr = new int[3][]; 13 //賦值 14 int[] arr1 = {3,4,5,7}; 15 int[] arr2 = {3,4,6}; 16 int[] arr3 = {3,4,7,8}; 17 18 arr[0] = arr1; 19 arr[1] = arr2; 20 arr[2] = arr3; 21 22 System.out.print(arr); 23 System.out.println(Arrays.toString(arr)); 24 } 25 }
此時arr = new int[3][];只分配了二維數組的空間,一維數組沒有分配空間。
2.2.聲明一個規則的二維數組
1 import java.util.Arrays; 2 public class Test06{ 3 public static void main(String[] args){ 4 //聲明一個規則的二維數組,3行4列 5 int[][] arr = new int[3][4]; 6 arr[0][0]=10; 7 arr[0][1]=10; 8 arr[0][2]=10; 9 arr[0][3]=10; 10 11 arr[1][0]=10; 12 arr[1][1]=10; 13 arr[1][2]=10; 14 arr[1][3]=10; 15 16 arr[2][0]=10; 17 arr[2][1]=10; 18 arr[2][2]=10; 19 arr[2][3]=10; 20 21 System.out.println(Arrays.toString(arr)); 22 } 23 }
此時,二維數組已經分配好空間,同時一維也分配好空間。
2.3.當已知二維數組元素的數值,可以考慮字面量聲明
1 import java.util.Arrays; 2 public class Test02{ 3 public static void main(String[] args){ 4 //已知數組元素,二維數組的聲明方式 5 int[][] arr ={ 6 {10,20,30,40}, 7 {100,200,300}, 8 {1000,2000,3000,4000} 9 }; 10 System.out.println(Arrays.toString(arr)); 11 } 12 }
3.二維數組的遍歷
1 import java.util.Arrays; 2 public class Test02{ 3 public static void main(String[] args){ 4 //已知數組元素,二維數組的聲明方式 5 int[][] arr ={ 6 {10,20,30,40}, 7 {100,200,300}, 8 {1000,2000,3000,4000} 9 }; 10 //遍歷二維數組 11 for(int i = 0;i<arr.length;i++){ //行數遍歷二維數組 12 for(int j = 0;j<arr[i].length;j++){ //列的元素 13 System.out.print(arr[i][j] + "\t"); 14 } 15 System.out.println(); 16 } 17 } 18 }
總結:
二維數組是行列結構,使用雙層for循環,外層for用於控制行,內層for用於控制列=>行列結構 => 雙層for遍歷。
以上,我們就了解完二維數組的基本知識了。
此外,在學習數組知識的時候有一些細節是需要我們注意的,就是基本數據類型和引用數據類型賦值的區別。接下來我們通過一些小練習來講解一下基本數據類型和引用數據類型賦值的區別。
4.基本數據類型和引用數據類型賦值的區別
1 import java.util.Arrays; 2 public class Test09{ 3 public static void main(String[] args){ 4 5 // 基本數據類型的賦值 6 int a = 10; 7 int b; 8 b = a; 9 // a? b? 10 b = 20; 11 // a? b? 12 13 // 引用數據類型的賦值 14 int[] arr = {1,3,5}; 15 int[] arr2 = arr; 16 arr2[0] = 100; 17 18 System.out.println("arr:"+arr); 19 System.out.println("arr2:"+arr2); 20 System.out.println("arr[0]:"+arr[0]); 21 } 22 }
通過圖解來加深理解。
總結:
基本數據類型賦值時,復制的是值
引用數據類型賦值時,復制的是引用。
5.Arrays類
在上面,我們運用了Array類,關於Array類我們也來講解一下關於Array類的用法。
jdk中為了便於開發,給開發者提供了Arrays類,其中包含了很多數組的常用操作。例如快速輸出、排序、查找等。
5.1常用用法
1 import java.util.Arrays; 2 public class Test00{ 3 public static void main(String[] args){ 4 //Arrays類的常用方法 5 int[] arr = {4,3,7,8}; 6 //【1】數組的字符串形式 7 String str = Arrays.toString(arr); 8 System.out.println(str); 9 10 //【2】sort對數組進行排序(只能是升序)->內部使用快速排序 11 Arrays.sort(arr); 12 System.out.println(Arrays.toString(arr)); 13 14 /*【3】fill 填充數組 Arrays.fill(arr,fromIndex,toIndex,填充的值); 15 *toIndex:結束下標不包含,(含頭不含尾) 16 */ 17 //Arrays.fill(arr,0,4,2); 18 //System.out.println(Arrays.toString(arr)); 19 20 //【4】equals(arr1,arr2)判斷兩個數組是否相等。 21 //數組相等的條件是:a.長度相等 b.兩個數組對應位置的元素相等 22 int[] arr3 = {3,4,7,8}; 23 System.out.println(Arrays.equals(arr,arr3)); 24 } 25 }
5.2.二分法查找
1 import java.util.Arrays; 2 public class Test03{ 3 public static void main(String[] args){ 4 //二分法查找,二分法查找必須是有序的數組,如果找到返回索引; 5 //源碼 6 /*private static int binarySearch0(long[] a, int fromIndex, int toIndex, 7 long key) { 8 int low = fromIndex; 9 int high = toIndex - 1; 10 11 while (low <= high) { 12 int mid = (low + high) >>> 1; //除2 13 long midVal = a[mid]; 14 15 if (midVal < key) 16 low = mid + 1; 17 else if (midVal > key) 18 high = mid - 1; 19 else 20 return mid; // key found 21 } 22 return -(low + 1); // key not found. low為插入點,即Key應該放在數組中的位置 23 } 24 */ 25 26 /*二分法查找數組的元素(有序的數組),返回的是元素的下標,binarySearch(arr,fromIndex,toIndex,key) 27 *a - 要搜索的數組 28 key - 要搜索的值 29 */ 30 int[] arr = {1,2,4,5,7,8}; 31 int a = Arrays.binarySearch(arr,4);//找4的索引 32 System.out.println("要找的值的位置為:"+a); 33 } 34 }
5.3數組的復制
1 import java.util.Arrays; 2 public class Test01{ 3 public static void main(String[] args){ 4 //數組的復制 5 int[] arr = {1,3,4,6,8}; 6 int[] newArr = Arrays.copyOf(arr,5);//復制到一個新數組 7 System.out.println(Arrays.toString(newArr)); 8 9 //copyOfRange(arr,from,to) from:開始的位置(包含) to:目標位置(不包含) 含頭不含尾 10 11 int[] newArr2 = Arrays.copyOfRange(arr,1,3); 12 System.out.println(Arrays.toString(newArr2)); 13 14 //其中System也提供了賦值數組的方法。 15 //arraycopy(object str,int srcPos,object dest,int destPos,int length) 16 /* 17 *arraycopy(srcArr,srcPos,destArr,destPos,len) 18 srcArr:要復制的源數組 19 srcPos:從srcArr的srcPos位置開始復制 20 destArr:復制到的目標數組 21 destPos:目標數組從destPos開始存放 22 len:從源數組中復制len個長度 23 */ 24 int[] arr2 = new int[arr.length]; 25 System.arraycopy(arr,1,arr2,0,4); 26 System.out.println(Arrays.toString(arr2)); 27 } 28 }