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