20172314 2018-2019-1《程序设计与数据结构》第四周学习总结
教材學習內容總結
- 列表:是線性結構,可以用鏈表或數組來實現,列表集合沒有內在的容量大小,他可以隨著需要而增大。
- 棧是在其棧頂進行添加刪除操作,隊列在其頭刪除,尾添加,而線性列表可以在列表的中間和末端添加和刪除元素。
列表有三種類型:有序列表、無序列表、索引列表
分別可以表示為- 有序列表:基于列表中的某種特性,元素具有內在關聯,這種關聯定義了元素之間的順序。
- 無序列表:并不是真正的沒有順序,而是按照根元素本身無關的一種特殊順序放置,列表的使用者會決定元素的順序。
- 索引列表:各元素之間也并不能決定在列表中的順序,由使用者決定。每個元素能從一個數字索引得到引用索引值從0開始
- 索引列表和數組的區別:索引列表的索引值總是連續的,如果刪除了一個元素,其他元素的位置會像“坍塌”了一樣以消除空隙。
Java集合API中的列表
- 使用無序列表:學習計劃00
- 索引列表使用示例:Josephus問題
- 列表ADT
- 往列表中添加元素
有序列表:add(列表中添加元素)
無序列表:addToFront
- 往列表中添加元素
ProgramOfStudy的UML圖
- 使用數組實現列表
- 列表前端固定在索引0處,整數變量tear表示了列表中的元素數組,以及把元素添加到列表末端時的下一個可用位置。
- 有序列表和無序列表的共有操作
- remove操作:刪除列表中的操作,找到元素需要進行n次比較操作,復雜度為O(n)。
- contains操作:判斷元素是否包含在列表中,復雜度同為O(n)
- 有序列表的add操作:只有Comparable對象才能儲存在有序列表中。
- 無序列表的addAfter操作
- 使用鏈表實現列表
- remove操作:首先要確認列表非空,查找要刪除的元素,然后有四種情況
- 要刪除列表中唯一元素
- 要刪除列表中首元素
- 要刪除列表中末尾元素
- 要刪除列表當中的位置
- remove操作:首先要確認列表非空,查找要刪除的元素,然后有四種情況
教材學習中的問題和解決過程
- 問題一:列表的特征有哪些?如何定義
集合是Java API所提供的一系列類,可以用于動態存放多個對象。集合與數組的不同在于,集合是大小可變的序列,而且元素類型可以不受限定,只要是引用類型。集合中不能放基本數據類型,但可以放基本數據類型的包裝類。 集合類全部支持泛型,是一種數據安全的用法。java列表是集合的一種,并且列表中的元素是有序的,且允許重復。java列表又稱為java list。
- 問題二:書上在描述索引列表與數組的區別在于索引列表的索引值總是連續的,那數組的索引值不也是連續的嗎?
問題二解決:這句話的意思可能并不是說連續與否,因為數組中的元素也是連續存在的,應該是指它出現空位置的修復速度吧,就像書上后面描述如果刪除一個元素,其他元素的位置會像“坍塌”了一樣以消除產生的間隙。
- 問題三:書上說列表集合沒有內在容量大小,它可以隨著需要而增大,但是當列表由數組來實現時,應該不能隨意增大了吧
問題三解決:數組的長度是存放線性表的存儲空間的長度存儲分配后這個量是一般是不變的。用數組實現列表時,的確需要進行擴容操作
protected void expandCapacity() { list = Arrays.copyOf(list, list.length * 2); }
在這里這句話的含義并不等同于使用鏈表實現列表時的情況。
代碼調試中的問題和解決過程
- 問題一:代碼標紅顯示:'contains(T)' in '新第四周.six.LinkedList.LinkedOrderedList' clashes with 'contains(T)' in '新第四周.six.LinkedList.ListADT'; both methods have same erasure, yet neither overrides the other
問題一解決:這個錯誤的意思是,兩個方法在類型擦除后,具有相同的原生類型參數列表,但是也不能覆蓋另一個方法。泛型類型在編譯后,會做類型擦除,只剩下原生類型。如參數列表中的T類型會編譯成Object,但是會有一個Signature。盡管兩個方法具有相同的字節碼,但是類型參數信息用 一個新的簽名(signature)屬性記錄在類模式中。JVM 在裝載類時記錄這個簽名信息,并在運行時通過反射使它可用。這就導致了這個方法既不能作為覆蓋父類contains的方法,也不能作為contains方法的重載。
- 問題二:代碼中總有一個變量modCount,并不理解它存在的意義。
問題二解決:通過查找資料,解釋是:
modCount字面意思就是修改次數,所有使用modCount屬性的全是線程不安全的,對內容的修改都將增加這個值,那么在迭代器初始化過程中會將這個值賦給迭代器的 expectedModCount。在迭代過程中,判斷 modCount 跟 expectedModCount是否相等,如果不相等就表示已經有其他線程修改了,在迭代器遍歷的過程中,因為ArrayList被設計成非同步的,一旦發現這個對象的modcount和迭代器中存儲的modcount不一樣那就拋異常。
看起來不太好理解,舉個栗子:教務處網站統計學生成績,假如進行成績的修改,則modCount就相當于一本日志來記錄每次對成績的修改,萬一實際成績與教務處網站存出成績有出入,則可通過日志查看問題出在哪里。
問題三:instanceof是什么意思?
- 問題三解決:java 中的instanceof是一個二元操作符(運算符)運算符,由于是字母組成,所以是Java的保留關鍵字,但是和>=,<=,==屬同一類,它的作用是用來判斷,instanceof 左邊對象是否為instanceof右邊類的實例,返回一個boolean類型值。 還可以用來判斷子父類的所屬關系。
用法:
boolean result = object instanceof class參數:
Result:布爾類型。
Object:必選項。任意對象表達式。
Class:必選項。任意已定義的對象類。
說明:
如果 object 是 class 的一個實例,則 instanceof 運算符返回 true。如果 object 不是指定類的一個實例,或者 object 是 null,則返回 false。
這樣看來圖中的意思就是判斷element是否是Comparable類型的。
代碼托管
pp6.8
pp6.11
pp6.17
上周考試錯題總結
錯題一
- 錯題一解析:刪除操作會移動指針,但不會返回。
錯題二:
- 錯題二解析:多態引用可以在一段時間內引用不同類型的對象。這句話是正確的,多態本身就是指多種狀態,我做題時著重點在一段時間上,其實并不是重點。
錯題三:
- 錯題三解析:常見的特性應該在類層次結構中處于高水平,這樣才能最大化利用資源,使低水平的都可以引用。
錯題四:
錯題四解析:正確的應該是實現基于數組的堆棧最有效的方法是將堆棧底部保持在數組的位置0上。因為如果棧在數組中是倒序的,效率會高。
結對及互評
點評模板:
- 博客中值得學習的或問題:
- 20172305譚鑫的疑難問題解決的很好,內容全面,排版精美。
- 20172323王禹涵的博客中課本內容總結有具體代碼,但遇到的問題及解決過程的記錄可以更加豐富一點。
- 基于評分標準,我給譚鑫的博客打分:9分。得分情況如下:
- 問題加分6分
- 感悟不假大空加1分
- 排版精美的加1分
-正確使用Markdown語法加1分
-模板中的要素齊全加1分
- 基于評分標準,我給王禹涵的博客打分:6分。得分情況如下:
- 排版精美的加1分
- 問題加分2分
- 感悟不假大空加1分
-正確使用Markdown語法加1分
-模板中的要素齊全加1分
其他
這周在做實驗時遇到的問題很多,感覺沒有系統化所學習的各類東西。
學習進度條
| 目標 | 5000行 | 30篇 | 400小時 |
| 第一周 | 0/0 | 1/1 | 8/8 |
| 第二周 | 1163/1163 | 1/2 | 15/23 |
| 第三周 | 774/1937 | 1/3 | 12/50 |
| 第四周 | 3596/5569 | 2/5 | 12/62 |
參考:
- java列表
- 泛型類型擦除與重載和覆蓋問題
- ArrayList中modCount的作用
轉載于:https://www.cnblogs.com/YiYiYi/p/9752021.html
總結
以上是生活随笔為你收集整理的20172314 2018-2019-1《程序设计与数据结构》第四周学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL之架构与历史(二)
- 下一篇: git报ssh variant 'sim