溫故而知新:java重溫第二天
什麼是方法
-
Java方法是語句的集合,它們在一起執行一個功能
-
方法是解決一類問題的步驟的有序組合
-
方法包含於類和物件中
-
方法在程式中被建立,在其他地方被引用
-
-
設計方法的原則:方法的本意是功能塊,就是實現某個的語句塊的集合,我們設計方法的時候,最好保持方法的原子性,就是一個方法只完成一個功能。
-
public class Demo01{ public static void main(String[] args){ int sum = add(1,2);//呼叫add方法進行加法 System.out.print(sum); } //加法的方法 public static int add(int a, int b){ return a+b; } }
-
以上就是建立一個加法的方法,在main中呼叫add()方法,完成加法的功能。
方法的定義和呼叫
方法的定義
-
java的方法類似於其他語言的函式,是一段用來完成特定功能的程式碼片段,一般情況下,定義一個方法包含以下的已於:
-
方法包含一個方法頭和一個方法體。下面是一個方法的所有部份:
-
修飾符:修飾符,這是可選的,告訴編譯器如果呼叫該方法,定義了該方法的訪問型別。
-
返回值型別:方法可能會返回值,returnValueType是方法返回值的資料型別。有些方法所需的操作,但沒有返回值,在這種情況下,returnValueType是關鍵之void。
-
方法名:是方法的實際名稱,方法名和引數表共同構成方法名。
-
引數型別:引數是一個佔位符。當方法被呼叫時,傳遞值給引數,這個值被稱為實參或變數。引數列表是指方法的引數型別、順序和引數的個數。引數是可選的,方法可以不包含引數。
-
形參:在方法被呼叫是用於接收外界輸入的資料
-
實參:呼叫方法時實際傳給方法的資料。
-
-
方法體包含具體的居於,定義該方法的功能。
修飾符 返回值型別 方法名(引數型別 引數名){ ... 方法體 ... return 返回值; } //加法的方法 public static int add(int a, int b){ return a+b; } //其中a是形參,用來定義作用的。在呼叫add是傳入的數值為實參。
-
方法呼叫
-
呼叫方法:物件名.方法名(實參列表)
-
java支援兩種呼叫方法的方式,根據方法是否返回值來選擇。
-
當方法返回一個值的時候,方法呼叫通常被當作一個值。例如
int larger = max(30,40);
-
如果方法是void,則方法呼叫一定是一條語句。
方法的過載
命令列傳參
-
有時候希望執行要給程式時候再傳遞給它訊息。這是要靠傳遞命令列引數給main()函式實現;
-
需要開啟cmd中,在裡面執行java檔案,給args賦值;
public class CommandLine{
public static void main(String args[]){
for(int i=0;i<args.length;i++){
System.out.println("args["+i+"]"+args[i]);
}
}
}
可變引數
-
在方法宣告中,在指定引數型別後加一個省略號(...)
-
一個方法中只能指定一個可變引數,它必須是方法的最後一個引數。任何普通的引數必須在它之前宣告。
-
意思就是指定引數型別,在引數型別之後加(...),之後的引數名,就可以在不指定多個的情況下,呼叫方法時可以傳入多個引數
public class Demo01{ public static void main(String[] args){ Main main = new Main(); main.add(1,2,3);//可以寫入多個實參,並且不需要在方法上定義多個形參。 } //加法的方法 public void add(int... a){ System.out.println(a[0]); System.out.println(a[1]); System.out.println(a[2]); } }
-
遞迴
-
遞迴就是自身呼叫自身的方法。
-
遞迴結構包含兩個部份:
-
遞迴頭:什麼時候不呼叫自身方法。如果沒有頭,將陷入死迴圈
-
遞迴體:什麼時候需要呼叫自身方法。
-
-
遞迴可以用來解決一些複雜的問題,將一個大型複雜的問題逐層轉化分解和一個個小問題來解決,遞迴策略只需要少量的程式就可以描述出解題過程需要的多次計算,大大減少程式碼量。遞迴的能力在於用有限的語句來定義物件的無限集合。
public class Demo01{
public static void main(String[] args){
//這裡是呼叫方法傳入數值5,
System.out.println(f(5));//輸出120
//呼叫方法過程中發生:5*4*3*2*1=120
}
//建立遞迴方法,如果不滿足條件會繼續呼叫自身
public static int f(int a){
if(a == 1){
return 1;
}else {
return a*f(a-1);
}
}
}
陣列
-
陣列的定義
-
陣列是相同型別資料的有序集合
-
陣列描述的是相同型別的若干個資料,按照一定的先後次序排序組合而成
-
其中,每一個數據稱作一個數組元素,每個陣列按照下標來訪問它。
-
-
陣列的宣告建立
-
首先必須宣告陣列變數,才能在程式中使用陣列。下面是宣告陣列變數的語法。
-
public class Demo01{ public static void main(String[] args){ int[] nums;//1.定義陣列 int nums[];//也可以 但是推薦用上面 //java語言使用new操作符來建立陣列,語法如下: nums = new int[10];//10為數量,數量為幾即存放幾個資料。 //給陣列元素賦值 for(int i=0;i<10;i++){ nums[i]=i+1; } //注意:陣列下標是從0開始,即nums[0]=1; //獲取陣列的長度: nums.length //輸出陣列 for(int i=0;i<nums.length;i++){ System.out.println(nums[i]); } } }
-
-
三種初始化及記憶體分析
-
java記憶體分析:
-
堆:
-
存放new的物件和陣列
-
可以被所有的執行緒共享,不會存放別的物件引用
-
-
棧:
-
存放基本變數型別(會包含這個基本型別的具體數值)
-
引用物件的變數(會存放這個引用在堆裡面的具體地址)
-
-
方法區:
-
可以被所有執行緒共享
-
包含了所有的class和static變數
-
-
//靜態初始化 int[] i ={1,2,3,4,5}; System.out.println(i[0]);//輸出為1 //動態初始化, int[] a = new int[10]; a[0] = 1; a[1] = 2; System.out.println(a[0]);//輸出為1 //棧就箱單與目錄,而堆可以相比於內容。
-
陣列的使用
-
For-Each迴圈
-
public class Demo01{ public static void main(String[] args){ int[] number = {1,2,3,4,5}; //列印全部的陣列元素 for (int i = 0; i < number.length; i++) { System.out.print(number[i]+"\t"); } System.out.println(); //計算所有元素總和 int sum=0; for (int i = 0; i < number.length; i++) { sum += number[i]; } System.out.println(sum); } //還可以查詢最大元素等。 //以下是進階for迴圈 // array無下標,可以用於遍歷陣列,取出每一個數值 int[] arrays = {1,2,3,4,5}; for (int array :arrays ){ System.out.print(array+"\t"); } }
-
-
陣列做方法入參
-
public class Demo01{ public static void main(String[] args) { int[] arrays = {1, 2, 3, 4, 5}; //呼叫列印陣列元素的方法 printArray(arrays); //反轉陣列 System.out.println(Arrays.toString(reverse(arrays)));//輸出[5,4,3,2,1] } //列印陣列元素 public static void printArray(int[] arrays){ for (int i = 0; i < arrays.length; i++) { System.out.println(arrays[i]); } } //反轉陣列,讓陣列按照相反的順序輸出 public static int[] reverse(int[] arrays){ int[] reverse = new int[arrays.length]; for (int i = 0, j = arrays.length-1 ; i < arrays.length; i++,j--) { reverse[j]=arrays[i]; } return reverse; } }
-
-
陣列做返回值
二維陣列
-
相當於在陣列之上在建立一個數組(無限套娃哈哈哈)
int[][] = {{1,2},{3,4},{5,6}}
//就比如上方 可以分為3個一維陣列,放在一起組成了一個新的陣列。
//那麼第一個的下標範圍就是0-2,第二個下標範圍就是0-1
System.out.println(int[0][1])//輸出2
System.out.println(int[1][1])//輸出4
System.out.println(int[2][1])//輸出6
Arrays類
public class Main {
public static void main(String[] args) {
int[] i={1,2,3,4,5};
System.out.println(Arrays.toString(i));
}
}
-
Arrays類中有很多封裝好的方法,如上圖的toString()方法就是用來輸出陣列。
氣泡排序
-
比較陣列中,兩個相鄰的元素,如果第一個比第二個大,就交換他們的位置。
-
每一次比較都會產出一個最大,一個最小
-
下一輪則可以少一次排序
-
依次迴圈,直到結束。
public class ArraysClass {
public static void main(String[] args) {
int[] array={5,4,2,45,8,61,44};
System.out.println(Arrays.toString(sort(array)));
}
//氣泡排序
public static int[] sort(int[] array){
int a;
//外層迴圈
for (int i = 0; i < array.length-1 ; i++) {
//內層迴圈
for (int j = 0; j < array.length-1-i ; j++) {
if (array[j+1]>array[j]){
a = array[j+1];
array[j+1] = array[j];
array[j] = a;
}
}
}
return array;
}
}
稀疏陣列
-
當一個數組中大部分元素為0,或者為同一值時,可以使用稀疏陣列來儲存該陣列。
-
處理方法:
-
記錄陣列一共有幾行幾列,有多少個不同值
-
把具有不同值的元素和行列及值記錄在一個小規模的陣列中,從而縮小程式的規模。
-
public class ArraysClass {
public static void main(String[] args) {
//建立稀疏陣列
int [][] array1 = new int[11][11];
array1[1][1] = 1;
array1[2][3] = 1;
//輸出原始的陣列
System.out.println("輸出原始陣列");
for (int[] ints :array1){
for (int anInt: ints){
System.out.print(anInt+"\t");
}
System.out.println();
}
//轉化為稀疏陣列來儲存
//獲取有效值的個數
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array1[i][j]!=0){
sum++;
}
}
}
System.out.println("有效陣列個數為:"+sum);
//建立一個稀疏陣列
int[][] array2 = new int[sum+1][3];
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum;
//遍歷二維陣列,將非0的值存入陣列中
int count=0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array1[i][j]!=0){
count++;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
System.out.println("輸出稀疏陣列");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0]+"\t"+
array2[i][1]+"\t"+
array2[i][2]+"\t");
}
//還原稀疏陣列
//讀取稀疏陣列的行數,列數
int[][] array3 = new int[array2[0][0]][array2[0][1]];
//給其中的元素還原他的數值
for (int i = 1; i < array2.length ; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
System.out.println("還原後的稀疏陣列為:");
//遍歷輸出陣列
for (int[] ints :array3){
for (int anInt: ints){
System.out.print(anInt+"\t");
}
System.out.println();
}
}
-
原始的陣列為
-
可以看出大部分均為相同數字,只有2個為1;
-
而稀疏陣列的作用就是輸出不為0或者不是相同數字的陣列,根據不同數字的行,列,數值,來輸出。
-
-
可以看出以上的第一行描述的意思是描述稀疏陣列是11行,11列,一共2個不同數值的陣列。
-
第二行輸出的是,第一個1在第二行,第二列(陣列下標+1)
-
第三行輸出的是,第二個1在第三行,第四列。
-
還原稀疏陣列的原始陣列就可以按照我們輸出的稀疏陣列的第一行來獲取一共有11行,11列,那麼二維陣列就是arrays3 [11] [11]
-
再根據之後的每一列獲取每一個數值相對應的位置。最後遍歷輸出。