20162308 2016-2017-2 《程序設計與數據結構》第4周學習總結
教材學習內容總結
- Java OOP編程
- 數組
- 條件和循環
教材學習中的問題和解決過程
- 1 關於 迭代器(Iterator)
- 閱讀資料:
Java Doc
java集合遍歷的幾種方式總結及比較
詳解Java中Iterator迭代器的用法
Java學習之Iterator(迭代器)的一般用法
💪💪💪Java設計模式之迭代子模式 - 1.1 迭代器和數組在for循環中有什么區別?
- Ans:
a. 數組可以通過 array.interator() 方法來轉化為迭代器進行loop,也可以直接使用傳統的基於計數器的for循環。
b. 迭代器可以使用 for(Object obj : interator){loop} 語句來進行循環;也可以使用 while(interator.hasNext()){loop} 語句對迭代器內的元素進行操作。
c. java集合遍歷的幾種方式總結及比較這篇文章很詳細地介紹了遍歷list和哈希表的幾種方法。 - 1.2 迭代和枚舉有什么具體的區別?
-
枚舉比迭代快兩倍而且消耗更少的內存。
枚舉更適合基本需求,而迭代是相對更安全,
因為在遍歷集合的時候,迭代器會阻止其他線程修改集合對象。
如果有其他線程要修改集合對象,會立即拋出ConcurrentModificationException。
我們稱其為快速失敗迭代器,因為它快速、明了地拋出了異常。 - 1.3 怎樣創建可迭代對象?
- 這個方面內容很多,而且我講的不一定能夠讓別人聽得明白。列出我的學習路徑。
- 學習路徑:
教材 4.8.1 迭代器和for循環
教材 9.3 接口
博客 Java設計模式之迭代子模式 這篇博客從代碼實現到設計哲學都解釋地非常深刻,值得學習。 - 2 數組
- 閱讀資料:
Java 集合系列03之 ArrayList詳細介紹(源碼解析)和使用示例
sun.misc.unsafe類的使用 - 2.1 怎樣創建動態數組
- 在C語言中可以通過手動申請一定的內存空間來間接生成一個動態數組,在Java中可以通過鏈表來間接實現動態數組的功能,但是Java也提供了一個直接生成動態數組的API,即java.util.ArrayList。但是Java中實現動態數組的方式與C語言不同,ArrayList是先創建一個大小為10的數組,當容量不夠時,再新建一個容量是原數組1.5倍+1大小的數組存儲數據。
// 默認構造函數
ArrayList()
// capacity是ArrayList的默認容量大小。
ArrayList(int capacity)
- 2.2 動態數組使用實例
import java.util.*;
public class Test{
public static main(String[] args){
ArrayList lst = new ArrayList();
//添加元素
lst.add('test0');
lst.add('test1');
lst.add('test3');
//獲取第一個元素
String str = lst.get(0);
//刪除'test0'
lst.remove('test0');
//轉化為迭代器進行循環
for(Iterator iter = lst.iterator(); iter.hasNext(); ) {
System.out.println("next is: "+ iter.next());
}
}
}
- 2.3 怎么申請超過 Interger.MAX_VALUE 長度的數組/怎么使用malloc方法直接對內存進行操作?
- Java還是提供了API,直接對內存進行操作,但在大多數情況下不建議這么使用。
import sun.misc.Unsafe;
//SuperArray.java
public class SuperArray{
public static Unsafe getUnsafe() {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
return (Unsafe)f.get(null);
}
private long size;
private long address;
public SuperArray(long size){
this.size = size;
address = getUnsafe().allocateMemory(size * BYTE);
}
public void set(long i, byte value) {
getUnsafe().putByte(address + i * BYTE, value);
}
public void get(long index){
return getUnsafe().getByte(address + index * BYTE);
}
public long size(){
return size;
}
}
public class Example{
public static void main(String[] args){
//實例化一個大小為 Interger.MAX_VALUE + 100 BYTE的動態數組
SuperArray arr = new SuperArray((long)(Interger.MAX_VALUE + 100));
}
}
代碼調試中的問題和解決過程
- 運行命令"javac -d bin src/GradeRange.java"時報錯
- GradeRange.java中引用了Grade.java中的Grade類,需要在src目錄下執行“javac GradeRange.java” 問題即可解決。
代碼托管
- 代碼提交過程 & 代碼量截圖:
上周考試錯題總結
- Java中類方法使用(static)關鍵字聲明。
用static關鍵字聲明的函數是該類的所有實例共同使用的,不需要每次實例化一個對象時生成一個函數。 - Java中生成對象必須使用new關鍵字。(X)
Java提供了靜態方法能夠直接返回一個對象。
結對及互評
張師瑜的博客課余時間學習Java學的很認真。
其他(感悟、思考等,可選)
- 選擇合適的方法、找到自己的節奏
這周很多同學說學的很累。其實我自己學的也很累。我覺得很大的原因還是時間利用上的問題。效率往往太過低下,書上的知識點沒有抓住重點來學習,往往拘泥於一些比較零散、瑣碎的知識點。
接下來的學習一定要好好改一改這種低效的學習方式。因為之前都是看書為主,然后腦洞大開地想幾個有意思的問題,最后完成書上PP的練習題。雖然效果不錯,但是那幾個腦洞大開的問題會耗費我大量的時間去找到答案。
感覺這種學習方法雖然很有樂趣,但是太浪費時間了。所以還是決定規定一下腦洞大開的數量!每周一個。然后把這個問題好好琢磨明白,再看半個小時網課,時間允許的話,再學一個算法。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 26/26 | 1/1 | 7/7 | |
第二周 | 81/107 | 1/2 | 8/15 | String類型的使用 |
第三周 | 80/187 | 1/3 | 5/20 | 位運算 |
第四周 | 300/487 | 1/4 | 8/28 | 動態數組和迭代器 |
-
計划學習時間:5小時
-
實際學習時間:8小時