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