20155312 2016-2017-2 《Java程序設計》第七周學習總結
課堂內容總結
- read()每次讀入一個字節。
- eg:short2個字節,2=0x0201,讀入后要
0x << 8 | 0x01
才能正確讀數。
- eg:short2個字節,2=0x0201,讀入后要
- DataInputStream——高級流(過濾流):readDouble(),readFloat()...
- 字節流:二進制
- 文本流:文本
od -tx1 Test.java
用十六進制查看代碼,"1"代表一個字節。od -tx1 -tc Test.java
顯示出對應的原代碼。- 字符在硬盤上占一個字節,在內存“流”中占兩個字節。漢字在硬盤、內存中都占兩個字節。
- 文本(.txt)中
12345678
占幾個字節?——7個
;在二進制文件(.bin)中占3個字節——12D678; - 字符串轉換成整數型:Integer.parseInt(...)
- 數字轉換成字符串:1234567+""
- C語言中數字轉換成字符串:fprintf或atoi
- java是第一個語言支持多線程。
- 注意區分類設計者和類使用者的不同。
time ./run HelloTest
查看運行時間。- main有一個主線程。
- 操作系統中的“並發控制”:多線程的結果不同;“生產者消費者問題”;“哲學家問題”。
- 注意看父類中的方法;注意構造方法“Constructor Summary”;
教材學習內容總結
- 時間的度量
- GMT(Greenwich Mean Time)時間:現在不是標准時間
- 世界時(Universal Time,UT):1972年UTC出來之前,UT等價於GMT
- 國際原子時(TAI):秒的定義
- 世界協調時間(Corrdinated Universal Time, UTC): 閏秒
- Unix時間: 1970.1.1 00:00:00開始的秒數
- epoch: java.util.Date epoch毫秒數
- 時區
- Date與DateFormat
- Date只用來獲取epoch毫秒數
- 兩個構造函數:1.使用epoch毫秒叔構建
Date date1=new Date(currentTimdMillis());
2.無自變量構造函數Date date2=new Date();
- 兩個方法:1.
getTime()
2.setTime()
[3.toString()
不建議使用]
- 兩個構造函數:1.使用epoch毫秒叔構建
- DateFormat來格式化成人類理解的年月日時分秒
- java.text.Date:抽象類,操作類:java.textSimpleDateFormat
- 靜態方法:1.
getDataInstance()
2.getTimeInstance()
3.getDateTimeInstance()
- 格式參數getDataInstance()等三個方法中的1.
LONG
2.SHORT
3.MEDIUM
- SimpleDateFormat:方法parse()將指定字符串剖析為Date實例。
- Date只用來獲取epoch毫秒數
- Calendar: 時間的運算
- getInstance(): 默認取得GregorianCalendar(Calendar的子類)實例。
- getTime():獲取Date實例
- get():取得年月日等時期時間字段(指定字段枚舉常數:Calendar.YEAR, ~.MONTH, ~.DATE)注意:get(Calendar.MONTH比正常值小1)
- set():設定日期
- add():正數為加,負數為減;eg:calendar.add(Calendar.YEAR,-2);
- roll():只對某個字段加減(其他字段不變)
- after():比較是否在某個日期后
- before():比較是否在某個日期前
- clone():復制
- setTimeZone():對某個Calendar實例設定TimeZone
- getDefault():java.util.TimeZone的方法。其中定義的其他方法:1.
getDisplyName()
2.時區IDgetID()
3.日光節約時數getDSTSavings()
4.偏移毫秒數getRawOffset()
- getTimeZone("ID字符串"):java.util.TimeZone的方法
- getAvailableIDs():取得可使用的ID
- Date與DateFormat
- 機器時間 Instant:與Date相互轉換:toInstant()->Instant和from()->Date;
- now():取得Instant實例
- ofEpochMilli():指定毫秒數
- ofEpochSecond():指定秒數
- 時間軸上的運算:plusSeconds(),plusMillis(),plusNanos(),minusSeconds(),minusMillis(),minusNanos();不改變Instant實例的值,而是返回新的實例。
- 人類時間(ISO8601 標准)
- LocalDateTime:不具時區的日期與時間
- LocalDate:不具時區的日期
- 方法:plusDays(),plusMonths(),plusWeeks()
- LocalTime:不具時區的時間
- ZonedDateTime:根據時區自動更正時間
- OffsetdateTime:UTC偏移量
- Year:ordinal():獲取enum定義時序;getValue():獲取月份對應數字
- YearMonth
- Month
- MonthDay
- TemporalAmount:操作類->Period,Duration
- ofPattern()是java,time.format.DateaTimeFormatter的靜態方法,eg:...format(ofPattern("自定義格式"))
- Period類:ofDays(),ofMonths(),ofWeeks()返回Period實例
- TemporalUnit
- TemporalAccessor
- Chronology
教材學習中的問題和解決過程
- 問題一:awt中各種類與方法的關系是什么?
解決方法:結合API將常用類和方法總結如下: - 開發窗口應用程序
- AWT
- java.awt.Component
- java.awt.Container(可容納Component)
- java.awt.Window
- java.awt.Dialog
- java.awt.Frame
- java.awt.Panel
- java.awt.Window
- Button
- Label
- TextComponent
- java.awt.Container(可容納Component)
- java.awt.MenuComponent
- MenuBar
- MenuItem
- java.awt.Component
- JFC/Swing(主要學習對象,基於AWT)
- AWT
- 發現舊版書的第13章是窗口設計,新版書是時間與日期orz......
- 問題二:書P432CurrentTime.java文件中
dateFormat.format(new Date())
是調用了怎樣的方法? - 解決:newDate()是在獲取當前的毫秒數,.format()是將后面的實例格式化為指定格式。
- 問題三:System.currentTimeMillis()的結果與getTime()獲取的浩渺數為什么相差1呢?
程序截圖:(添加打印System.currentTimeMillis())
結果截圖:
- 解決方案:查看currentTimeMillisAPI截圖如下:currentTimeMillis返回值代表1970年1月1日0時0分0秒0毫秒至今經過的毫秒數。顯示的1毫秒差應該是程序執行消耗的時間。
代碼調試中的問題和解決過程
-
問題1:在編譯書中P430的DataFormatDemo.java時,出現錯誤,截圖如下:
-
解決方案: 檢查代碼發現已經聲明了public class DateFormatDemo,不知道為什么編譯出錯。老師在教學指導中讓好好學習一下DateFormat類,可是我查詢了API文檔,感覺還是沒有什么頭緒。只是了解了它是一個抽象類,有諸多方法。
-
問題2:編譯HowOld2.java時沒有問題,運行時出現如下問題:
-
解決:是自己輸入不合法,在月份和日期前加0 ,運行成功,截圖如下:
代碼托管
上周考試錯題總結
- 錯題1:下面哪條命令可以把 f1.txt 復制為 f2.txt ?
- 原因:少選了選項C .
cat f1.txt > f2.txt - 理解情況:查詢了Cat命令的使用方法
- 原因:少選了選項C .
cat主要有三大功能:
1.一次顯示整個文件。
$ cat filename
2.從鍵盤創建一個文件。
$ cat > filename
只能創建新文件,不能編輯已有文件.
3.將幾個文件合並為一個文件。
$cat file1 file2 > file
參數:
-n 或 –number 由 1 開始對所有輸出的行數編號
-b 或 –number-nonblank 和 -n 相似,只不過對於空白行不編號
-s 或 –squeeze-blank 當遇到有連續兩行以上的空白行,就代換為一行的空白行
-v 或 –show-nonprinting
題目涉及到的用法:cat f1.txt > f2.txt
把f1.txt文檔內容輸入到f2.txt里
- 錯題2:下面代碼中共有()個線程?......
- 原因及理解情況:忘記main函數會自帶一個主線程,所以少差了一個線程,現已理解。
- 錯題3:"如果有以下代碼段:
Thread thread = new Thread(new ________________() {
public void run() {...}
});
空白部分指定哪些類型可以通過編譯?"
- 原因:上周學習過程中也出現過這樣的問題(見截圖),但當時解決時理解的並不到位,導致思想被誤導。少選了一個選項:B.Thread
-理解情況:無論是操作Runnable接口,還是繼承Thread類,都可以重新定義run()方法,所以,這里創建線程的兩種方法都可以填在空格里,后面緊跟着{...run()...});是匿名內部類的定義。
- 錯題4:調用線程的interrupt()方法 ,會拋出()異常對象?
- 原因:少選了選項:E .
SecurityException。在上周學習過程中,如何判可能會出現哪些異常也是我提出過的問題(見截圖1),但當時並沒有對該問題深入研究,導致問題還是問題,解決其實還是未解決的現象。
截圖1:
- 理解情況:查詢API(見截圖2),發現當前線程無法修改這個線程的狀態是會拋出SecurityException。
截圖2:
-
錯題5:題目截圖如下:
-
原因:對數組知識掌握不好,對iterator()遍歷方法掌握不熟。
-
理解情況:
- 加強式for循環是使用方法:
for(Object o : list)
外層for循環取得list參考對象的每個索引,將參考到的對象指定給Object類型的o名稱。“:”后要是一個數組的首地址(對一維數組而言及數組名)。 - iterable()是一個方法,它作為forEach的參數可以實現所有操作過iterable()接口的類都可以調用forEach來實現數組元素的遍歷。
- 加強式for循環是使用方法:
-
錯題6:題目截圖如下:
-
原因:
- 對調用 Integer.parselnt()方法可能會拋出什么錯誤了解不到位
- 少選了選項A.catch (IllegalArgumentException e) {這個選項開頭少了一個大括號。
-
理解情況:查詢了API, 其中只提到了“NumbelFormatException”(截圖如下),所以又查詢了IllegalArgumentException的API,了解到它是一種RuntimeException,因為要剖析為整數的字符創“42a”中含有字母a,是一種不合法的參數。
-
補充:parameter和argument的區別
- parameter是指函數定義中參數(形參),而argument指的是函數調用時的實際參數(實參)。
-
錯題7:Given an instance of a Stream, s, and a Collection, c, which are valid ways of creating a parallel stream? (Choose all that apply.)
-
原因:單詞不理解,對並行流掌握不到位,少選了F .
s.parallel()。 -
理解情況:單詞解釋:instance實例,parallel stream並行流。查詢API(截圖如下)parallelStream()是++Collection++方法中定義的方法。而parallel()是++java.util.stream++類下BaseStream,DoubleStream,LongStream,IntStream幾個方法中定義的方法。
-
錯題8:Which of the following statements about the Callable call() and Runnable run() methods are correct? (Choose all that apply.)
-
原因:少選了選項C .
Callable can throw a checked exception.
D .
Both can be implemented with lambda expressions. -
理解情況:
-
Callable的call()方法當無法計算出結果時拋出Exception異常,Exception中包括受檢異常和非受檢異常。(截圖如下)
-
一個Lambda Expression (譯為Lambda式) 就是一個包含若干表達式和語句的匿名函數。至於他們是否被lambda繼承,我還是不理解,只是在API中查詢到了如下結果:
-
-
錯題9:Which of the following are not java.io classes? (Choose all that apply.)
-
原因:誤選了F .
PrintWriter,正確選項:E .
PrintReader -
理解情況:查詢API,發現PrintWriter繼承與java.io.Writer,沒有查詢到PrintReader這個類。(截圖如下)
-
錯題10:What are some reasons to use a character stream, such as Reader/Writer, over a byte stream, such as InputStream/OutputStream?
-
原因:英文儲備量不夠
-
理解情況:錯誤選項Improved performance的意思是改善增進執行。正確選項Automatic character encoding的意思是:自動進行字母編碼。
-
錯題11:Suppose that the file c:\book\java exists. Which of the following lines of code creates an object that represents the file?
-
原因少選了new File("c:\\book\\java");
-
理解情況:查詢資料得知“出現在普通字符串中的路徑,如果代表的是windows文件路徑,則使用 斜桿/ 和 反斜杠\ 是一樣的”
-
錯題12:Which of the following are built-in streams in Java?
-
原因:對java內置流的概念不了解。
-
理解情況:System.err和System.out都是PrintStream的實例,System.in?目前只理解這么多。
-
錯題13:題目截圖如下:
-
理解情況,new后面的類要是InputStream的自類,並且可以傳入is,is是被BufferedInputStream打包的new FileInputStream("zoo.txt")實例。而ObjectInputStream可以打包FileInputStream,所以可以選擇D .
ObjectInputStream。
結對及互評
這周我對搭檔的幫助是分析實驗題目,共同思考解決方案並督促雙方學習。
評分標准
-
正確使用Markdown語法(加1分):
- 不使用Markdown不加分
- 有語法錯誤的不加分(鏈接打不開,表格不對,列表不正確...)
- 排版混亂的不加分
-
模板中的要素齊全(加1分)
- 缺少“教材學習中的問題和解決過程”的不加分
- 缺少“代碼調試中的問題和解決過程”的不加分
- 代碼托管不能打開的不加分
- 缺少“結對及互評”的不能打開的不加分
- 缺少“上周考試錯題總結”的不能加分
- 缺少“進度條”的不能加分
- 缺少“參考資料”的不能加分
-
教材學習中的問題和解決過程, 一個問題加1分
-
代碼調試中的問題和解決過程, 一個問題加1分
-
本周有效代碼超過300分行的(加2分)
- 一周提交次數少於20次的不加分
-
其他加分:
- 周五前發博客的加1分
- 感想,體會不假大空的加1分
- 排版精美的加一分
- 進度條中記錄學習時間與改進情況的加1分
- 有動手寫新代碼的加1分
- 課后選擇題有驗證的加1分
- 代碼Commit Message規范的加1分
- 錯題學習深入的加1分
- 點評認真,能指出博客和代碼中的問題的加1分
- 結對學習情況真實可信的加1分
-
扣分:
- 有抄襲的扣至0分
- 代碼作弊的扣至0分
- 遲交作業的扣至0分
點評模板:
-
博客中值得學習的或問題:
- xxx
- xxx
- ...
-
代碼中值得學習的或問題:
- xxx
- xxx
- ...
-
基於評分標准,我給本博客打分:XX分。得分情況如下:xxx
點評過的同學博客和代碼
其他(感悟、思考等,可選)
自我總結如下:
- 做題速度慢,對手機答題的模式還是不太適應,課堂測驗還是大部分做不完。感覺自己學了書上的內容但很多不理解,所以這周把學習重點放在了教材理解上。
- 學習java的最終目的是實現自動化,即會編出質量高的程序解決需求。所以夯實基礎的同時提高編程能力才是重中之重。
- 第六周老師說可以復制資源中的代碼,所以敲代碼的時間節省了很多,側重點放在了代碼結果預測和分析上。
- 經過前幾周的學習,我發現博客知識記錄學習過程的工具,學習知識才是我們真正的目標。而且既然花費時間去學習,就要學透學好,不然時間都是白白浪費了。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 4/0 | 1/3 | 28/80 | 下載了JDK和GIT |
第二周 | 61/4 | 1/4 | 20/108 | 在unbuntu中熟練編寫程序,熟練進行文件、目錄等操作 |
第三周 | 684/65 | 1/5 | 27/108 | 初步配置vim方便使用,會自己解決一些代碼問題 |
第四周 | 1238/749 | 1/6 | 23/135 | 大部分自己補全的代碼片段不會出現問題,漸漸具備脫離書本編代碼的能力 |
第五周 | 627/1987 | 1/7 | 20/158 | 能夠幫助其他同學發現代碼出錯的原因 |
第六周 | 414/2614 | 1/8 | 24/178 | 能夠整理出教材中各種類、接口、方法之間的相互關系,理清知識脈絡 |
第七周 | 564/3028 | 1/8 | 17/202 | 借室友的書進行學習,所以學習時更加注重理解和記憶 |
嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
-
計划學習時間:20小時
-
實際學習時間:17小時
-
改進情況:這周學習內容不多,學的比較認真,自己做了很多筆記。