摘要:數(shù)組就是一個(gè)簡(jiǎn)單的線性序列,這使得元素訪問(wèn)非常快速。堆區(qū)堆內(nèi)存用來(lái)存放創(chuàng)建的對(duì)象和數(shù)組。堆內(nèi)存中的實(shí)體不再被指向時(shí),啟動(dòng)垃圾回收機(jī)制,自動(dòng)清除,這也是優(yōu)于的表現(xiàn)之一中需要程序員手動(dòng)清除。
第三章 方法和數(shù)組 3.1 概述
還記得我們的HelloWorld例程嗎?我們現(xiàn)在對(duì)于輸出語(yǔ)句應(yīng)該已經(jīng)很熟悉了,
解釋:
System 是系統(tǒng)類。
out 是標(biāo)準(zhǔn)輸出對(duì)象
println() 是一個(gè)方法。
如果我們想要在一個(gè)類中實(shí)現(xiàn)很多功能,但是如果我們想要,多次使用,某一個(gè)功能,顯然我們需要重復(fù)書寫這個(gè)功能的代碼多次,顯然,這是不明智的。所以方法就來(lái)拯救我們了。
定義:方法是定義在類中的一段獨(dú)立的代碼塊,用來(lái)實(shí)現(xiàn)某個(gè)功能。
其實(shí)我們?cè)诰幊探缰懈矚g叫它們?yōu)楹瘮?shù),但是在Java中我們也可以叫做方法
作用:
·函數(shù)的主要作用是為了提高代碼的復(fù)用性。
·使程序簡(jiǎn)短而清晰,更加利于維護(hù)
A:修飾符: public static (暫時(shí)了解這一個(gè) 后期補(bǔ)充)
B:返回值類型: 就是功能結(jié)果的數(shù)據(jù)類型
有一些方法執(zhí)行代碼中的命令即可,執(zhí)行后就可以結(jié)束了,并沒(méi)有返回值(void)
有一些方法需要將最后的結(jié)果返回給你,從而讓開發(fā)者使用這個(gè)結(jié)果
舉例更好理解哦:最近有一場(chǎng)周杰倫的演唱會(huì),我通過(guò)好多朋友幫忙一起的搶票方法,最后得到了兩張票,這兩張票就是“搶票”方>法的返回值,我(開發(fā)者)可以對(duì)這個(gè)返回值進(jìn)行任何操作,例如自己去看,或者送給朋友,甚至可以用來(lái)當(dāng)草稿紙(哭...)
C:參數(shù)類型:參數(shù)的數(shù)據(jù)類型
主方法可以調(diào)用其他方法,其他方法可以互相調(diào)用,但不能調(diào)用主方法,主函數(shù)是系統(tǒng)調(diào)用的。
A:多帶帶使用,一般來(lái)說(shuō)沒(méi)有意義(不代表有錯(cuò)),所以不推薦
B:輸出調(diào)用,但是不夠好,因?yàn)槲覀兛赡苄枰槍?duì)結(jié)果進(jìn)行進(jìn)一步操作
C:賦值語(yǔ)句,推薦方案。
方法的調(diào)用優(yōu)化:
Eg:比較兩個(gè)數(shù)是否相等(在沒(méi)有熟練之前我們?nèi)匀煌扑]使用初始直觀的用法,程序可以正常的跑是我們的底線)
一般來(lái)說(shuō),我們都是根據(jù)作用來(lái)命名方法(方法名有意義),但是很多時(shí)候會(huì)我們會(huì)針對(duì)不同的數(shù)據(jù)類型,或者參數(shù)個(gè)數(shù)來(lái)進(jìn)行操作,例如我們所要求幾個(gè)數(shù)字中的最大值問(wèn)題(如下圖)就出現(xiàn)了這兩種問(wèn)題。使用方法重載,既可以保證命名有意義,也可以避免記憶過(guò)多的不同名稱
定義:用同一方法名定義多個(gè)方法,這些方法的參數(shù)個(gè)數(shù)或者參數(shù)類型不同
作用:使一個(gè)方法名賦予新的含義,使一個(gè)方法名可以多用
適用:實(shí)現(xiàn)細(xì)節(jié)不同的同一類功能時(shí)候
理解:其實(shí)就是使得一個(gè)方法擁有了更多的可能性,一個(gè)名稱解決多種問(wèn)題。
注意:
1. 函數(shù)的返回類型不同,但參數(shù)個(gè)數(shù)和類型相同,不是重載
2. 重載函數(shù)的的參數(shù)個(gè)數(shù),參數(shù)類型,參數(shù)順序至少有一個(gè)需要不同
3.2數(shù)組引文:我們?cè)诨@球場(chǎng)比賽中,夢(mèng)之隊(duì)運(yùn)動(dòng)員共有10名,我們分別將每個(gè)人定義為幾號(hào)運(yùn)動(dòng)員,這樣我們找某一個(gè)人的時(shí)候,我們就會(huì)先找到夢(mèng)之隊(duì)這支隊(duì)伍,然后去找對(duì)應(yīng)編號(hào)的人。
而數(shù)組就像這只隊(duì)伍的概念一樣,而數(shù)組中的每一個(gè)元素就是每一個(gè)球員,當(dāng)你需要找數(shù)組的某一個(gè)元素的時(shí)候,只需要找到你需要查找的數(shù)組(夢(mèng)之隊(duì)),再根據(jù)數(shù)組下標(biāo)(對(duì)應(yīng)編號(hào))去尋找對(duì)應(yīng)元素(球員)。
這樣做的好處就是,我們將一批同類型的元素整理歸納到了一起,并且標(biāo)號(hào)記錄。
既方便了查找與使用,又避免了定義多個(gè)變量的麻煩。
概念:以存儲(chǔ)一個(gè)固定大小的相同類型元素的順序集合。
數(shù)組是用來(lái)存儲(chǔ)一系列數(shù)據(jù),但它往往被認(rèn)為是一系列相同類型的變量。
(所有的數(shù)組都是由連續(xù)的內(nèi)存位置組成)
格式:
第一種讀法:定義一個(gè) dataType類型的數(shù)組 arrayRefvar 變量
第一種可以認(rèn)為是java風(fēng)格的定義格式,推薦第一種,不過(guò)也只是編程風(fēng)格不同罷了。
初始化:
A:概念:為數(shù)組開辟內(nèi)存空間,為每個(gè)數(shù)組元素賦予值(內(nèi)存分配問(wèn)題就在下面哦)
B:方式:
a:動(dòng)態(tài)初始化 → 只指定長(zhǎng)度,由系統(tǒng)給出初始化值
b: 靜態(tài)初始化 → 給出初始化值,由系統(tǒng)決定長(zhǎng)度
A:動(dòng)態(tài)初始化格式:
數(shù)據(jù)類型 [] 數(shù)組名 = new 數(shù)據(jù)類型 [數(shù)組長(zhǎng)度];
Eg: int [] arr = new int [3];
B:靜態(tài)初始化格式:
數(shù)據(jù)類型 [] 數(shù)組名 = new 數(shù)據(jù)類型 [] {元素1,元素2,...};
Eg:int [] arr = new int [] {1,2,3};
簡(jiǎn)化格式:
數(shù)據(jù)類型 [] 數(shù)組名 = {元素1,元素2,...};
Eg:int [] arr = {1,2,3};
數(shù)組的訪問(wèn):
數(shù)組的元素是通過(guò)索引訪問(wèn)的。數(shù)組索引從 0 開始,所以索引值從 0 到 數(shù)組長(zhǎng)度-1。(這只球隊(duì)可是有0號(hào)選手的哦吼~)
進(jìn)階補(bǔ)充知識(shí):
在Java中,數(shù)組是一種效率最高的存儲(chǔ)和隨機(jī)訪問(wèn)對(duì)象的引用序列的方式。數(shù)組就是一個(gè)簡(jiǎn)單的線性序列,這使得元素訪問(wèn)非常快速。但是為這種速度所付出的代價(jià)是數(shù)組對(duì)象的大小被固定,并且在其生命周期中不可改變。你可能會(huì)建議使用ArrayList,它可以通過(guò)創(chuàng)建一個(gè)新實(shí)例,然后把舊實(shí)例中所有的引用到移到新實(shí)例中,從而實(shí)現(xiàn)更多空間的自動(dòng)分配。盡管通常應(yīng)該首選ArrayList而不是數(shù)組、但是這種彈性需要開銷,因此,ArrayList的效率比數(shù)組低很多。——Thinking in Java 第16章
Java為了對(duì)數(shù)據(jù)進(jìn)行空間分配而劃分的5個(gè)內(nèi)存空間
棧區(qū)(stack area) | 函數(shù)中定義的基本類型變量,對(duì)象的引用變量(對(duì)象在堆上的地址)都在函數(shù)的棧內(nèi)存中分配。 |
---|---|
棧內(nèi)存特點(diǎn),數(shù)數(shù)據(jù)一執(zhí)行完畢,變量會(huì)立即釋放,節(jié)約內(nèi)存空間。 | |
棧內(nèi)存中的數(shù)據(jù),沒(méi)有默認(rèn)初始化值,需要手動(dòng)設(shè)置。 | |
堆區(qū)(heap area) | 堆內(nèi)存用來(lái)存放new創(chuàng)建的對(duì)象和數(shù)組。 |
堆內(nèi)存中所有的實(shí)體都有內(nèi)存地址值。 | |
堆內(nèi)存中的實(shí)體是用來(lái)封裝數(shù)據(jù)的,這些數(shù)據(jù)都有默認(rèn)初始化值。 | |
堆內(nèi)存中的實(shí)體不再被指向時(shí),JVM啟動(dòng)垃圾回收機(jī)制,自動(dòng)清除,這也是JAVA優(yōu)于C++的表現(xiàn)之一(C++中需要程序員手動(dòng)清除)。 | |
方法區(qū)(Method Area) | 存儲(chǔ)所有類(class)和靜態(tài)變量(static) |
本地方法區(qū) (Native Method Area) | 后期補(bǔ)充 |
寄存器 | 后期補(bǔ)充 |
(一)遍歷數(shù)組
理解:簡(jiǎn)單來(lái)說(shuō)就是把數(shù)組中的每一個(gè)元素都讀一遍,你可以對(duì)數(shù)組中的每一個(gè)數(shù)進(jìn)行處理,又或者找到數(shù)組中那個(gè)你需要的數(shù)。
但是有時(shí)候就想鴨,每一次我的數(shù)組元素?cái)?shù)量較少的時(shí)候還可以,我數(shù)一數(shù)有多少個(gè)元素也就知道我需要遍歷多少次了,但是如果數(shù)組元素太多呢,又或者我把遍歷數(shù)組編寫成一個(gè)方法,參數(shù)就是一個(gè)數(shù)組,不同的數(shù)組(元素?cái)?shù)量不同),很顯然需要遍歷的次數(shù)是不靈活的,所以我們介紹一個(gè)更為靈活的屬性——length
針對(duì)元素?cái)?shù)量較多的數(shù)組 可以使用 length屬性 獲取數(shù)組的長(zhǎng)度
(二)獲取數(shù)組中的最小值或最大值
思路:
從數(shù)組中任意找一個(gè)元素作為參照物
然后遍歷其他的元素
一次獲取和參照物進(jìn)行比較,如果大就留下來(lái),如果小就離開
(三)數(shù)組逆序
JDK 1.5 引進(jìn)了一種新的循環(huán)類型,被稱為 For-Each 循環(huán)或者增強(qiáng)For循環(huán), 它能在不使用下標(biāo)的情況下遍歷數(shù)組。
格式:
它的功能強(qiáng)大就在于不必為了下標(biāo)的起始值和終止值而分心,代碼更加簡(jiǎn)潔,更不容易出錯(cuò)。
事物總是有兩面性的,雖然增強(qiáng)for循環(huán)帶來(lái)了簡(jiǎn)潔和快速,但是并不是萬(wàn)能的,有的時(shí)候我們必須使用傳統(tǒng)的for循環(huán),例如不希望遍歷每一個(gè)元素,或者在循環(huán)內(nèi)部需要使用下標(biāo)等。
補(bǔ)充:
如果僅僅是想要打印數(shù)組中的所有值,我們可以利用Arrays類中的toString方法
輸出后格式如下:“[1,3,6,5,6]”
貧窮使我面目全非……〒_〒
假如我想在某寶買一本五年高考,三年模擬(搞笑臉),又擔(dān)心買到的不是正版印刷(再次搞笑),我們可以選擇銷量?jī)?yōu)先展示商品,而我們又嫌貴又渴望知識(shí)的時(shí)候(哈哈哈~),我們又可以選擇價(jià)格從低到高排序展示商品。
那么,網(wǎng)站是如何做到快速將商品按照某種規(guī)則排序的呢?
下面我們就來(lái)介紹幾種常見(jiàn)的排序方法
數(shù)組是用來(lái)存儲(chǔ)一些數(shù)據(jù)的“容器”,可能我們需要將其中的元素,按照我們一定的規(guī)則進(jìn)行處理,使其成為有序的序列。
(一)冒泡排序
我們先通過(guò)一個(gè)直觀的例子來(lái)看一這種排序方法是如何操作的呢
要排序的數(shù)組 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
根據(jù)上圖的規(guī)律,我們得到了冒泡排序的原理:
重復(fù)地走訪要排列的元素列,一次比較兩個(gè)相鄰的元素,如果它們的順序錯(cuò)誤則交換
走訪元素的工作是重復(fù)地進(jìn)行直到?jīng)]有相鄰元素需要交換,也就是說(shuō)該元素列已經(jīng)排序 完成。
為了理解這個(gè)看起來(lái)很復(fù)雜的定義,我們來(lái)梳理一下上面的例子:
第一趟:經(jīng)過(guò)三次排序,得到結(jié)果:3 6 5 9
第二趟:經(jīng)過(guò)兩次排序,得到結(jié)果:3 5 6 9
第三趟:經(jīng)過(guò)一次排序,得到結(jié)果:3 6 5 9
(第三趟也是存在的只不過(guò)是,在第二趟的時(shí)候結(jié)果已經(jīng)符合規(guī)定,)
我們通過(guò)梳理可以看到
我們?cè)诘谝惶酥校?個(gè)數(shù)字,經(jīng)歷了3次排序,確定了最大值
在第二趟中,3個(gè)數(shù)字(最后一位已經(jīng)確定,所以不計(jì)),經(jīng)歷了2次排序,確定了最大值
在第三趟中,2個(gè)數(shù)字(倒數(shù)兩位已經(jīng)確定,所以不計(jì)),經(jīng)歷了1次排序,確定了最大值
慢慢的最大值或者最小值(根據(jù)排序規(guī)則)會(huì)像氣泡一樣浮到數(shù)列的頂端,故得名冒泡排序
思路
1:外層循環(huán):控制它要走幾次。
假設(shè)你有5個(gè)數(shù),那就要走4次,最后一次不用走,最后那個(gè)數(shù)已 經(jīng)在它位置了所以就要length-1次。
2:內(nèi)層循環(huán):控制逐一比較,如果發(fā)現(xiàn)前一個(gè)數(shù)比后一個(gè)數(shù)大,則交換。
注意!因?yàn)樵奖容^長(zhǎng)度就越小了,所以長(zhǎng)度要length-1-i。
所以:n個(gè)元素進(jìn)行排序,我們需要進(jìn)行n-1 趟,每一趟循環(huán) lenght-1-i次
Ps:length-1代表最后一項(xiàng),數(shù)組下標(biāo)從0開始
冒泡排序只是我們眾多排序中的一種比較簡(jiǎn)單的方法(效率不是很高,但入門必須學(xué)習(xí))
其他的排序方法,我們放到板塊數(shù)據(jù)結(jié)構(gòu)與算法中詳細(xì)講解
要想對(duì)數(shù)值型數(shù)組進(jìn)行排序,可以使用Array類中的sort方法
格式:int[] arr = new int [520];
........
Array.sort(arr)
sort方法本質(zhì)是快速排序算法(高效快速)
具有兩個(gè)下標(biāo)的數(shù)組稱為二維數(shù)組。有些數(shù)據(jù)要依賴于兩個(gè)因素才能惟一地確定
例如我們下面的這個(gè)案例一個(gè)班級(jí)有三個(gè)學(xué)生,每個(gè)學(xué)生又對(duì)應(yīng)四科成績(jī),所以我們必須用一個(gè)二維數(shù)組來(lái)存儲(chǔ),第一項(xiàng)儲(chǔ)存學(xué)生信息,第二項(xiàng)存儲(chǔ)成績(jī)信息
Student Number | Course1 | Course2 | Course3 | Course4 |
---|---|---|---|---|
Student1 | 55 | 66 | 58 | 77 |
Student2 | 87 | 58 | 48 | 64 |
Student3 | 65 | 78 | 70 | 56 |
Java中,二維數(shù)組中元素排列的順序是:
定義格式:
A:
B:
從最高維開始,分別為每一維分配空間
如果想要在定義的時(shí)候就直接賦值,格式見(jiàn)例題中的示例
(一)遍歷二維數(shù)組
(一)普通for循環(huán)版
(二)增強(qiáng)for循環(huán)版
(三)Arrays類中的deepToString()方法
這個(gè)方法可以快速 打印一個(gè)二維數(shù)組的數(shù)據(jù)元素列表
(二)輸出楊輝三角
3.3補(bǔ)充問(wèn)題
開局一張圖,內(nèi)容全靠編~
有了前面知識(shí)的一些鋪墊,我們終于可以引出這個(gè)問(wèn)題了,諾,下面題目中利用方法重載給出了兩個(gè)不同參數(shù)的change方法,分別在主函數(shù)中輸出調(diào)用方法前和后的數(shù)據(jù),看一看輸出的數(shù)據(jù)和我們所想的一樣嗎?
小白:變量a和b在change方法中已經(jīng)被重新賦值了,第二局輸出那必然是 a=20, b=40
大佬:錯(cuò)!錯(cuò)!錯(cuò)!正確結(jié)果為輸出 a=10, b=20小白:雖然我也不太明白,但是有了第一個(gè)的經(jīng)驗(yàn),那我第二個(gè)我還不會(huì)嗎,arr[1] 當(dāng)然是2了
大佬:em......答案是4.......
(絕望臉...)
然后我們通過(guò)一張圖來(lái)分析一下這個(gè)問(wèn)題
解釋:
當(dāng)基本類型作為形式參數(shù)的時(shí)候,實(shí)際參數(shù)(也就是主方法中的10和20)的值傳到了 這個(gè)方法中,無(wú)論其如何操作運(yùn)算,均只是對(duì)被傳入的值進(jìn)行操作,方法結(jié)束后即消失, 不會(huì)對(duì)實(shí)際參數(shù)有任何的影響
當(dāng)引用類型作為形式參數(shù)的時(shí)候,實(shí)際參數(shù)和形式參數(shù)均指向了同一個(gè)地址,所以形式 參數(shù)的改變會(huì)直接影響到實(shí)際參數(shù)
總結(jié):
基本類型:形式參數(shù)的改變對(duì)實(shí)際參數(shù)沒(méi)有影響
引用類型:形式參數(shù)的改變直接影響實(shí)際參數(shù)
加密規(guī)則: 將數(shù)據(jù)倒序,然后將每位數(shù)字都加上5,再用和除以10的余數(shù) 代替該數(shù)字,最后將第一位和最后一位數(shù)字交換
結(jié)尾:如果內(nèi)容中有什么不足,或者錯(cuò)誤的地方,歡迎大家給我留言提出意見(jiàn), 蟹蟹大家 !^_^
如果能幫到你的話,那就來(lái)關(guān)注我吧!
在這里的我們素不相識(shí),卻都在為了自己的夢(mèng)而努力 ?一個(gè)堅(jiān)持推送原創(chuàng)Java技術(shù)的公眾號(hào):理想二旬不止
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/74649.html
摘要:線程不安全底層數(shù)據(jù)結(jié)構(gòu)是鏈表。的默認(rèn)初始化容量是,每次擴(kuò)容時(shí)候增加原先容量的一半,也就是變?yōu)樵瓉?lái)的倍刪除元素時(shí)不會(huì)減少容量,若希望減少容量則調(diào)用它不是線程安全的。 前言 聲明,本文用得是jdk1.8 前一篇已經(jīng)講了Collection的總覽:Collection總覽,介紹了一些基礎(chǔ)知識(shí)。 現(xiàn)在這篇主要講List集合的三個(gè)子類: ArrayList 底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組。線程不安全 ...
摘要:選擇排序就這么簡(jiǎn)單從上一篇已經(jīng)講解了冒泡排序了,本章主要講解的是選擇排序,希望大家看完能夠理解并手寫出選擇排序的代碼,然后就通過(guò)面試了如果我寫得有錯(cuò)誤的地方也請(qǐng)大家在評(píng)論下指出。 選擇排序就這么簡(jiǎn)單 從上一篇已經(jīng)講解了冒泡排序了,本章主要講解的是選擇排序,希望大家看完能夠理解并手寫出選擇排序的代碼,然后就通過(guò)面試了!如果我寫得有錯(cuò)誤的地方也請(qǐng)大家在評(píng)論下指出。 選擇排序介紹和穩(wěn)定性說(shuō)明...
前言 聲明,本文用得是jdk1.8 前面已經(jīng)講了Collection的總覽和剖析List集合以及散列表、Map集合、紅黑樹的基礎(chǔ)了: Collection總覽 List集合就這么簡(jiǎn)單【源碼剖析】 Map集合、散列表、紅黑樹介紹 本篇主要講解HashMap,以及涉及到一些與hashtable的比較~ 看這篇文章之前最好是有點(diǎn)數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ): Java實(shí)現(xiàn)單向鏈表 棧和隊(duì)列就是這么簡(jiǎn)單 二叉樹就...
摘要:那么,有了循環(huán),為什么還要用遞歸呢在某些情況下費(fèi)波納切數(shù)列,漢諾塔,使用遞歸會(huì)比循環(huán)簡(jiǎn)單很多很多話說(shuō)多了也無(wú)益,讓我們來(lái)感受一下遞歸吧。 遞歸介紹 本來(lái)預(yù)算此章節(jié)是繼續(xù)寫快速排序的,然而編寫快速排序往往是遞歸來(lái)寫的,并且遞歸可能不是那么好理解,于是就有了這篇文章。 在上面提到了遞歸這么一個(gè)詞,遞歸在程序語(yǔ)言中簡(jiǎn)單的理解是:方法自己調(diào)用自己 遞歸其實(shí)和循環(huán)是非常像的,循環(huán)都可以改寫成遞歸...
摘要:一前言上一篇已經(jīng)講過(guò)了鏈表實(shí)現(xiàn)單向鏈表了,它跟數(shù)組都是線性結(jié)構(gòu)的基礎(chǔ),本文主要講解線性結(jié)構(gòu)的應(yīng)用棧和隊(duì)列如果寫錯(cuò)的地方希望大家能夠多多體諒并指正哦,如果有更好的理解的方式也希望能夠在評(píng)論下留言,讓大家學(xué)習(xí)學(xué)習(xí)二數(shù)據(jù)結(jié)構(gòu)棧就是這么簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu) 一、前言 上一篇已經(jīng)講過(guò)了鏈表【Java實(shí)現(xiàn)單向鏈表】了,它跟數(shù)組都是線性結(jié)構(gòu)的基礎(chǔ),本文主要講解線性結(jié)構(gòu)的應(yīng)用:棧和隊(duì)列 如果寫錯(cuò)的地方希望大家...
閱讀 994·2021-11-22 11:59
閱讀 3398·2021-11-17 09:33
閱讀 2577·2021-09-29 09:34
閱讀 2109·2021-09-22 15:25
閱讀 2085·2019-08-30 15:55
閱讀 1452·2019-08-30 15:55
閱讀 666·2019-08-30 15:53
閱讀 3496·2019-08-29 13:55