20172325 2018-2019-1 《Java程序設計》第二周學習總結
教材學習內容總結
3.1集合
- 集合是一種聚集、組織了其他對象的對象。集合可以分為兩大類:線性集合和非線性集合。
- 線性集合:一種其元素按照直線方式組織的集合。
- 非線性集合:一種其元素按某種非直線方式組織的集合。
- 集合中元素的彼此之間的組織形式通常由元素添加到集合的次序和元素自身的一些內在關系決定。
- 抽象數據類型(ADT):是一種在程序設計語言中尚未定義其值和操作的數據結構類型。ADT的抽象性體現在,ADT必須對實現細節進行定義,且這些對用戶是不可見的。
- Java集合API(應用程序編程接口):一個類集,表示了一些特定類型的集合,這些類的實現方式各不相同。
3.2棧集合
- 棧(STACK)是一種線性集合,其元素的添加和刪除都是在同一端進行的。其遵循后進先出(LIFO)原則,可顛倒順序。
- 棧的基本操作
- 操作:描述
push:添加一個元素到棧的頂部
pop:從棧的頂部移出一個元素
peek:查看棧頂部的元素
isempty:確定棧是否為空
size:確定棧的元素數目
3.3主要的面向對象概念
- 利用多態引用和繼承,可以創建可以儲存任意類型的對象的集合。
- 多態引用是一個引用變量,他可以在不同地點引用不同類型的對象。術語“多態性”可定義為“具有多種形式”。通過多態引用調用的某個方法,在每次調用的時候都可以發生變化。
- 繼承可用于創建一個類層次,一個引用變量可用于指向與之相關的任意對象。繼承就是從已有類派生出一個新類的過程。新類自動地含有初始類的部分和全部變量和方法。
- 泛型提供了編譯時類型安全檢測機制,該機制允許程序員在編譯時檢測到非法的類型。泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。
3.4使用棧計算后綴表達式
- 由棧提供的操作與后綴表達式計算過程有著很好的一致性。使用棧來計算后綴表達式的算法描述如下:從左到右掃描表達式,依次識別出每個符號(操作符或操作數)。如果是操作數,就將其壓入(push)棧中。若是操作符,則從棧中彈出(pop)兩個操作數,并把先彈出數放在符號右側,后彈出數放在符號左側進行計算,然后把計算結果壓入(push)到棧中,循環往復,當進行到表達式的末尾時,棧中所剩余的元素便是該表達式的結果。
- javadoc注釋(為Java添加注釋的官方標準):以/**開始、以 */結束。Javadoc可用于創建關于類集的在線的HTML文檔,在線的JavaAPI文檔就是例子。
3.6棧ADT
- Java接口定義了一個抽象方法集,有助于把抽象數據類型的概念與其實現分開。
public interface stackADT <T>
3.7用數組實現棧
- 數組中的單元數量稱為容量,該值儲存在數組的length常量中,數組一旦創建好,其容量是不能改變的。
3.8ArrayStack類
- 泛型(包括泛型數組)不能被實例化。所以我們必須創建一個存儲Object引用的數組,然后把他轉換成泛型數組。
- 在將Object數組轉換成泛型數組時一定會出現未檢驗類型轉換警告,所以加上@SuppressWarnings(“unchecked”)即可。
- push、pop、peek、isempty、size等方法的具體使用。
4.1鏈接作為引用
- 對象引用變量可以用來創建鏈式結構,鏈式結構是一種數據結構
- 對象引用變量存放的是對象的地址,表示對象在內存中的存儲位置
- 在鏈表中存儲的對象通常泛稱為該鏈表的結點,注:需要一個單獨的引用變量來表示鏈表的首結點,鏈表終止于其next引用為空的結點
4.2管理鏈表
- 對于管理鏈表時,進行刪除和插入的方式的順序是很重要的,如果不當,會將出現某段結點消失的情況
改變引用順序是維護鏈表的關鍵
4.3無鏈接的元素
- 存儲在集合中的對象不應該含有基本數據結構的任何實現細節
4.4JavaAPI中的棧
- java.util.Stack類是從Vector派生而來的,它帶給了棧一些不恰當的操作。
4.5使用棧來穿越迷宮
- 這一節是迷宮的類型。說明的是:可以用棧來模擬遞歸處理,以跟蹤恰當的數據
教材學習中的問題和解決過程
- 問題1:在做選擇排序和冒泡排序的時候對于冒泡排序法完全沒了印象
- 問題1解決方案:
冒泡排序:
原理:比較兩個相鄰的元素,將值大的元素交換至右端。
思路:依次比較相鄰的兩個數,將小數放在前面,大數放在后面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放后。然后比較第2個數和第3個數,將小數放前,大數放后,如此繼續,直至比較最后兩個數,將小數放前,大數放后。重復第一趟步驟,直至全部排序完成。
第一趟比較完成后,最后一個數一定是數組中最大的一個數,所以第二趟比較的時候最后一個數不參與比較;
第二趟比較完成后,倒數第二個數也一定是數組中第二大的數,所以第三趟比較的時候最后兩個數不參與比較;
依次類推,每一趟比較次數-1; - 冒泡排序的思維是最簡單的,但是代碼實現起來并不是很容易。當時用循環來比較的時候,就一直要把鏈表的節點向后推,但要用一個中間變量temp來保存前面的數字,然后做數字交換,最后把遍歷的起始節點重指向頭結點。
- 由于細節比較或是循環問題,速度上體現為:插入排序>選擇排序>冒泡排序,三種排序的比較:其時間復雜度都是O(n^2)。
代碼調試中的問題和解決過程
問題1:在藍墨云的作業中,有個要求是實現刪除和插入的操作,但是最開始我沒有注意到,結果就是
問題1解決方案:聽同學說我做的少了很多東西,又重新增加了一些代碼,實現了插入和刪除
結果是
代碼托管
上周考試錯題總結
- 理解情況:在做這道題的時候,我太過于鉆牛角尖,我認為少了“或費極少的力”,于是錯了,但是現在看來更加深了理解。
- 理解情況:軟件工程,不是電氣工程。
- 理解情況:書上的內容,沒有認真看書。
- 理解情況:棧的操作是先進后出,顛倒了數據的順序,故不能保存順序。
- 理解情況:當時沒有很理解書上關于增長函數的圖表,后來理解之后發現O(2n)的函數增長最快。
- 理解情況:根據增長函數的圖像可知。
結對及互評
- 博客中值得學習的或問題:
- 在教材和代碼問題上很詳細,同時很會找問題記錄問題。
- 代碼中值得學習的或問題:
- 代碼操作并沒有像我一樣忘記很多
- 對代碼的規范性也更加注意了
- 基于評分標準,我給本博客打分:9分。
- 20172306
其他(感悟、思考等,可選)
這周有了新的學習任務,開始慢慢找回原來的感覺,但是還是感覺忘了很多東西,著實花了不少功夫,還有因為學代會的召開,耽誤的兩節課程,我會抓緊時間找同學找老師問問題補回來。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 0/0 | 1/1 | 20/20 | |
第二周 | 941/8481 | 2/2 | 18/20 |
參考資料
Java學習筆記(第8版)
《Java學習筆記(第8版)》學習指導