20155320 2016-2017-2 《Java程序設計》第六周學習總結
教材學習內容總結
輸入輸出
- InputStream的read()方法每次都會嘗試讀入byte數組長度的數據,並返回實際讀入的字節(只要不是-1就表示讀到數據),OutoutStream的write()方法可指定要寫出的byte數組、初始索引和數據長度。
- 只要指定網址,URL實例會自動進行HTTP協議;用openStream()方法取得的InputStream實例,代表與網站連接的數據串流。
- 無論來源和目的地實體形式是什么,只要取得InputStream和OutputStream,就只是調用InputStream和OutputStream的相關方法。
- Systemd的setIn()方法指定InputStream實例,重新指定標准輸入來源,setOut()方法指定PrintStream實例,將結果輸出至指定目的地。
- BufferInputStream與BufferOutputStream會將數據盡量地讀取或者寫入到緩沖區,從而提高效率
- DataInputStream與DataOutputStream提供讀取寫入java基本類型的方法.
- ObjectInputStream與ObjectInputStream將數據讀入或寫出為對象.
- FileReader、FileWriter可以對文檔作讀取或寫入,默認會使用操作系統默認編碼。
- 抽象化了數據讀入和寫出的目的地,會將讀入的數據植入char數組中.
- 字符處理裝飾器可以使用BufferReader和BufferWriter將數據進行緩沖,增加讀取寫入效率。
線程與並行API
-
繼承Thread類也可以進行多個進程,但沒有Runnable的彈性好,運用Lambda表達式也可以簡化程序。
-
Daemon:在所有的非Daemon線程結束時,JVM就會自動終止
-
生命周期的五種狀態
-
新建(new Thread):當創建Thread類的一個實例(對象)時,此線程進入新建狀態(未被啟動)。例如:Thread t1=new Thread();
-
就緒(runnable):線程已經被啟動,正在等待被分配給CPU時間片,也就是說此時線程正在就緒隊列中排隊等候得到CPU資源。例如:t1.start();
-
運行(running):線程獲得CPU資源正在執行任務(run()方法),此時除非此線程自動放棄CPU資源或者有優先級更高的線程進入,線程將一直運行到結束。
-
死亡(dead):當線程執行完畢或被其它線程殺死,線程就進入死亡狀態,這時線程不可能再進入就緒狀態等待執行。自然終止:正常運行run()方法后終止。異常終止:調用stop()方法讓一個線程終止運行。
-
堵塞(blocked):由於某種原因導致正在運行的線程讓出CPU並暫停自己的執行,即進入堵塞狀態。正在睡眠:用sleep(long t) 方法可使線程進入睡眠方式。一個睡眠着的線程在指定的時間過去可進入就緒狀態。正在等待:調用wait()方法。(調用motify()方法回到就緒狀態)。被另一個線程所阻塞:調用suspend()方法。(調用resume()方法恢復)
-
sleep、wait阻斷等都會讓線程進入blocked狀態,運用多線程,避免cpu空閑下來,是改進效能的方式之一。
-
Lock是鎖對象,與Thread模型的隱式的鎖對象相比,Lock提供了顯式的鎖操作從而簡化應用程序。
-
Executors:提供了一組HighLevelAPI用來執行和管理並行任務。
-
ConcurrentCollections(並行集合):包含了一組支持並行處理的數據結構,大大簡化了並行編程難度。
-
AtomicVariables(原子變量):減少了同步操作並且避免數據不一致。
-
用來管理群組中的線程,enumerate可以取得群組中的所有線程,activecount()用來取得線程的數量
-
被表示為synchronized的區塊會被監控(monitor),需要先取得指定對象鎖定后才能執行,線程因synchronized區塊而進入blocked,在取得鎖定之后,會先回到runnable狀態,不正確地使用synchronized可能會造成效能低落或者死結。
-
volatile 變量上聲明,表示該變量是不穩定的、易變的,並且不允許線程快取,保證單一變數的可見性。
教材學習中的問題和解決過程
- 問題1:關於FileInputStream()與FileOutputStream()的具體用法及作用
- 問題1解決方案:通過百度我發現了兩篇博客詳細解釋了這個問題,一個是關於javaio的博客還有一個是FileInputStream與FileOutputStream
FileInputStream 是文件輸入流,它繼承於InputStream。
通常,我們使用FileInputStream從某個文件中獲得輸入字節。
FileOutputStream 是文件輸出流,它繼承於OutputStream。
通常,我們使用FileOutputStream 將數據寫入 File 或 FileDescriptor 的輸出流
代碼調試中的問題和解決過程
- 問題1:在編寫代碼charutil2時出現了如下錯誤顯示:

- 問題1解決方案:我發現這是由於我在運行提供給的代碼時新建工程后取的
class名與實際的public class名不符所致,因此我改變了原public class 名一致后解決了錯誤。
代碼托管

上周考試錯題總結
import java.util.*;
Class FindStuff {
public static void main (String[]args) {
//insert code here
c.put ("X", 123);
}
}
分別插入到第5行,哪幾行允許代碼編譯?(BDF)
A . Map c= new SortedMap();
B . HashMap c= new HashMap();
C . HashMap c= new Hashtable();
D .SortedMap c= new TreeMap();
E .ArrayList c= new ArrayList();
F .Map c = new LinkedHashMap();
- 4.現有:
list是一個合法的集合引用,getCollection()返回一個合法集合的引用, 哪個是合法的?(BE)
A . or(Object o ; list)
B . for(Object o : getCollection())
C . for(Object o : list.iterator())
D . for(lterator i ; list.iterator() ; i.hasNext () )
E . for(lterator i=list.iterator(); i.hasNext (); )
- 7.創建一個只能存放String的泛型ArrayList的語句是哪項?(B)
A .ArrayList
B . ArrayList
C .ArrayList al=new ArrayList
D .ArrayList
- 12.集合API 中Set接口的特點是?(D)
A .不允許重復元素,元素有順序
B .允許重復元素,元素無順序
C .允許重復元素,元素有順序
D .不允許重復元素,元素無順序
- 5.現有:
import java.util.*;
class ForInTest {
static List list=new ArrayList();
}
public static void main (String [] args) {
list. add("a"); list. add("b");list. add( "c");
//insert code here
System.out.print (o);
}
}
哪一行插入到第9行將導致輸出“abc"?(D)
A .for (Iterator o : list.iterator(); o.hasNext (); )
B .for (Iterator o : list)
C .for (Object o : list.iterator())
D . for (Object o : list)
結對及互評
點評過的同學博客和代碼
其他(感悟、思考等,可選)
本周嘗試了一下課上婁老師推薦的學習方法雖然略有推遲但是感覺還是不錯的,先看了一下老師發在資源里的視頻,然后是看書上的內容,以前的代碼都是自己打,但是這次我嘗試先看再改提供的代碼,雖然有一些無法運行,但是感覺節省了許多時間,也輕松了許多。
學習進度條
| 代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
|---|---|---|---|---|
| 目標 | 5000行 | 15篇 | 400小時 | |
| 第一周 | 20/20 | 1/4 | 20/20 | 安裝了JDK及IDEA |
| 第二周 | 144/164 | 1/5 | 18/38 | 學習了java語言的基本語法 |
| 第三周 | 447/567 | 1/6 | 20/ 58 | 掌握了一些有關對象和封裝的內容 |
| 第四周 | 875/ 1442 | 1/7 | 23/81 | 學習了解了繼承、接口和多態的相關問題 |
| 第五周 | 775/2250 | 1/8 | 25/106 | 學習了異常處理以及Collection與Map相關的內容 |
| 第六周 | 487/ 2706 | 1/8 | 22/128 | 學習了輸入輸出 |
嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
-
計划學習時間:25小時
-
實際學習時間:22小時
-
改進情況:本周與結對同學一起學習,本計划時間更充裕一點,然而合作卻出乎意料的順利,就是花在第11章中的代碼中的時間更多。
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)

