20172314 2018-2019-1《程序設計與數據結構》第四周學習總結

教材學習內容總結

  • 列表:是線性結構,能夠用鏈表或數組來實現,列表集合沒有內在的容量大小,他能夠隨着須要而增大。
  • 棧是在其棧頂進行添加刪除操做,隊列在其頭刪除,尾添加,而線性列表能夠在列表的中間和末端添加和刪除元素。
  • 列表有三種類型:有序列表、無序列表、索引列表html

    分別能夠表示爲
  • 有序列表:基於列表中的某種特性,元素具備內在關聯,這種關聯定義了元素之間的順序。
  • 無序列表:並非真正的沒有順序,而是按照根元素自己無關的一種特殊順序放置,列表的使用者會決定元素的順序。
  • 索引列表:各元素之間也並不能決定在列表中的順序,由使用者決定。每一個元素能從一個數字索引獲得引用索引值從0開始
  • 索引列表和數組的區別:索引列表的索引值老是連續的,若是刪除了一個元素,其餘元素的位置會像「坍塌」了同樣以消除空隙。
  • Java集合API中的列表
    前端

  • 使用無序列表:學習計劃00
  • 索引列表使用示例:Josephus問題
  • 列表ADT
    • 往列表中添加元素
      • 有序列表:add(列表中添加元素)
        java

      • 無序列表:addToFront
        git

  • ProgramOfStudy的UML圖
    數組

  • 使用數組實現列表
    • 列表前端固定在索引0處,整數變量tear表示了列表中的元素數組,以及把元素添加到列表末端時的下一個可用位置。
    • 有序列表和無序列表的共有操做
      • remove操做:刪除列表中的操做,找到元素須要進行n次比較操做,複雜度爲O(n)。
      • contains操做:判斷元素是否包含在列表中,複雜度同爲O(n)
    • 有序列表的add操做:只有Comparable對象才能儲存在有序列表中。
    • 無序列表的addAfter操做
  • 使用鏈表實現列表
    • remove操做:首先要確認列表非空,查找要刪除的元素,而後有四種狀況
      • 要刪除列表中惟一元素
      • 要刪除列表中首元素
      • 要刪除列表中末尾元素
      • 要刪除列表當中的位置

教材學習中的問題和解決過程

  • 問題一:列表的特徵有哪些?如何定義
  • 集合是Java API所提供的一系列類,能夠用於動態存放多個對象。集合與數組的不一樣在於,集合是大小可變的序列,並且元素類型能夠不受限定,只要是引用類型。集合中不能放基本數據類型,但能夠放基本數據類型的包裝類。 集合類所有支持泛型,是一種數據安全的用法。java列表是集合的一種,而且列表中的元素是有序的,且容許重複。java列表又稱爲java list。安全

  • 問題二:書上在描述索引列表與數組的區別在於索引列表的索引值老是連續的,那數組的索引值不也是連續的嗎?
  • 問題二解決:這句話的意思可能並非說連續與否,由於數組中的元素也是連續存在的,應該是指它出現空位置的修復速度吧,就像書上後面描述若是刪除一個元素,其餘元素的位置會像「坍塌」了同樣以消除產生的間隙。ide

  • 問題三:書上說列表集合沒有內在容量大小,它能夠隨着須要而增大,可是當列表由數組來實現時,應該不能隨意增大了吧
  • 問題三解決:數組的長度是存放線性表的存儲空間的長度存儲分配後這個量是通常是不變的。用數組實現列表時,的確須要進行擴容操做
    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,並不理解它存在的意義。
  • 問題二解決:經過查找資料,解釋是:.net

    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

參考:

相關文章
相關標籤/搜索