20162308 2016-2017-2 《程序設計與數據結構》第4周學習總結


20162308 2016-2017-2 《程序設計與數據結構》第4周學習總結

教材學習內容總結

  1. Java OOP編程
  2. 數組
  3. 條件和循環

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

  • 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” 問題即可解決。

代碼托管

  • 代碼提交過程 & 代碼量截圖:
    2017-03-25.png

上周考試錯題總結

  • 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小時

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM