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) |
返回列表中的元素數量 |
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下面的於語句。
代碼調試中的問題和解決過程
![](http://static.javashuo.com/static/loading.gif)
上週考試錯題總結
- 錯題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小時網絡
參考資料