一、聲明數組和初始化(掌握)
數據類型[] 數組名 ;
數據類型 數組名[] ;
靜態初始化
數據類型[] 數組名 = {元素1,元素2,元素3};
動態初始化
數據類型[] 數組名 = new 數據類型[5];
數組名[0] = 元素1;
二、數組的內存結構(掌握)
package com.hl.array;public class ArrrayDemo1 {public static void main(String[] args) {//局部變量//基本數據類型int i = 1;//引用數據類型int[] array = new int[5];System.out.println(i);//棧區的值System.out.println(array);//堆區的內存地址}
}
package com.hl.array;public class ArrrayDemo1 {public static void main(String[] args) {//局部變量//基本數據類型int i = 1;//引用數據類型int[] array = new int[5];System.out.println(i);//棧區的值System.out.println(array);//堆區的內存地址int[] array2 = array;array2[0] = 1;System.out.println(array2[0]);//1System.out.println(array[0]);//0 1}
}
三、使用數據
1、數據的復制 (深拷貝和淺拷貝)
int[] array1 = new int[5];
int[] array2 = array1; //內存地址的copy 淺拷貝深拷貝拷貝的是數組的值
package com.hl.array;import java.util.Arrays;public class ArrayDemo2 {public static void main(String[] args) {int[] array1 = new int[10];int[] array2 = new int[array1.length];for (int i = 0; i < array2.length; i++) {array2[i] = array1[i];}array1[0] = 1;array2[0] = 2;System.out.println(Arrays.toString(array1));System.out.println(Arrays.toString(array2));}
}
2、數組的插入和刪除
數組插入,刪除:效率低,牽涉到擴容和數據元素移動。
數據:查詢|修改效率高 ,內存空間連續,有索引下標,可以快速定位。
3、算法(了解)
排序:冒泡、選擇排序
查找:二分查找
沒有二分查找時,是遍歷所有元素 數組長度100,最快1次,最慢100次,平均50次
前提條件是 數組是有序的。
int[]? array = {1,2,3,4,5,6,7}
123 4 567
mid = 4
num 10 num>mid [5,6,7]
min = mid+1 max=length-1
mid = 6
min=max=mid mid==10
四、二維數組
二維數組本質上就是一個一維數組,每一個元素又是一個一維數組。
int[] array = {1,2,3,4};
int[][] array = {{1,2,3,4},{5,6,7,8}
};//索引坐標 從二維數組中獲取數據int[] arr2 = array[0];
sout(arr2[0] + arr2[1])sout(arr[0][0])
二維數組的定義和初始化
靜態初始化:
int[][] array = {{1,2,3,4},{5,6,7,8}
};動態初始化:
int[][] array = new int[2][4];
//2行 4列
0 0 0 0
0 0 0 0
array[0][0] ... [0][3]
array[1][0] ... [1][3]
二維數組的遍歷
package com.hl.array2;public class Demo1 {public static void main(String[] args) {int[][] array = {{1,2,3},{4,5,6},{7,8,9,10}};//遍歷查詢//求二維數組長度System.out.println(array.length);for(int i=0;i<array.length;i++){//一維數組int[] array2 = array[i]; // {1,2,3}//遍歷每一個一維數組for (int j = 0; j < array2.length; j++) {System.out.print(array2[j]+" ");}System.out.println();//換行符}}
}
package com.hl.array2;public class Demo2 {public static void main(String[] args) {int[][] a = {{1,2,3},{4,5,6},{7,8,9,10}};//作為二維數組,通過平面圖形,利用坐標遍歷for (int i = 0; i < a.length; i++) {//外層循環行for (int j = 0; j < a[i].length; j++) {//內層循環列System.out.print(a[i][j] +" ");}System.out.println();}}
}
內存空間分配
使用二維數據
需求:生成10注雙色球
//生成10注雙色球
int[][] tickets = new int[10][7];
for (int i = 0; i < tickets.length; i++) {for (int j = 0; j < tickets[i].length; j++) {if(j < 6){//前6次,生成紅色球tickets[i][j] = random.nextInt(33)+1;}else{//生成一次藍色球tickets[i][j] = random.nextInt(16)+1;}}
}
//得到的二維數據
System.out.println(tickets);
改造需求:要求前6個球不能重復
//生成10注雙色球
int[][] tickets = new int[20][7];
for (int i = 0; i < tickets.length; i++) {for (int j = 0; j < tickets[i].length; j++) {if(j < 6){//前6次,生成紅色球tickets[i][j] = random.nextInt(33)+1;//解決數字重復問題for (int k = 0; k < j; k++) {if(tickets[i][j] == tickets[i][k]){j--;break;}}}else{//生成一次藍色球tickets[i][j] = random.nextInt(16)+1;}}
}
//得到的二維數據
System.out.println(Arrays.deepToString(tickets));
五、方法
1、了解方法的作用
什么是方法?
方法是具有特定功能的代碼塊。
簡單的理解就是:把一段完整的代碼,看成一個整體,并給這段代碼起個名字,以后在用的時候,使用這個名字就相當于執行了這一段代碼。
方法必須先創建才可以使用,創建只需要進行一次創建,使用可以多次。方法的創建過程稱為方法的定義。
2、聲明方法(定義方法)
方法的定義
方法隸屬于類,因此方法要定義在類中,且方法不能定義在別的方法內。---類后面會詳細講。
方法定義的格式
public static 返回值類型 方法名(參數列表){方法體
}public static void 方法名(){ //無參方法}public static 返回值(基本數據|引用類型) 方法名(){ //無參方法return 10;
}
public、static在講類和對象的時候會詳細講,此處先固定這么寫。
方法名的命名規范和變量名的命名規范相同。
返回值、參數列表 下面專門講解。
方法的分類
方法按有沒有參數,有沒有返回值可以分為以下4類:
無參數無返回值方法
無參數有返回值方法
有參數無返回值方法
有參數有返回值方法
3、調用方法
package com.hl.methodDemo1;public class MethodDemo2 {//main方法 入口方法public static void main(String[] args) {//調用方法//調用無參方法 方法名()printHello();printHello();//調用有參方法 方法名(值,值) 實參sum(1,2);int num = sum2(10,12);System.out.println(num);}//創建一個方法,在方法內打印helloworldpublic static void printHello(){System.out.println("hello world!");}//創建一個方法,在方法內打印兩個數字的和(傳入兩個參數)//sum(int i,int j) 形參(一個變量,一個占位符)public static void sum(int i,int j){System.out.println(i+j);}//創建一個方法,返回兩個數字的和(返回 --->要求有返回值)public static int sum2(int i,int j){return i+j;}
}
4、方法的值傳遞
基本類型的值傳遞(傳遞的是數值)
package com.hl.methodDemo1;public class MethodDemo3 {public static void main(String[] args) {//調用方法int i = 1;m1(i);System.out.println("main...."+i);}//聲明方法public static void m1(int i){i++;System.out.println("m1...."+i);}
}
package com.hl.methodDemo1;public class MethodDemo3 {public static void main(String[] args) {//調用方法int i = 1;
// m1(i);
// System.out.println("main...."+i);int j = m2(i);System.out.println(i);System.out.println(j);}//聲明方法public static void m1(int i){i++;System.out.println("m1...."+i);}public static int m2(int i){i++;return i;}
}
引用類型的值傳遞(堆區內存地址)
package com.hl.methodDemo1;public class MethodDemo4 {public static void main(String[] args) {//調用方法int[] array = {6,5,4,3,2,1};m1(array);System.out.println(array[0]);//6 1System.out.println(array[1]);//5 2System.out.println(array[2]);//4 4}//定義方法public static void m1(int[] array){array[0] = 1;array[1] = 2;System.out.println(array[0]);//1System.out.println(array[1]);//2System.out.println(array[2]);//4}
}
package com.hl.methodDemo1;public class MethodDemo5 {public static void main(String[] args) {int i = 1;int[] array = new int[10];i = m1(i,array);System.out.println(i);//8、 1 3 4System.out.println(array[0]);//9、 2}public static int m1(int i ,int[] array){i++;array[0] = i++;return ++i;}// public static void m1(int i ,int[] array){
// i++;
// array[0] = i++;
// System.out.println(array[0]);//15、2
// System.out.println(i);//16、3
// }}
5、方法的重載
同一個類中,方法名稱相同,參數列表不同,稱為方法重載。
package com.hl.methodDemo1;import java.util.Random;/*
Overload 和 Override 的區別?
方法重載 和 方法重寫 的區別?同一個類中,方法名稱相同,參數列表不同,稱為方法重載。(跟返回值無關)參數列表不同:參數個數不同,類型不同 或者 類型順序不同max(int i,int j);max(int j,int i);max(int i,double j); //重載max(double i;int j) //重載*/
public class MethodOverload {public static void main(String[] args) {Math.max(1,3);Math.max(1.0,3.0);Random r = new Random();r.nextInt();r.nextInt(100);}//方法名---變量名 見名知意public static void add() {System.out.println("........");}public static int add(int a, int b){return a+b;}public static double add(double a, double b){return a+b;}public static double add(double a, int b){return a+b;}public static double add(int a, double b){return a+b;}}
6、不定參數方法
package com.hl.methodDemo1;
/*
不定參數注意事項:int...變量名 不定參數(0到多個變量),底層是數組一個方法中最多只能有一個不定參數,并且不定參數必須是最后一個參數*/
public class MethodDemo6 {public static void main(String[] args) {
// int sum = sum();
// System.out.println(sum);int[] array = {1,2,3};//調用者int sum = sum2(null);System.out.println(sum);}//自定義一個方法,求多個int變量的和//int...變量名 不定參數(0到多個變量),底層是數組public static int sum(int...num){int sum = 0;for (int i = 0; i < num.length; i++) {sum += num[i];}return sum;}
// public static int sum(int[] array){
// return 0;
// }//定義方法public static int sum2(int[] num){int sum = 0;if(num != null){ //避免空指針異常for (int i = 0; i < num.length; i++) {//num 為null,出現空指針異常sum += num[i];}}return sum;}//自定義方法public static void sum3(double d1,double d2,int...args){}}
7、方法練習
1. 需求:設計一個方法,自定義數據范圍(最小值和最大值),根據鍵盤錄入獲取用戶輸入的數據。
要求用戶必須輸入num1~num2之間的數,如果不是,讓用戶重新輸入,直到用戶輸入的內容合法。
package com.hl.homework;import java.util.Scanner;public class WorkDemo1 {//1. 需求:設計一個方法,獲取用戶輸入的數據。// 要求用戶必須輸入0~9之間的數,如果不是,讓用戶重新輸入,直到用戶輸入的內容合法。public static int input(){Scanner scanner = new Scanner(System.in);int num = -1;do{System.out.println("請錄入0-9的數字:");num = scanner.nextInt();if(num >= 0 && num <= 9){break;}else{System.out.println("錄入錯誤,請重新錄入");}}while(true);return num;}//2. 需求:設計一個方法,自定義數據范圍,獲取用戶輸入的數據。// 要求用戶必須輸入num1~num2之間的數,如果不是,讓用戶重新輸入,直到用戶輸入的內容合法。public static int input(int num1,int num2){Scanner scanner = new Scanner(System.in);int num = -1;do{System.out.println("請錄入"+num1+"-"+num2+"的數字:");num = scanner.nextInt();if(num >= num1 && num <= num2){break;}else{System.out.println("錄入錯誤,請重新錄入");}}while(true);return num;}public static void main(String[] args) {
// int num = input();
// System.out.println("接收到:"+num);int num = input(5,10);System.out.println("接收到:"+num);}
}
關于return關鍵字:
package com.hl.homework;public class WorkDemo2 {public static void main(String[] args) {//調用方法double money = getMoney();System.out.println(money);}//方法定義//返回值的方法,必須使用return關鍵字返回結果給調用者public static double getMoney(){int i = 1;
// if(i > 1){
// return 1000;
// }else{
// return 10000;
// }// while(true){
//// break;
// return 100000;
// }boolean flag = true;while(flag){return 1;//返回到方法調用位置//System.out.println("----不可達---");}System.out.println("-----while 外------");return 10000;}
}
需求2:定義一個方法,接收一個二維數組,求二維數組中元素的最大值和最大值的索引下標。
package com.hl.homework;public class WorkDemo3 {
// 需求2:定義一個方法,接收一個二維數組,求二維數組中元素的最大值。public static int getMax(int[][] array){int max = array[0][0];int x = 0;int y = 0;for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {
// System.out.print(array[i][j] + " ");if(array[i][j] >= max){max = array[i][j];x = i;y = j;}}}System.out.println("最大值索引下標"+x+"--"+y);return max;}//定義一個方法, 編寫代碼, 求二維數組中,第2行的平均值。public static double getAvg(int[][] array){int sum = 0;for (int i = 0; i < array[1].length; i++) {sum += array[1][i];}return sum*1.0/array[1].length;}public static void main(String[] args) {int[][] array = {{1,22,3},{4,55,6},{7,8,9}};
// int max = getMax(array);
// System.out.println("最大值是:"+max);double avg = getAvg(array);System.out.println("第二行的平均值為:"+avg);}
}