方法一般是爲了完成某一功能,把程序中特定的代碼塊組合在一塊兒構成的。java
方法的好處體如今:(1)可重用性,屢次使用,避免冗餘(2)使程序結構更加清晰數組
[修飾符] 返回值類型 方法名(形參列表){數據結構
方法體函數
},即方法頭+方法體。spa
(1)修飾符:用來規定方法的可見範圍等特徵。如public表示公開方法,static表示該方法是靜態的。操作系統
(2)返回值類型:表示該方法會返回一個什麼類型的值。若是不須要返回值,則類型爲void。其餘類型則須要在方法體內部最後使用 return 返回值類型 語句。return和break,continue同樣。屬於跳轉語句,return的做用是返回給主調方法並退出當前方法。方法的返回值只能有一個。線程
(3)方法名:符合方法的命名規則。指針
(4)形參列表:接收傳入的參數。形參的個數能夠是零個,一個或多個。不管是否有參數,()都必須出現。形參列表的格式爲 類型A a,類型B b。對象
遞歸就是本身調用本身的方法,主調函數也是被調函數。爲了防止遞歸沒有窮盡,必須規定遞歸的退出條件。blog
數組是相同類型數據的有序集合。數組描述的是相同類型的若干數據。按照必定的前後次序排列組合。其中每個數據稱爲元素,每一個元素均可以經過數組的索引或者下標(角標)來定位。
數組是引用類型。數組中的元素能夠是基本類型或者引用類型。一個數組的內存空間是連續的,而數組的引用名是連續空間的首址。數組的長度一旦肯定就不能更改。數組須要聲明、建立、賦值並使用。
(1)聲明/定義:有兩種格式,數據類型[] 引用名; 和數據類型 引用名[];。java推薦使用前一種。數組的聲明中不能夠定義數組的長度。
(2)建立/初始化:所謂初始化,就是爲數組中的元素分配內存空間,併爲每一個元素賦值。方式也有兩種,分爲動態初始化和靜態初始化。
動態初始化即數組聲明和數組元素的分配空間和賦值能夠分開進行:引用名 = new 數組類型[數組長度];,數組長度必須是正整數。new的做用是爲數組開闢空間。數據類型指定每一個數組元素的空間大小。[]表示這個是一個數組。長度表名數組元素個數。
靜態初始化:聲明和初始化必須同時完成 :數組類型[] 引用名 = {初值列表};此時在聲明數組時,不須要指定長度,系統會根據給出的數據自動分配長度。
(3)賦值並使用數組:引用名[下標] = 值; 使用數組時,使用 引用名[下標]獲取相應的值。下標範圍爲0-數組長度-1,當下標不在此範圍時會發生數組越界。
通常使用for循環爲數組賦值\取值。
數組元素中存儲的內容和類型相關,若是是基本數據類型,存放的是數據自己,若是是引用類型,存放的是引用變量的地址。Java的內存分爲棧內存和堆內存,基本數據類型的變量和數據都存在於棧中,引用數據類型的變量(地址)存在於棧中,數據存在於堆中,因此引用數據元素的內容 實際上是堆內存地址。數組也是引用類型,因此整個數組內容都存在於堆中。
10.數組的默認值:在動態初始化中,byte short int初值都爲0 long爲0L char是一個空格('\u0000')float和double類型的默認值爲0.0 String和其餘引用類型都是null(String類型初值不等於「」)
程序運行必須在內存中進行,Java程序運行時,向JVM請求內存,JVM再向操做系統申請內存。JVM進行內存分配時,將內存分爲棧和堆。
線程共享數據區中有堆和方法區。
其中堆存儲對象數據,方法區簡單地說就是存放着class文件中的內容。若是new對象時申請不到空間,就會拋出內存溢出異常。
線程隔離(私有)的數據區中有虛擬機棧、本地方法棧和程序計數器。
其中程序計數器共CPU找到下一條指令的地址和恢復現場,虛擬機棧中分割成一個個的棧幀,每一個棧幀對應着一次方法的調用。棧幀中存放着局部變量表【方法中的參數和局部變量】(基本數據結構的變量和對象的引用)、操做數棧(進行運算的棧)、方法出口和其餘的信息。換一種說法,棧幀中存放着函數入參、出參、返回地址和上一個棧幀的棧底指針以及操做數棧。當棧調用的深度大於JVM所容許的範圍,也會發生一個異常。本地方法棧是Java方法調用其餘語言的接口。
堆中存放的是引用對象的數據,棧中存放着基本數據類型的數據和引用對象的地址。
聲明:int[][] arr; int arr[][];
動態初始化:指定行數列數和僅指定行數。int[][] arr = new int[]3[5]; int[][] arr = new int[3][];
賦值(針對不一樣的初始化方法):arr[1][2] = 2; arr[0] = new int[3]; 沒賦值的默認是0
靜態初始化:int[][] arr = {{2,1,4},{3,1,4,2,1},{3}}; int[][] arr = new int[][]{{2,1,4},{3,1,4,2,1},{3}};
方法 就是將具備獨立功能的代碼庫組織成爲一個總體,使其具備特殊功能的代碼集。方法必須先建立纔可使用,過程就成爲方法的定義。方法定義以後不能直接運行 須要手動的調用 才能夠執行。過程稱爲方法的調用。
方法語法格式:[修飾符] 返回值類型 方法名([形參列表]){ 方法體 }。
方法的優勢:能夠重複使用;使程序結構更加清晰;程序可讀性強。
方法定義:無參方法/有參方法
public static void 方法名稱(){
方法體;
}
public static void 方法名稱(形參列表){
方法體;
}
方法的調用: 方法名稱();方法調用時,首先main()進入方法棧,執行main中的代碼,當調用一個方法時,新的方法進入方法棧,建立形參和局部變量,並在本身的操做數棧中運算,運算結束後,該方法出方法棧,main方法繼續運行,main方法執行完成後出棧。出棧時同時會釋放空間。
形參是在方法入棧才分配內存,方法調用結束後,內存會被當即釋放,因此形參只在方法內有效。實參能夠是常量、變量、表達式、方法等,實參在被方法調用時,必須有實際的值。形參和實參在類型、數量、順序上都必須一致。若是重載方法中沒有一致的數據類型,那麼首先找到最小兼容實參的參數列表進行調用。方法調用中,數據傳遞是單向的,即實參傳給形參,修改的形參不能反向傳給實參。可是若是傳遞的是引用對象的地址,那麼能夠根據這個地址訪問,來修改引用變量內部的值。
方法名同樣,形參列表的參數個數、參數類型的順序、參數類型不一樣時,定義多個重名方法稱爲方法的重載。若是方法的返回值相同,也符合上述描述,那麼也是方法的重載,若是方法的返回值不一樣,參數列表沒有變化,則會直接提示報錯。總之,返回類型的改變不引發方法的重載。
一次比較相鄰的兩個數,升序時依次將大數向後傳遞。能夠升序,也能夠降序。第i輪的做用是把第i大的數放到數組的n-i下標處。每一輪須要比較的次數-1。第一次須要n-1次比較。冒泡排序最多要進行 (n-1)+(n-2)+……+1 次相鄰 2 數交換
前面有序,後面無序。從下標爲1的元素開始,(升序排序)若是小於就和前面的元素交換。造成一種前面暫時有序,後面未處理的狀態,直到數組所有有序。若是數據自己是降序的,而要求按照升序排序,那麼插入排序須要 1+2+3+……+(n-1) 次數據移動。每一輪從第二部分中的挑選第一個元素插入到第一部分。
每次取第一個元素(頭部元素),設置兩個指針,分別是下標爲1和下標爲n-1。將大於頭部元素的數移動到後面,直到前面的指針下標大於後面的指針。此時將頭部元素和後面的指針所指的元素交換,即和最後一個小於頭部元素的元素交換。返回這個下標,此時獲得的數組就是以這個下標爲分界,前面部分小於等於頭部元素,後面部分大於等於頭部元素的半有序數組。此時遞歸前面部分和後面部分,直到只剩下一個元素或沒有元素。
首先一直移動左指針到首次大於頭部元素的下標處,再移動右指針到首次小於頭部元素的下標處。若是此時左指針大於右指針,則結束此次遍歷返回。不然,交換兩個元素,並再次移動。方法的結果也是會造成一個半有序的數組,一直遞歸調用直到剩下一個或零個元素爲止。