二維數組:就是元素爲一維數組的一個數組。
格式1:(動態初始化,列固定)
數據類型[][] 數組名 = new 數據類型[m][n];
m:表示這個二維數組有多少個一維數組。
n:表示每個一維數組的元素有多少個。
注意:
A:如下格式也能夠表示二維數組
a:數據類型 數組名[][] = new 數據類型[m][n];
b:數據類型[] 數組名[] = new 數據類型[m][n];
B:注意下面定義的區別
int x; int[] x;
int y; int[] y[];
int x,y; int[] x,y[];(等價於定義一維數組x,訂價二維數組y;)java
class Array2Demo1 { public static void main(String[] args) { //定義一個二維數組 int[][] arr = new int[3][2]; //定義了一個二維數組arr //這個二維數組有3個一維數組的元素 //每個一維數組有2個元素 //輸出二維數組名稱 System.out.println(arr); //地址值 [[I@1db9742 //輸出二維數組的第一個元素一維數組的名稱 System.out.println(arr[0]); //地址值 [I@106d69c System.out.println(arr[1]); //地址值 [I@52e922 System.out.println(arr[2]); //地址值 [I@25154f //輸出二維數組的元素 System.out.println(arr[0][0]); //0 System.out.println(arr[0][1]); //0 } }
格式2:(動態初始化,列變化)
數據類型[][] 數組名 = new 數據類型[m][];
m:表示這個二維數組有多少個一維數組。
列數沒有給出,能夠動態的給。這一次是一個變化的列數。數組
class Array2Demo2 { public static void main(String[] args) { //定義一個二維數組 int[][] arr = new int[3][]; System.out.println(arr);//[[I@1db9742 System.out.println(arr[0]);//null System.out.println(arr[1]);//null System.out.println(arr[2]);//null //動態的爲每個一維數組分配空間 arr[0] = new int[2]; arr[1] = new int[3]; arr[2] = new int[1]; System.out.println(arr[0]);//[I@106d69c System.out.println(arr[1]);//[I@52e922 System.out.println(arr[2]);//[I@25154f System.out.println(arr[0][0]);//0 System.out.println(arr[0][1]);//0 //System.out.println(arr[0][2]); //錯誤:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException arr[1][0] = 100; arr[1][2] = 200; } }
格式3:(靜態初始化)
基本格式:
數據類型[][] 數組名 = new 數據類型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};spa
簡化版格式:
數據類型[][] 數組名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
舉例:
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
int[][] arr = {{1,2,3},{4,5},{6}};code
class Array2Demo3 { public static void main(String[] args) { //定義數組 int[][] arr = {{1,2,3},{4,5},{6}}; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[0][0]); //1 System.out.println(arr[1][0]); //4 System.out.println(arr[2][0]); //6 System.out.println(arr[0][1]); //2 System.out.println(arr[1][1]); //5 //越界 //System.out.println(arr[2][1]); //錯誤 } }
二維數組遍歷:對象
外循環控制的是二維數組的長度,其實就是一維數組的個數。blog
內循環控制的是一維數組的長度。io
class Array2Demo4 { public static void main(String[] args) { //定義一個二維數組 int[][] arr = {{1,2,3},{4,5,6},{7,8,9}}; //請問誰表明{1,2,3} //arr[0]就是第一個數組 //arr[0] = {1,2,3}; for(int x=0; x<arr[0].length; x++) { System.out.println(arr[0][x]); } System.out.println("--------------"); for(int x=0; x<arr[1].length; x++) { System.out.println(arr[1][x]); } System.out.println("--------------"); for(int x=0; x<arr[2].length; x++) { System.out.println(arr[2][x]); } System.out.println("--------------"); //用循環改進 for(int x=0; x<3; x++) { for(int y=0; y<arr[x].length; y++) { System.out.print(arr[x][y]+" "); } System.out.println(); } System.out.println("--------------"); //這個時候,3是咱們根據上面的代碼得出來的 //可是,它不能針對任何的數組均可以這樣 //因此,咱們應該想辦法改進 //其實,外面的這個循環的長度就是二維數組的長度 for(int x=0; x<arr.length; x++) { for(int y=0; y<arr[x].length; y++) { System.out.print(arr[x][y]+" "); } System.out.println(); } System.out.println("--------------"); //用方法改進 //調用方法 printArray2(arr); System.out.println("--------------"); //咱們再來一個列數是變化的 int[][] arr2 = {{1,2,3},{4},{5,6,7},{8,9}}; printArray2(arr2); } /* 需求:遍歷二維數組 兩個明確: 返回值類型:void 參數列表:int[][] arr */ public static void printArray2(int[][] arr) { for(int x=0; x<arr.length; x++) { for(int y=0; y<arr[x].length; y++) { System.out.print(arr[x][y]+" "); } System.out.println(); } } }
二維數組求和class
需求:
公司年銷售額求和,某公司按照季度和月份統計的數據以下:單位(萬元)
第一季度:84,65,46
第二季度:73,35,97
第三季度:28,49,80
第四季度:15,55,93
分析:
A:把題目的數據用二維數組來表示
int[][] arr = {{84,65,46},{73,35,97},{28,49,80},{15,55,93}};
B:如何求和呢?
求和其實就是獲取到每個元素,而後累加便可。
C:定義一個求和變量sum,初始化值是0。
D:經過遍歷就能夠獲得每個二維數組的元素。
E:把元素累加便可。
F:最後輸出sum,就是結果。thread
class Array2Demo5 { public static void main(String[] args) { //把題目的數據用二維數組來表示 int[][] arr = {{84,65,46},{73,35,97},{28,49,80},{15,55,93}}; //定義一個求和變量sum,初始化值是0。 int sum = 0; //經過遍歷就能夠獲得每個二維數組的元素。 for(int x=0; x<arr.length; x++) { for(int y=0; y<arr[x].length; y++) { //把元素累加便可。 sum += arr[x][y]; } } //最後輸出sum,就是結果。 System.out.println("一年的銷售額爲:"+sum+"萬元"); } }
Demo6:打印楊輝三角形(行數能夠鍵盤錄入)import
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
分析:看這種圖像的規律
A:任何一行的第一列和最後一列都是1
B:從第三行開始,每個數據是它上一行的前一列和它上一行的本列之和。
步驟:
A:首先定義一個二維數組。行數若是是n,咱們把列數也先定義爲n。
這個n的數據來自於鍵盤錄入。
B:給這個二維數組任何一行的第一列和最後一列賦值爲1
C:按照規律給其餘元素賦值
從第三行開始,每個數據是它上一行的前一列和它上一行的本列之和。
D:遍歷這個二維數組。
import java.util.Scanner; class Array2Demo6 { public static void main(String[] args) { //建立鍵盤錄入對象 Scanner sc = new Scanner(System.in); //這個n的數據來自於鍵盤錄入。 System.out.println("請輸入一個數據:"); int n = sc.nextInt(); //定義二維數組 int[][] arr = new int[n][n]; //給這個二維數組任何一行的第一列和最後一列賦值爲1 for(int x=0; x<arr.length; x++) { arr[x][0] = 1; //任何一行第1列 arr[x][x] = 1; //任何一行的最後1列 } //按照規律給其餘元素賦值 //從第三行開始,每個數據是它上一行的前一列和它上一行的本列之和。 for(int x=2; x<arr.length; x++) { //這裏若是y<=x是有個小問題的,就是最後一列的問題 //因此這裏要減去1 //而且y也應該從1開始,由於第一列也是有值了 for(int y=1; y<=x-1; y++) { //每個數據是它上一行的前一列和它上一行的本列之和。 arr[x][y] = arr[x-1][y-1] + arr[x-1][y]; } } //遍歷這個二維數組。 /* for(int x=0; x<arr.length; x++) { for(int y=0; y<arr[x].length; y++) { System.out.print(arr[x][y]+"\t"); } System.out.println(); } */ //這個時候,要注意了,內循環的變化必須和曾經講過的九九乘法表相似 for(int x=0; x<arr.length; x++) { for(int y=0; y<=x; y++) { System.out.print(arr[x][y]+"\t"); } System.out.println(); } } }
Java中的參數傳遞規律:
基本類型:形式參數的改變對實際參數沒有影響。
引用類型:形式參數的改變直接影響實際參數。
例如數組傳遞的是地址值,形參經過接收實參的地址改變數組元素的值後,至關於元素從新賦值。
class Demo7 { public static void main(String[] args) { int a = 10; int b = 20; System.out.println("a:"+a+",b:"+b); //a:10,b:20 change(a,b); System.out.println("a:"+a+",b:"+b); //???? a:10,b:20 int[] arr = {1,2,3,4,5}; change(arr); System.out.println(arr[3]); //???? 8 } public static void change(int a,int b) { //a=10,b=20 System.out.println("a:"+a+",b:"+b); //a:10,b:20 a = b; //a=20 b = a + b; //b=40 System.out.println("a:"+a+",b:"+b); //a:20,b:40 } public static void change(int[] arr) { //arr={1,2,3,4,5}; for(int x=0; x<arr.length; x++) { if(arr[x]%2==0) { arr[x]*=2; } } //arr={1,4,3,8,5}; } }