20155318 2016-2017-2 《Java程序設計》第八學習總結


20155318 2016-2017-2 《Java程序設計》第八學習總結

教材學習內容總結

學習目標

  1. 了解NIO
  2. 會使用Channel、Buffer與NIO2
  3. 會使用日志API、國際化
  4. 會使用正則表達式
  5. 了解JDK8增強功能

NIO與NIO2

  • NIO(New IO)-from JDK1.4
    • NIO用頻道銜接數據節點,在處理數據是,設定緩沖區容量,提供clear()、rewind()、flip()、compact()等方法。
    • Channel: 銜接數據節點
    • Buffer: 塊操作,直接子類都有一個allocate()靜態方法,容量大小可以用capacity()取得。
  • NIO2 -from Java SE 7
    • java.nio.file
      • FileSystems
      • Paths
      • Files
    • java.nio.file.atribute
    • java.nio.file.spi
    • 用FileSystemProvider取得所需的操作對象,完成相應操作。

通用API

日志API
  1. java.util.logging包提供了日志功能相關類與接口,使用日志的起點是logger類
  2. Logger類的構造函數標示為protected
  3. 不是java.util.logging同包的類不能直接以new創建,必許使用Logger的靜態方法
  4. 無法使用構造方法生成Logger對象
  5. 通過getParent()取得父Logger實例,通過getLevel()取得設定的Level實例,默認取得的Logger實例,層級必須大於或等於Logger.GLOBAL-LOGGER-NAME名稱空間logger實例設定的Level.INFO,才可能輸出信息。Logger可通過setLevel()來設定Level實例創建:Logger logger = Logger.getLogger("cc.openhome.Main")取得:Logger logger = Logger.getLogger("Main.class.getName")
Handler、Formatter與Filter
  1. Handler:輸出介質,標准API提供了幾個操作類:
  • MemoryHandler不會格式化日志信息,信息會暫存於內存緩沖區,直至超過大小才將信息輸出至指定的目標Handler。
  • StreamHandler可自行指定信息輸出時使用的OutputStream。
  • ConsoleHandler創建時,會自動指定OutputStream為System.err。
  • SocketHandler創建時可以指定主機位置與端口。
  • addHandler()新增Handler實例,removeHandler()移除Handler實例
  1. Formatter: 格式化
  2. Filter: 過濾
國際化標准
  1. Localization 本地化;Internationalization(i18n)國際化
  2. ResourceBundle
  • 靜態getBundle()方法取得一個ResourceBundle的實例,所給定的自變量名稱是信息文檔的主文件名,getBundle()會自動找到對應的.properties文檔,用getString()指定鍵來取得
  1. Locale
  • 國際化的三個標准是地區(Locale)信息、資源包(Resource bundle)與基礎名稱(Base name)
正則表達式
  1. 用於字符、字符串格式比較,包含字面意義字符與元字符。
    • 字面意義字符是指按照字面意義比較的字符
    • 元字符是不按照字面意義比較的字符,在不同情境有不同意義的字符。
  2. String的split()方法會返回切割后各個子字符串組成的String數組
  3. {n},貪婪量詞,表示前面的量詞出現n次,會盡可能找出長度最長的符合文字。
  4. 貪婪量詞?逐步量詞,找出長度最短的符合文字。
  5. 貪婪量詞+,獨吐量詞,沒有任何文字符合。
  6. 邊界比較
  7. Pattern與Matcher
    • java.util.regex.Pattern實例是規則表示式在JVM中的代表對象,Pattern的構造函數被標示為private,必須通過Pattern的靜態方法compile()來取得。
    • 用matcher()方法指定要比較的字符串,這會返回java.util.regex.Matcher實例,表示對指定字符串的比較。
JDK8 API增強功能
  1. String新增join()靜態方法可以指定每個字符串間以逗號分隔進行連接。
  2. Arrays上新增parallelPrefix()、parallelSetAll()與parallelSort()方法.
  3. 對數組進行管線化操作:
    • 方法一是使用Arrays的asList()方法返回List,而后調用stream()方法取得Stream實例;
    • 另一個方法是使用Arrays的stream()方法,可以指定數組后返回Stream實例。
  4. CharSequence上新增了chars()和codePoints()方法,都是返回intStream。
  5. Math在JDK8中也新增了不少數學運行相關API。

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

本周教材問題均為教學指導中的問題:

  • 問題1:Logger/Level/Handler的關系

  • 解決方案:Java日志緩存機制這篇博客對這個問題做了很好的解釋,總結如下:

  • Logger:日志結構的基本單元。Logger 是以樹形結構存儲在內存中的,根節點為 root.com.test(如果存在)一定是 com.test.demo(如果存在)的父節點,即前綴匹配的已存在的 logger 一定是這個 logger 的父節點。這種父子關系的定義,可以為用戶提供更為自由的控制粒度。因為子節點中如果沒有定義處理規則,如級別 handler、formatter 等,那么默認就會使用父節點中的這些處理規則。

  • Level:JDK 中定義了 Off、Severe、Warning、Info、Config、Fine、Finer、Finest、All 九個日志級別,定義 Off 為日志最高等級,All 為最低等級。每條日志必須對應一個級別。級別的定義主要用來對日志的嚴重程度進行分類,同時可以用於控制日志是否輸出。

  • Handler:用來處理 LogRecord,默認 Handler 是可以連接成一個鏈狀,依次對 LogRecord 進行處理。

  • 問題2:理解貪婪模式,非貪婪模式,獨占模式

  • 解決方案:

    • 貪婪匹配:正則表達式一般趨向於最大長度匹配。
    • 非貪婪匹配:盡可能就少的匹配字符。
    • 獨占模式:同貪婪一樣匹配最長正則表達式盡可能長地去匹配字符串,一旦匹配不成功就會結束匹配。
  1. 編程中如何區分兩種模式
    • 默認是貪婪模式;在量詞后面直接加上一個問號就是非貪婪模式。

代碼調試中的問題和解決過程

本周代碼調試問題均為教學指導中的問題:

  • 問題1:p475 HandlerDemo.java: %h 從哪來的?還有什么其他模式字符串?
  • 解決方案:是程序配置操作記錄文件,(可是我沒找到自己電腦上的)%h表示代碼根目錄,%t代表系統暫存目錄,%g自動為文檔編號
  • 問題2:SplitDemo.java修改代碼,字符串改成csv,怎么分隔?
  • 解決方案:修改代碼段如下:
for (String token:"csv".split("")){
   System.out.println(token);
}    
  • 運行結果如下:

  • c語言實現思路:

s[]={我們輸入的字符串};
l=strlen(s);
for(i=0;i<l;i++){
    if(s[i]="分割條件")
        printf("\n");
    else
        printf("%s",s[i]);
}
  • 問題3:p491 PatternMatcherDemo.java中out.printf("%s find ", pattern.pattern())的作用?
  • 解決方案:用find將前后分開

代碼托管

代碼行數統計

上周考試錯題總結

  • 錯題1:下面哪些Linux 命令可以ASCII碼和16進制單字節方法輸出Hello.java的內容?
  • A .od -b -tx1 Hello.java
  • B .od -tcx1 Hello.java
  • C .od -tc -tx1 Hello.java
  • D .od -tbx1 Hello.java
  • 正確答案: B C
  • 解析:-b 是以八進制輸出
  • 錯題2:JDK8中的Lambda表達式有以下好處:
  • A .消除重復性
  • B .提高性能
  • C .提高安全性
  • D .改善可讀性
  • 正確答案: A D
  • 分析:我沒注意是多選題,少選了A選項
  • 錯題3:JDK8 中新時間API中,用於度量時間的類有()
  • A .Instant
  • B .Duration
  • C .Period
  • D .LocalDateTime
  • 正確答案: B C
  • 錯題4:A ________________ diagram helps us visualize the contents of and relationships among the classes of a program(___有助於我們查看程序中類的內容和它們之間的關系).
  • A .class and object(類和對象)
  • B .UML(UML類圖)
  • C .object-oriented(面向對象)
  • D .public
  • E .private
  • 正確答案: B
  • 錯題5:__________________ parameters are the values that are used when calling a method(___參數是調用方法時傳給方法的值).
  • A .formal(形式參數)
  • B .actual(實際參數)
  • C .useful(有用的參數)
  • D .informal(非正式參數)
  • E .none of the above(以上都不是)
  • 正確答案: B
  • 錯題6:An object can be thought of as a blueprint for a set of classes(對象被認為是類集合的藍圖).
  • A .true
  • B .false
  • 解析:類可以被看作是一組對象的藍圖,而不是另一種方式。
  • 錯題7:Which of the following objects could contain the information “eastern standard time”?(下面哪些類的對象會包含“東部標准時間”的信息)
  • (Choose all that apply.)
  • A .Instant
  • B .LocalDate
  • C .LocalDateTime
  • D .LocalTime
  • E .ZonedDateTime
  • 正確答案: E
  • 錯題8:What is the output of the following code?(下面代碼的運行結果是?)
LocalDate date = LocalDate.of(2018, Month.APRIL, 30);
date.plusDays(2);
date.plusYears(3);
System.out.println(date.getYear() + " "+
 date.getMonth() + " "+ date.getDayOfMonth());
  • A .2018 APRIL 2
  • B .2018 APRIL 30
  • C .2018 MAY 2
  • D .2021 APRIL 2
  • E .2021 APRIL 30
  • F .2021 MAY 2
  • G .A runtime exception is thrown.
  • 正確答案: B
  • 解析:日期開始為2018年4月30日。因為日期是不可變的,加上方法忽略返回值,結果不變。因此,選項B是正確的。
  • 錯題8:What is the output of the following code?(下面代碼的運行結果是?)
LocalDate date = LocalDate.of(2018, Month.APRIL, 40);
System.out.println(date.getYear() + " " + date.getMonth()
+ " "+ date.getDayOfMonth());
  • A .2018 APRIL 4
  • B .2018 APRIL 30
  • C .2018 MAY 10
  • D .Another date
  • E .The code does not compile.
  • F .A runtime exception is thrown.
  • 正確答案:F
  • 解析:如果無效的日期值通過,則引發異常。沒有第四十天四月或任何其他月份

結對及互評

點評過的同學博客和代碼

  • 本周結對學習情況
    • 20145226

    • 結對照片

    • 結對學習內容

      • 學習partner的代碼並作出點評
      • 學習partner的博客和自己的博客做對比,找出不足
  • 上周博客互評情況

其他(感悟、思考等,可選)

因為周末有其他事情,這周Java的學習時間提前了很多,不拖到周末學習反而感到心里輕松很多,果然周末就是不適合學習!但是發現很多前面的知識都還沒完全掌握,這將是未來學習需要努力的地方。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 50/100 1/1 24/24 安裝學習Java的一系列軟件
第二周 250/300 1/2 30/54 了解Java的基本語法
第三周 552/852 1/3 16/60 了解Java是面向對象的語言
第四周 717/1569 1/4 10/70 了解Java繼承與接口
第五周 495/2064 1/5 6/76 了解異常處理,學會使用Collection收集對象
第六周 754/2818 1/6 6/82 了解串流和線程
第七周 679/3493 2/8 5/87 了解時間與日期,掌握Date和Calendar的一些用法
第八周 352/3845 1/9 8/95 了解並會使用通用API
  • 計划學習時間:6小時

  • 實際學習時間:8小時

參考資料


免責聲明!

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



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