1. 程式人生 > 其它 >一、java基礎-12_通過命令列給main()方法傳參&可變引數&遞迴&陣列

一、java基礎-12_通過命令列給main()方法傳參&可變引數&遞迴&陣列

命令列傳參(通過命令列給main()方法傳參)

有時候你希望執行一個程式時候在傳遞給它訊息。這時候要靠傳遞命令列引數給main()函式實現。(通過”命令提示符“給main()方法傳參 / 在idea的”terminal“介面執行Java給main()方法傳參) 

在"要執行的java檔案"所在的目錄執行"javac指令",即在other目錄中執行javac Test.java
在"要執行的Java檔案所在包 的上層目錄"中執行"java指令",即在java目錄中執行java cn.companyname.javase8.test.other.Test

可變引數

背景:JDK 1.5開始,Java 提供了 “可變引數/變長引數” ,允許在呼叫方法時傳入不定長度的引數。變長引數是 Java 的一個語法糖,本質上還是基於陣列的實現。
定義方法

:在定義方法時,在最後一個形參後加上三點 … ,就表示該形參可以接受多個引數值,多個引數值被當成陣列傳入。
上述定義有幾個要點需要注意
1. 可變引數只能作為函式的最後一個引數,但其前面可以有也可以沒有任何其他引數 2.由於可變引數必須是最後一個引數,所以一個函式最多隻能有一個可變引數
3. Java的可變引數,會被編譯器轉型為一個數組
4. 變長引數在編譯為位元組碼後,在方法簽名(方法宣告的兩個元件構成了 方法簽名 —— 方法的名稱、引數型別)中就是以陣列形態出現的。若果兩個方法的簽名是一致的,同時出現在類中,是不能編譯通過的(不能作為方法的過載)。可變引數可以相容陣列,反之則不成立。
使用場景:在不確定方法需要處理的物件的數量時可以使用可變長引數,會使得方法呼叫更簡單,無需手動建立陣列 new T[ ]{…}

遞迴:

遞迴就是:A方法呼叫A方法!就是自己呼叫自己。
作用:利用遞迴可以用簡單的程式來解決一些複雜的問題。它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。遞迴的能力在於用有限的語句來定義物件的無限集合。
遞迴結構包括兩個部分:
遞迴頭:什麼時候不呼叫自身方法。如果沒有頭,將陷入死迴圈 ——> 。
遞迴體:什麼時候需要呼叫自身方法。

以此類推”是遞迴的基本思想。
具體來講就是把規模大的問題轉化為規模小的相似的子問題來解決。在函式實現時,因為解決大問題的方法和解決小問題的方法往往是同一個方法,所以就產生了函式呼叫它自身的情況。另外這個解決問題的函式必須有明顯的結束條件,這樣就不會產生無限遞迴的情況了。
遞迴需要滿足的三個條件:


  1. 一個問題的解可以分解為幾個子問題的解;2. 這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣;3. 存在遞迴終止條件。

遞迴的過程
我們會驚奇的發現這個過程和 棧 的工作原理一致,遞迴呼叫就是通過 棧 這種資料結構完成的。整個過程實際上就是一個棧的入棧和出棧問題。然而我們並不需要關心這個棧的實現,這個過程是由系統來完成的。
那麼遞迴中的“遞”就是入棧,遞進;“歸”就是出棧,迴歸

Java中不合理的使用遞迴呼叫,可能會導致棧記憶體溢位,這點是需要注意的。

棧溢位:什麼情況下才會發生 棧溢位 呢?  原文連結:https://zhuanlan.zhihu.com/p/73411916
最常見的就是遞迴。每次遞迴就相當於呼叫一個函式,函式每次被呼叫時都會將區域性資料(在函式內部定義的變數、引數、陣列、物件等)放入棧中。
遞迴1000次,就會將1000份這樣的資料放入棧中。這些資料佔用的記憶體直到整個遞迴結束才會被釋放,在遞迴過程中只會累加,不會釋放。如果遞迴次數過多,並且區域性資料也多,那麼會使用大量的棧記憶體,很容易就導致棧溢位了。(呼叫方法的次數叫深度)

  歸其實是方便了程式設計師難為了機器,遞迴可以通過數學公式很方便的轉換為程式。其優點就是易理解,容易程式設計。但遞迴是用棧機制實現的,每深入一層,都要佔去一塊棧資料區域,對巢狀層數深的一些演算法,遞迴會力不從心,空間上會以記憶體崩潰而告終,而且遞迴也帶來了大量的函式呼叫,這也有許多額外的時間開銷。所以在深度大時,它的時空性就不好了。(會佔用大量的記憶體空間)
  而迭代雖然效率高,執行時間只因迴圈次數增加而增加,沒什麼額外開銷,空間上也沒有什麼增加,但缺點就是不容易理解,編寫複雜問題時困難。能不用遞迴就不用遞迴,遞迴都可以用迭代來代替。(要辯證的看待這個問題,深度不大,還是可以採用遞迴的)

陣列

普通陣列
宣告陣列 變數的語法:
  DataType] arrayRefVar;   // 首選的方法
  DataType arrayRefVar];   // 效果相同,但不是首選方法
建立陣列:
  DataType[ ] arrayRefVar = new DataTypearraySize ];
  DataType[ ] arrayRefVar = value0, value1, ..., valuek };
  DataType[ ] a = new DataType[ ] value0, value1, ..., valuek };
二維陣列

建立: DataType]] typeName = new DataTypetypeLength1 ]typeLength2 ];

Arrays 類
  java.util.Arrays 類能方便地運算元組,它提供的所有方法都是靜態的。