摘要:數組就是一個簡單的線性序列,這使得元素訪問非常快速。堆區堆內存用來存放創建的對象和數組。堆內存中的實體不再被指向時,啟動垃圾回收機制,自動清除,這也是優于的表現之一中需要程序員手動清除。
第三章 方法和數組 3.1 概述
還記得我們的HelloWorld例程嗎?我們現在對于輸出語句應該已經很熟悉了,
解釋:
System 是系統類。
out 是標準輸出對象
println() 是一個方法。
如果我們想要在一個類中實現很多功能,但是如果我們想要,多次使用,某一個功能,顯然我們需要重復書寫這個功能的代碼多次,顯然,這是不明智的。所以方法就來拯救我們了。
定義:方法是定義在類中的一段獨立的代碼塊,用來實現某個功能。
其實我們在編程界中更喜歡叫它們為函數,但是在Java中我們也可以叫做方法
作用:
·函數的主要作用是為了提高代碼的復用性。
·使程序簡短而清晰,更加利于維護
A:修飾符: public static (暫時了解這一個 后期補充)
B:返回值類型: 就是功能結果的數據類型
有一些方法執行代碼中的命令即可,執行后就可以結束了,并沒有返回值(void)
有一些方法需要將最后的結果返回給你,從而讓開發者使用這個結果
</>復制代碼
舉例更好理解哦:最近有一場周杰倫的演唱會,我通過好多朋友幫忙一起的搶票方法,最后得到了兩張票,這兩張票就是“搶票”方>法的返回值,我(開發者)可以對這個返回值進行任何操作,例如自己去看,或者送給朋友,甚至可以用來當草稿紙(哭...)
C:參數類型:參數的數據類型
主方法可以調用其他方法,其他方法可以互相調用,但不能調用主方法,主函數是系統調用的。
A:多帶帶使用,一般來說沒有意義(不代表有錯),所以不推薦
B:輸出調用,但是不夠好,因為我們可能需要針對結果進行進一步操作
C:賦值語句,推薦方案。
方法的調用優化:
Eg:比較兩個數是否相等(在沒有熟練之前我們仍然推薦使用初始直觀的用法,程序可以正常的跑是我們的底線)
一般來說,我們都是根據作用來命名方法(方法名有意義),但是很多時候會我們會針對不同的數據類型,或者參數個數來進行操作,例如我們所要求幾個數字中的最大值問題(如下圖)就出現了這兩種問題。使用方法重載,既可以保證命名有意義,也可以避免記憶過多的不同名稱
定義:用同一方法名定義多個方法,這些方法的參數個數或者參數類型不同
作用:使一個方法名賦予新的含義,使一個方法名可以多用
適用:實現細節不同的同一類功能時候
理解:其實就是使得一個方法擁有了更多的可能性,一個名稱解決多種問題。
注意:
1. 函數的返回類型不同,但參數個數和類型相同,不是重載
2. 重載函數的的參數個數,參數類型,參數順序至少有一個需要不同
3.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()方法
這個方法可以快速 打印一個二維數組的數據元素列表
(二)輸出楊輝三角
3.3補充問題
開局一張圖,內容全靠編~
有了前面知識的一些鋪墊,我們終于可以引出這個問題了,諾,下面題目中利用方法重載給出了兩個不同參數的change方法,分別在主函數中輸出調用方法前和后的數據,看一看輸出的數據和我們所想的一樣嗎?
</>復制代碼
小白:變量a和b在change方法中已經被重新賦值了,第二局輸出那必然是 a=20, b=40
大佬:錯!錯!錯!正確結果為輸出 a=10, b=20小白:雖然我也不太明白,但是有了第一個的經驗,那我第二個我還不會嗎,arr[1] 當然是2了
大佬:em......答案是4.......
(絕望臉...)
然后我們通過一張圖來分析一下這個問題
解釋:
當基本類型作為形式參數的時候,實際參數(也就是主方法中的10和20)的值傳到了 這個方法中,無論其如何操作運算,均只是對被傳入的值進行操作,方法結束后即消失, 不會對實際參數有任何的影響
當引用類型作為形式參數的時候,實際參數和形式參數均指向了同一個地址,所以形式 參數的改變會直接影響到實際參數
總結:
基本類型:形式參數的改變對實際參數沒有影響
引用類型:形式參數的改變直接影響實際參數
加密規則: 將數據倒序,然后將每位數字都加上5,再用和除以10的余數 代替該數字,最后將第一位和最后一位數字交換
結尾:如果內容中有什么不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^
如果能幫到你的話,那就來關注我吧!
</>復制代碼
在這里的我們素不相識,卻都在為了自己的夢而努力 ?
一個堅持推送原創Java技術的公眾號:理想二旬不止
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74649.html
摘要:線程不安全底層數據結構是鏈表。的默認初始化容量是,每次擴容時候增加原先容量的一半,也就是變為原來的倍刪除元素時不會減少容量,若希望減少容量則調用它不是線程安全的。 前言 聲明,本文用得是jdk1.8 前一篇已經講了Collection的總覽:Collection總覽,介紹了一些基礎知識。 現在這篇主要講List集合的三個子類: ArrayList 底層數據結構是數組。線程不安全 ...
摘要:選擇排序就這么簡單從上一篇已經講解了冒泡排序了,本章主要講解的是選擇排序,希望大家看完能夠理解并手寫出選擇排序的代碼,然后就通過面試了如果我寫得有錯誤的地方也請大家在評論下指出。 選擇排序就這么簡單 從上一篇已經講解了冒泡排序了,本章主要講解的是選擇排序,希望大家看完能夠理解并手寫出選擇排序的代碼,然后就通過面試了!如果我寫得有錯誤的地方也請大家在評論下指出。 選擇排序介紹和穩定性說明...
前言 聲明,本文用得是jdk1.8 前面已經講了Collection的總覽和剖析List集合以及散列表、Map集合、紅黑樹的基礎了: Collection總覽 List集合就這么簡單【源碼剖析】 Map集合、散列表、紅黑樹介紹 本篇主要講解HashMap,以及涉及到一些與hashtable的比較~ 看這篇文章之前最好是有點數據結構的基礎: Java實現單向鏈表 棧和隊列就是這么簡單 二叉樹就...
摘要:那么,有了循環,為什么還要用遞歸呢在某些情況下費波納切數列,漢諾塔,使用遞歸會比循環簡單很多很多話說多了也無益,讓我們來感受一下遞歸吧。 遞歸介紹 本來預算此章節是繼續寫快速排序的,然而編寫快速排序往往是遞歸來寫的,并且遞歸可能不是那么好理解,于是就有了這篇文章。 在上面提到了遞歸這么一個詞,遞歸在程序語言中簡單的理解是:方法自己調用自己 遞歸其實和循環是非常像的,循環都可以改寫成遞歸...
摘要:一前言上一篇已經講過了鏈表實現單向鏈表了,它跟數組都是線性結構的基礎,本文主要講解線性結構的應用棧和隊列如果寫錯的地方希望大家能夠多多體諒并指正哦,如果有更好的理解的方式也希望能夠在評論下留言,讓大家學習學習二數據結構棧就是這么簡單數據結構 一、前言 上一篇已經講過了鏈表【Java實現單向鏈表】了,它跟數組都是線性結構的基礎,本文主要講解線性結構的應用:棧和隊列 如果寫錯的地方希望大家...
閱讀 832·2021-11-22 11:59
閱讀 3249·2021-11-17 09:33
閱讀 2319·2021-09-29 09:34
閱讀 1948·2021-09-22 15:25
閱讀 1967·2019-08-30 15:55
閱讀 1329·2019-08-30 15:55
閱讀 539·2019-08-30 15:53
閱讀 3353·2019-08-29 13:55