還記得咱們的HelloWorld例程嗎?咱們如今對於輸出語句應該已經很熟悉了,
解釋:java
System 是系統類。程序員
out 是標準輸出對象算法
println() 是一個方法。編程
若是咱們想要在一個類中實現不少功能,可是若是咱們想要,屢次使用,某一個功能,顯然咱們須要重複書寫這個功能的代碼屢次,顯然,這是不明智的。因此方法就來拯救咱們了。數組
定義:方法是定義在類中的一段獨立的代碼塊,用來實現某個功能。數據結構
其實咱們在編程界中更喜歡叫它們爲函數,可是在Java中咱們也能夠叫作方法函數
做用:學習
·函數的主要做用是爲了提升代碼的複用性。優化
·使程序簡短而清晰,更加利於維護網站
A:修飾符: public static (暫時瞭解這一個 後期補充)
B:返回值類型: 就是功能結果的數據類型
有一些方法執行代碼中的命令便可,執行後就能夠結束了,並無返回值(void)
有一些方法須要將最後的結果返回給你,從而讓開發者使用這個結果
舉例更好理解哦:最近有一場周杰倫的演唱會,我經過好多朋友幫忙一塊兒的搶票方法,最後獲得了兩張票,這兩張票就是「搶票」方>法的返回值,我(開發者)能夠對這個返回值進行任何操做,例如本身去看,或者送給朋友,甚至能夠用來當草稿紙(哭...)
C:參數類型:參數的數據類型
主方法能夠調用其餘方法,其餘方法能夠互相調用,但不能調用主方法,主函數是系統調用的。
A:單獨使用,通常來講沒有意義(不表明有錯),因此不推薦
B:輸出調用,可是不夠好,由於咱們可能須要針對結果進行進一步操做
C:賦值語句,推薦方案。
方法的調用優化:
Eg:比較兩個數是否相等(在沒有熟練以前咱們仍然推薦使用初始直觀的用法,程序能夠正常的跑是咱們的底線)
通常來講,咱們都是根據做用來命名方法(方法名有意義),可是不少時候會咱們會針對不一樣的數據類型,或者參數個數來進行操做,例如咱們所要求幾個數字中的最大值問題(以下圖)就出現了這兩種問題。使用方法重載,既能夠保證命名有意義,也能夠避免記憶過多的不一樣名稱
定義:用同一方法名定義多個方法,這些方法的參數個數或者參數類型不一樣
做用:使一個方法名賦予新的含義,使一個方法名能夠多用
適用:實現細節不一樣的同一類功能時候
理解:其實就是使得一個方法擁有了更多的可能性,一個名稱解決多種問題。
注意:
1. 函數的返回類型不一樣,但參數個數和類型相同,不是重載
2. 重載函數的的參數個數,參數類型,參數順序至少有一個須要不一樣
引文:咱們在籃球場比賽中,夢之隊運動員共有10名,咱們分別將每一個人定義爲幾號運動員,這樣咱們找某一我的的時候,咱們就會先找到夢之隊這支隊伍,而後去找對應編號的人。
而數組就像這隻隊伍的概念同樣,而數組中的每個元素就是每個球員,當你須要找數組的某一個元素的時候,只須要找到你須要查找的數組(夢之隊),再根據數組下標(對應編號)去尋找對應元素(球員)。
這樣作的好處就是,咱們將一批同類型的元素整理概括到了一塊兒,而且標號記錄。
既方便了查找與使用,又避免了定義多個變量的麻煩。
概念:以存儲一個固定大小的相同類型元素的順序集合。
數組是用來存儲一系列數據,但它每每被認爲是一系列相同類型的變量。
(全部的數組都是由連續的內存位置組成)
格式:
第一種讀法:定義一個 dataType類型的數組 arrayRefvar 變量
第一種能夠認爲是java風格的定義格式,推薦第一種,不過也只是編程風格不一樣罷了。
初始化:
A:概念:爲數組開闢內存空間,爲每一個數組元素賦予值(內存分配問題就在下面哦)
B:方式:
a:動態初始化 → 只指定長度,由系統給出初始化值
b: 靜態初始化 → 給出初始化值,由系統決定長度
A:動態初始化格式:
數據類型 [] 數組名 = new 數據類型 [數組長度];
Eg: int [] arr = new int [3];
B:靜態初始化格式:
數據類型 [] 數組名 = new 數據類型 [] {元素1,元素2,...};
Eg:int [] arr = new int [] {1,2,3};
簡化格式:
數據類型 [] 數組名 = {元素1,元素2,...};
Eg:int [] arr = {1,2,3};
數組的訪問:
數組的元素是經過索引訪問的。數組索引從 0 開始,因此索引值從 0 到 數組長度-1。(這隻球隊但是有0號選手的哦吼~)
進階補充知識:
在Java中,數組是一種效率最高的存儲和隨機訪問對象的引用序列的方式。數組就是一個簡單的線性序列,這使得元素訪問很是快速。可是爲這種速度所付出的代價是數組對象的大小被固定,而且在其生命週期中不可改變。你可能會建議使用ArrayList,它能夠經過建立一個新實例,而後把舊實例中全部的引用到移到新實例中,從而實現更多空間的自動分配。儘管一般應該首選ArrayList而不是數組、可是這種彈性須要開銷,所以,ArrayList的效率比數組低不少。——Thinking in Java 第16章
Java爲了對數據進行空間分配而劃分的5個內存空間
棧區(stack area) | 函數中定義的基本類型變量,對象的引用變量(對象在堆上的地址)都在函數的棧內存中分配。 |
---|---|
棧內存特色,數數據一執行完畢,變量會當即釋放,節約內存空間。 | |
棧內存中的數據,沒有默認初始化值,須要手動設置。 | |
堆區(heap area) | 堆內存用來存放new建立的對象和數組。 |
堆內存中全部的實體都有內存地址值。 | |
堆內存中的實體是用來封裝數據的,這些數據都有默認初始化值。 | |
堆內存中的實體再也不被指向時,JVM啓動垃圾回收機制,自動清除,這也是JAVA優於C++的表現之一(C++中須要程序員手動清除)。 | |
方法區(Method Area) | 存儲全部類(class)和靜態變量(static) |
本地方法區 (Native Method Area) | 後期補充 |
寄存器 | 後期補充 |
(一)遍歷數組
理解:簡單來講就是把數組中的每個元素都讀一遍,你能夠對數組中的每個數進行處理,又或者找到數組中那個你須要的數。
可是有時候就想鴨,每一次個人數組元素數量較少的時候還能夠,我數一數有多少個元素也就知道我須要遍歷多少次了,可是若是數組元素太多呢,又或者我把遍歷數組編寫成一個方法,參數就是一個數組,不一樣的數組(元素數量不一樣),很顯然須要遍歷的次數是不靈活的,因此咱們介紹一個更爲靈活的屬性——length
針對元素數量較多的數組 可使用 length屬性 獲取數組的長度
(二)獲取數組中的最小值或最大值
思路:
從數組中任意找一個元素做爲參照物
而後遍歷其餘的元素
一次獲取和參照物進行比較,若是大就留下來,若是小就離開
(三)數組逆序
JDK 1.5 引進了一種新的循環類型,被稱爲 For-Each 循環或者加強For循環, 它能在不使用下標的狀況下遍歷數組。
格式:
它的功能強大就在於沒必要爲了下標的起始值和終止值而分心,代碼更加簡潔,更不容易出錯。
事物老是有兩面性的,雖然加強for循環帶來了簡潔和快速,可是並非萬能的,有的時候咱們必須使用傳統的for循環,例如不但願遍歷每個元素,或者在循環內部須要使用下標等。
補充:
若是僅僅是想要打印數組中的全部值,咱們能夠利用Arrays類中的toString方法
輸出後格式以下:「[1,3,6,5,6]」
貧窮使我面目全非……〒_〒
假如我想在某寶買一本五年高考,三年模擬(搞笑臉),又擔憂買到的不是正版印刷(再次搞笑),咱們能夠選擇銷量優先展現商品,而咱們又嫌貴又渴望知識的時候(哈哈哈~),咱們又能夠選擇價格從低到高排序展現商品。
那麼,網站是如何作到快速將商品按照某種規則排序的呢?
下面咱們就來介紹幾種常見的排序方法
數組是用來存儲一些數據的「容器」,可能咱們須要將其中的元素,按照咱們必定的規則進行處理,使其成爲有序的序列。
(一)冒泡排序
咱們先經過一個直觀的例子來看一這種排序方法是如何操做的呢
要排序的數組 int[] = {3, 9, 6, 5};
第一趟排序:
第一次排序:3和9比較,3小於9,不交換位置:3 9 6 5
第二次排序:9和6比較,9大於6,交換位置:3 6 9 5
第二次排序:9和5比較,9大於5,交換位置:3 6 5 9
————————————————————————————
第二趟排序:
第一次排序:3和6比較,3小於6,不交換位置:3 6 5 9
第二次排序:6和5比較,6大於5,交換位置:3 5 6 9
————————————————————————————
第三趟排序:
第一次排序:3和5比較,3小於5,不交換位置:3 5 6 9
根據上圖的規律,咱們獲得了冒泡排序的原理:
重複地走訪要排列的元素列,一次比較兩個相鄰的元素,若是它們的順序錯誤則交換
走訪元素的工做是重複地進行直到沒有相鄰元素須要交換,也就是說該元素列已經排序 完成。
爲了理解這個看起來很複雜的定義,咱們來梳理一下上面的例子:
第一趟:通過三次排序,獲得結果:3 6 5 9
第二趟:通過兩次排序,獲得結果:3 5 6 9
第三趟:通過一次排序,獲得結果:3 6 5 9
(第三趟也是存在的只不過是,在第二趟的時候結果已經符合規定,)
咱們經過梳理能夠看到
咱們在第一趟中,4個數字,經歷了3次排序,肯定了最大值
在第二趟中,3個數字(最後一位已經肯定,因此不計),經歷了2次排序,肯定了最大值
在第三趟中,2個數字(倒數兩位已經肯定,因此不計),經歷了1次排序,肯定了最大值
慢慢的最大值或者最小值(根據排序規則)會像氣泡同樣浮到數列的頂端,故得名冒泡排序
思路
1:外層循環:控制它要走幾回。
假設你有5個數,那就要走4次,最後一次不用走,最後那個數已 經在它位置了因此就要length-1次。
2:內層循環:控制逐一比較,若是發現前一個數比後一個數大,則交換。
注意!由於越比較長度就越小了,因此長度要length-1-i。
因此:n個元素進行排序,咱們須要進行n-1 趟,每一趟循環 lenght-1-i次
Ps:length-1表明最後一項,數組下標從0開始
冒泡排序只是咱們衆多排序中的一種比較簡單的方法(效率不是很高,但入門必須學習)
其餘的排序方法,咱們放到板塊數據結構與算法中詳細講解
要想對數值型數組進行排序,可使用Array類中的sort方法
格式:int[] arr = new int [520];
........
Array.sort(arr)
sort方法本質是快速排序算法(高效快速)
具備兩個下標的數組稱爲二維數組。有些數據要依賴於兩個因素才能唯一地肯定
例如咱們下面的這個案例一個班級有三個學生,每一個學生又對應四科成績,因此咱們必須用一個二維數組來存儲,第一項儲存學生信息,第二項存儲成績信息
Student Number | Course1 | Course2 | Course3 | Course4 |
---|---|---|---|---|
Student1 | 55 | 66 | 58 | 77 |
Student2 | 87 | 58 | 48 | 64 |
Student3 | 65 | 78 | 70 | 56 |
Java中,二維數組中元素排列的順序是:
定義格式:
A:
B:
從最高維開始,分別爲每一維分配空間
若是想要在定義的時候就直接賦值,格式見例題中的示例
(一)遍歷二維數組
(一)普通for循環版
(二)加強for循環版
(三)Arrays類中的deepToString()方法
這個方法能夠快速 打印一個二維數組的數據元素列表
(二)輸出楊輝三角
開局一張圖,內容全靠編~
有了前面知識的一些鋪墊,咱們終於能夠引出這個問題了,諾,下面題目中利用方法重載給出了兩個不一樣參數的change方法,分別在主函數中輸出調用方法前和後的數據,看一看輸出的數據和咱們所想的同樣嗎?
小白:變量a和b在change方法中已經被從新賦值了,第二局輸出那必然是 a=20, b=40
大佬:錯!錯!錯!正確結果爲輸出 a=10, b=20小白:雖然我也不太明白,可是有了第一個的經驗,那我第二個我還不會嗎,arr[1] 固然是2了
大佬:em......答案是4.......
(絕望臉...)
而後咱們經過一張圖來分析一下這個問題
解釋:
當基本類型做爲形式參數的時候,實際參數(也就是主方法中的10和20)的值傳到了 這個方法中,不管其如何操做運算,均只是對被傳入的值進行操做,方法結束後即消失, 不會對實際參數有任何的影響
當引用類型做爲形式參數的時候,實際參數和形式參數均指向了同一個地址,因此形式 參數的改變會直接影響到實際參數
總結:
基本類型:形式參數的改變對實際參數沒有影響
引用類型:形式參數的改變直接影響實際參數
加密規則: 將數據倒序,而後將每位數字都加上5,再用和除以10的餘數 代替該數字,最後將第一位和最後一位數字交換
若是內容中有什麼不足,或者錯誤的地方,歡迎你們給我留言提出意見, 蟹蟹你們 !^_^
若是能幫到你的話,那就來關注我吧!
在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤一個堅持推送原創Java技術的公衆號:理想二旬不止