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

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

教材學習內容總結

  • 列表集合
    • 有序列表: 其元素按照元素的某種內在特性進行排序。(有序列表中的元素具備內在關聯,這種關聯定義了元素之間的順序)
    • 無序列表: 其元素間不具備內在順序,元素按照它們在列表中的位置進行排序。(無序列表中的元素按使用者所選擇的任意方式排序)
    • 索引列表: 其元素能夠用數字索引來引用。(索引列表爲它的元素維護一段連續的數字索引值)
  • Java集合API中的列表
方法 描述
add(E element) 往列表的末端添加一個元素
add(int index, E element) 在指定索引處插入一個元素
get(int index) 返回指定索引處的元素
remove(int index) 刪除指定索引處的元素
remove(o object) 替代指定索引處的元素
set(int index,E element) 返回列表中的元素數量
  • 列表ADT
操做 描述
removeFirst 從列表中刪除第一個元素
removeLast 從列表中刪除最後一個元素
remove 從列表中刪除某個元素
first 查看位於列表前端的元素
last 查看位於列表末端的元素
contains 肯定列表是否含有某個元素
isEmpty 肯定列表是否爲空
size 肯定列表中的元素數量
  • 使用數組實現列表
    • 通常的的列表能夠從兩端添加或刪除元素,但它們還有從列表的中間插入或刪除元素。所以沒法避免要移動元素。可使用環形數組方法,但當從列表中間插入或刪除元素時,仍須要移動元素。
    • 重載equals方法以及實現Comparable接口是展現面向對象設計的極好示例。咱們能夠建立集合的實現來處理各類尚未設計的對象,只要這些對象具備相同的定義和(或)類中提供對象間的某種做比較的方法。
    • 將向ArrayList類中諸如find之類的private方法獨立出來有多種益處。首先,它使得本已複雜的remove方法的定義變得很是簡單。第二,它使得咱們可以利用find方法來實現contains操做以及ArrayUnorderedList的addAfter方法。注意,find方法不會拋出ElementNotFound異常,它只是簡單地返回值(1)以代表元素未找到。經過這種方法,調用程序能夠決定如何處理元素未找到的狀況。在remove方法中,這意味着拋出一個異常。而在contains方法中,這意味着返回false。
    • 在進行remove操做的時候,若是要刪除的元素是列表的最後一個元素,在這種狀況下,須要進行n次比較操做。事實證實,這種刪除操做的實現正好須要n次比較和平移操做,所以該操做的複雜度爲O(n)。若是使用的是環形數組實現,他只是提升了刪除第一元素這樣一種特殊狀況下的性能。
    • 進行contains操做時,因爲該方法執行的是列表的線性查找,所以最壞的狀況是所查找的元素不在列表中,在這種狀況下須要n個比較操做,於是該操做的複雜度爲O(n)。
    • 與remove同樣,每次運行add操做時須要進行那次比較和平移操做,所以該操做的複雜度爲O(n)。
  • 使用鏈表實現列表
    • 進行remove操做時,與數組實現的人move操做不一樣,鏈表實現的remove操做不須要評議元素來填補空襲。可是,在最壞的狀況下,仍須要進行n次操做,已肯定目標元素不在列表中,所以remove操做的複雜度仍爲O(n)。

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

  • 問題1:咱們能夠分別使用數組和鏈表實現列表,那麼使用數組實現的ArrayList和使用鏈表實現的LinkedList在空間複雜度和時間複雜度上的區別在哪?
  • 問題1解決方法:每一個對象插入到列表中時,鏈表實現須要更多的空間。LinkedList類其實是一個雙向鏈表,所以其引用須要兩倍的空間。ArrayList類在空間管理上比基於數組的實現方式更高效。這是由於,ArrayList集合是可變大小的,所以按所需動態分配空間。因此,無需一次申請大量的空間而形成浪費。列表是在須要時才增長空間。二者間最大的區別發生在訪問列表中特定索引位置時。若是已知索引值,ArrayList實現可以在相同的時間內訪問列表中的任意元素。LinkedList實現須要從一端或另外一端起對列表進行遍歷,以到達特定索引值。
  • 問題2:在學習書上代碼時,有這樣一段話:ProgramOfStudy和Course類實現了Serializable接口。爲了是某個對象能使用串行化進行存儲,其類必須實現Serializable。在erializable中沒有任何方法,它只是代表,該對象能夠轉換爲串行化表示形式。 我對於Serializable接口瞭解的很少,也不太明白串行化在這裏表示的是什麼意思。
  • 問題2解決方法:html

    什麼是Serializable接口?
    一個對象序列化的接口,一個類只有實現了Serializable接口,它的對象才能被序列化
    什麼是序列化?
    將對象的狀態信息轉換爲能夠存儲或傳輸的形式的過程,在序列化期間,對象將其當前狀態寫入到臨時存儲區或持久性存儲區,以後,即可以經過從存儲區中讀取或反序列化對象的狀態信息,來從新建立該對象
    什麼狀況下須要序列化?
    當咱們須要把對象的狀態信息經過網絡進行傳輸,或者須要將對象的狀態信息持久化,以便未來使用時都須要把對象進行序列化
    Serializable主要用來支持兩種主要的特性:
    一、Java的RMI(remote method invocation),RMI容許像在本機上同樣操做遠程機器上的對象,當發送消息給遠程對象時,就須要用到序列化機制來發送參數和接受返回值
    二、Java的JavaBean,Bean的狀態信息一般是在設計時配置的,Bean的狀態信息必須被保存下來,以便當程序運行時能恢復這些狀態信息,這也須要序Serializable機制前端

  • 問題3:書上使用鏈表實現列表的remove操做示例中有下面這樣的代碼,我有些不太清楚這裏if的判斷條件是!found自身的boolean值仍是當前found的值是否發生改變。
if(!found)
   throw new ElementNotFoundException("LinkedList");
  • 問題3解決方案:!是一個一元運算符,運算對象是boolean類型的,若運算對象爲true則返回false,若運算對象爲true則返回false。!value的話value要是boolean值才能夠進行運算。
    下面舉的例子if(file!=null)就是若是file對象不爲空,則執行if下面的語句。
    if(!value.equal("")) 顯然value是一個string類型的,這裏的!操做符並非對value進行運算的,而是對value.equal("")進行運算的
    equal()方法返回的值是boolean類型的
    if(!value.equal(""))整個意思是若是value不爲空字符串(注意哦,不是不爲空,這是有區別的),則執行if下面的於語句。

代碼調試中的問題和解決過程

  • 問題1:在完成pp6_11編程項目的過程當中,調用addAfter()方法後,會提示我出現了空指針。
  • 問題1解決方法:在debug了以後,我發現我調用了addAfter()方法後,若是新添加的數位於該列表的末尾,這時候我對tail這個尾部指針是沒有進行任何操做的,tail此時並無真正指向該列表的尾部。在這以後在調用removeLast()方法,就不能對尾部的節點進行正確的操做,會出現空指針的狀況。

    java

  • 問題2:在完成pp6_17編程項目的過程當中,當我調用contains()方法來判斷某節點是否存在時,我發現我明明刪掉的節點在判斷的時候依舊爲true。

  • 問題2解決方法:令我奇怪的時,當我打印輸出整個列表時,我已經刪掉的這個節點是不會出現的,我調用Last()方法打印該列表的最後一個節點所保存的元素髮現也是沒有問題的。我又更換了幾組節點進行判斷是否存在,更讓我奇怪的事情發生了,只有當判斷的節點是最後一個而且該節點被刪除時纔會出現問題。我進行了debug操做,在判斷到我所認爲的列表的末尾時,它居然還會繼續循環下去,指向那個我本來覺得刪除的節點!我終於發現了問題所在,在刪除末尾節點的時候雖然將tail指向了它前面的節點,但並未將tail指向空,因此在循環的時候指針依舊是指向那個本要刪除的節點的。以下圖所示,我只要把tail再指向null就好了。

    git

代碼託管

上週考試錯題總結

  • 錯題1::A reference variable can refer to any object created from any class related to it by inheritance.
    A . true
    B . false
  • 錯題分析:這題翻譯過來就很直接明瞭了,子類經過繼承父類可以調用父類的全部方法,在測試的時候對英語不是很懂什麼意思,致使作錯。
  • 錯題2:A well-defined interface masks the implementation of the collection.
    A . true
    B . false
  • 錯題分析:一個定義良好的接口可以更好的幫助集合的實現,測試時沒有好好理解題目的意思。
  • 錯題3:Common features should be located as low in a class hierarchy as is reasonable, minimizing maintenance efforts.
    A . true
    B . false
  • 錯題分析:公共特徵應該在合理的層次結構中儘量高,從而最大限度地減小維護工做。

結對及互評

  • 博客中值得學習的或問題:
    • 排版精美,對於問題研究得很細緻,解答也很周全。
  • 代碼中值得學習的或問題:
    • 代碼寫的很規範,思路很清晰,繼續加油!

點評過的同窗博客和代碼

其餘(感悟、思考等,可選)

  不得不說,國慶七天假期內的學習效率是很是低的(不想學習!不想學習!不想學習!)。但仍是硬撐着完成了編程任務、寫完了博客。也沒有花更多的功夫去進行拓展學習。總的來講,這七天的學習時間是不夠的,但願在假期過去後,本身的學習狀態有所回升,繼續進步!編程

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
第一週 200/200 1/1 5/20
第二週 981/1181 1/2 15/20
第三週 1694/2875 1/3 15/35
第四周 3129/6004 1/4 15/50
  • 計劃學習時間:15小時數組

  • 實際學習時間:15小時網絡

參考資料

相關文章
相關標籤/搜索