2.25k likes | 2.38k Views
第 17 章. Java 標準類別庫. 本章提要. 17-1 甚麼是 Java 標準類別庫? 17-2 基本資料類別 17-3 Math 類別 17-4 Java Collection 17-5 綜合演練. 前言.
E N D
第 17 章 Java 標準類別庫
本章提要 • 17-1 甚麼是 Java 標準類別庫? • 17-2 基本資料類別 • 17-3 Math 類別 • 17-4 Java Collection • 17-5 綜合演練
前言 • 前幾章開始接觸到 Java 平台提供的各種功能, 像是執行緒、例外處理、串流類別等。這些功能都是內建在 Java 標準類別庫 (Standard Class Library) 中, 或是稱為 Java API (Application Programming Interfaces, 應用程式介面), 只要在程式中使用這些現成的類別及方法, 就可進行複雜的工作, 例如用 BufferedReader 以緩衝式讀取的方式讀取檔案或鍵盤輸入。
前言 • Java 提供的功能當然不是只有剛剛提到的幾種, 本章將介紹更多實用的 Java API, 方便您撰寫各式各樣的 Java 程式, 利用程式來解決各式各樣的問題。
17-1 甚麼是 Java 標準類別庫? • 到目前為止, 已學到的大多屬於 Java 程式語言的部份, 包括變數、運算式、流程控制等基本語法要素, 以及物件導向的語法:類別、繼承等等。不過 Java 語言要發揮功能必須有個可供 Java 程式執行的 Java Platform (Java 平台) 環境。 • Java Platform 包含兩大部份: • JVM • Java API
甚麼是 Java 標準類別庫? • JVM 提供一個讓 Java bytecode 程式執行的環境, 而 Java API 則是一套內含相當多類別、介面定義的集合, 同一種 Java Platform 所提供的 Java API 種類、數量都相同, 所以可稱之為 Java 標準類別庫 (Standard Class Library)。我們也能從 Java 標準類別庫這個 Java 程式設計人員專用的倉庫中, 找到各式各樣的類別來使用, 讓程式發揮不一樣的功能。
甚麼是 Java 標準類別庫? • Java 標準類別庫中的類別, 已依其屬性適當分成多種不同的套件, 以 J2SE (Java 2 Standard Edition) 這個 Java Platform 為例, 其 Java API 部份提供了如下圖所示的多種套件:
甚麼是 Java 標準類別庫? • 每個套件名稱也都暗示了其功能及用途, 像是前一章介紹的 java.io 套件就是有關輸入與輸出的類別集合;而圖中的 Security 所指的 java.security 套件, 則是與安全性有關的類別集合。
甚麼是 Java 標準類別庫? • 在眾多的套件中, 有關圖形使用者介面及繪圖的幾個套件, 例如在上圖可看到的 Swing、AWT、Java 2D 等, 又合稱為 Java Foundation Classes (簡稱JFC)。 • 如圖示, Java API 的內容相當多, 也不是一本入門書籍可介紹得完的, 因此本書只能做重點式的介紹。前一章我們介紹過 java.io 套件中的輸出入類別和介面, 本章則要介紹以下兩個套件中一些實用的類別:
甚麼是 Java 標準類別庫? • java.lang:顧名思義, 此套件包含的是對 Java 語言最基本的核心類別, 其中包括我們已學過的字串、執行緒、及例外類別, 都屬於此套件。而本章要介紹的則是可讓我們處理數字的 Math 類別, 以及可用來包裝基本資料型別的基本資料類別。
甚麼是 Java 標準類別庫? • java.util:這個套件有如 Java 程式設計的萬用工具箱, 提供了開發各種程式都可能會用到的輔助性類別, 其中最重要的一群類別就是所謂的 collection 類別, 這群類別包含了可代表、處理多種資料結構的類別, 對撰寫應用程式很有幫助, 因此本章也將介紹如何使用這些 collection 類別。
查看 Java API 文件 • 當然在整個 Java API 中還有很多功能強大且實用的類別, 也許您會發現有某個套件對解決您的問題更有幫助。 • 若您想認識 Java API 中到底有哪些套件、類別可使用, 建議直接連上昇陽公司的 Java 線上文件網站 (http://java.sun.com/docs/) 一探究竟:
17-2 基本資料類別 • 第 11 章提過, java.lang 中有一組特別的類別, 是專用於以物件的方式包裝 Java 基本資料型別, 所以可稱之為基本資料類別或包裝類別 (type-wrapper class, wrapper class, object wrapper)。為什麼要用物件的方式包裝基本型別呢?
基本資料類別 • 因為在某些狀況下, 您要處理的雖然是整數、浮點數等資料型別, 但要利用的工具卻只接受物件形式的資料, 此時就要先將基本資料型別包裝成物件再來進行處理, 在 17-4 節要介紹的 Java Collection 就是這類工具的代表性範例。
基本資料類別 • 此外這些類別也提供許多實用的方法, 讓我們方便進行資料格式的轉換, 例如我們每次從鍵盤取得輸入的字串, 就會呼叫這些方法將字串轉換成所需的格式 (像是 Integer.parseInt() 方法)。本節我們先來進一步認識這些包裝類別, 每個基本資料型別都有其對應的包裝類別, 如下:
基本資料類別 • 除了 Boolean、Character 外, 其它幾個類別都是 Number 這個抽象類別的子類別。而且這幾個用來存放數值的類別, 都有提供一組相似的方法 (例如常用的 parseInt()、parseDouble() 等)。 • 基本資料類別有個重要的特性不可不知:包裝成物件的數值或字元等, 其值是無法改變的。
基本資料類別 • 一方面是這些類別都沒有提供修改其物件內含值的方法;再者基本資料類別都是 final 類別, 所以我們也不能從其衍生可更改數值的新類別。 • 這樣的設計其實是可以理解的, 畢竟使用基本資料型別的變數已非常方便, 平常不需多費一道工夫將它們包裝成物件來用。 • 以下我們就先來看如何建立包裝類別的物件及取出物件中的資料。
建構方法 • 建立基本資料類別的物件, 就相當於將基本資料型別的變數值裝到物件中。建立的方法很簡單, 就是直接以變數、字面常數呼叫類別的建構方法, 例如建立一個 Boolean 物件可用如下的程式:
關於各類別的建構方法 • Character 類別的建構方法只接受字元型別的參數。 • Boolean、Byte、Double、Integer、Long、Short 類別的建構方法, 只接受其對應型別的變數、字面常數或字串為參數。例如上述的例子中, 就用布林變數和字串建立 Boolean 類別的物件。
關於各類別的建構方法 • Float 除了能用 float 型別和字串為建構方法的參數, 也能直接用 double 型別的變數當參數呼叫建構方法, 不需自行將參數做強制型別轉換。
取得物件的值 • 當我們將基本資料型別包裝成物件後, 可透過類別所提供的多種方法, 將其值取出使用。這些類別至少都提供一種 XXXValue() 方法可傳回物件的值, 其中 XXX 需代換為基本資料型別的名稱, 例如 Boolean 物件可使用 booleanValue() 方法、Character 物件可使用 charValue() 方法。
取得物件的值 • 至於各 Number 類別的子類別就較具彈性, 它們的物件可呼叫下列傳回數值型別的方法, 因為這些方法都是繼承自 Number 抽象類別, 這些方法包括:
取得物件的值 • 使用上列方法時要注意, 對範圍較大的物件 (例如 Double), 取其較小範圍的基本資料型別 (byte), 就可能發生無法表示的情形, 請參考以下範例程式:
取得物件的值 • 第 7、8 行分別建立 Integer、Double 類別物件。 • 第 11、14 行分別以基本資料類別的物件為參數, 呼叫自訂的 showall() 方法進行示範。
取得物件的值 • 第 17〜25 行自訂的 showall() 方法, 只是單純呼叫各類別的 xxxValue() 方法並輸出結果。此方法宣告的參數為 Number 類別的物件, 所以程式中可用 Integer、Double 類別的物件為參數呼叫之。
取得物件的值 • 如執行結果所示, 當物件的數值超出取值方法傳回的基本資料型別所能表示的範圍時, 經常會出現不可預期的結果。例如上例中的 123456789 轉成 byte 和 short 時分別變成 21、-13035, 而轉成 float 型別時, 也產生一點誤差變成 1.23456792E8 (相當於 123456792)。
取得物件的值 • 至於倒數第 4 個輸出的 Infinity, 則是 Java 特別定義的常數, 代表無限大的意思 (因為 5.376543e200 遠超過 float 可表示的範圍), 以下就來認識基本資料類別中所定義的常數值。
基本資料類別的常數 • 除了 Boolean 類別外, 其它幾個基本資料類別都有定義至少 3 個 static 變數, 用以表示一些常數值。其中最普通的一類常數, 就是表示各基本資料型別的數值範圍 (可表示的最大值及最小值), 以及各型別的大小 (所佔的位元數)。各型別的這 3 個常數值如下表所示:
基本資料類別的常數 • 除此之外, 浮點數的 Float、Double 類別, 分別各有 3 個代表極限值及非數值 (Not-a-Number, NaN) 等特殊值的 static 變數:
基本資料類別與字串 • 從字串建立類別物件:此類方法和前面介紹的建構方法有點像, 可將一字串轉成數值型的類別物件。但建構方法的字串只能用十進位表示, 而以下要介紹的方法不但可接受以不同數字系統表示的字串, 而且是屬於 static 方法。 • 從類別物件產生字串:各資料類別物件都可呼叫特定方法將其值轉成字串表示。
基本資料類別與字串 • 將基本資料型別轉成字串:這類是各類別提供的 static 方法, 可用來將各基本資料型別轉成字串表示。 • 將字串轉成基本資料型別:同樣是 static 方法, 而且我們已用過多次, 每次由鍵盤取得輸入時的用的 Integer.parseInt()、Double.parseDouble() 就屬此類。
從字串建立類別物件 • 除了 Character 類別外, 各基本資料類別至少都提供一個 static 的 valueOf() 方法, 只要以適當格式的字串呼叫之, 即可傳回該類別的物件。例如:
從字串建立類別物件 • 整數型類別除了有類似上列的 valueOf() 方法, 還有個多重定義的版本可指定此字串所採的數字系統:
從字串建立類別物件 • 第 7〜10 行宣告 4 個以不同數字系統表示的數字字串。 • 第 12〜15 行分別呼叫各整數型類別的 valueOf() 方法將字串轉換成數字物件, 並輸出結果。
從字串建立類別物件 • 使用 valueOf() 方法時要特別注意:如果字串內容不符合數字格式、或是數字超出物件可表示的範圍 (例如在上列程式中將 str16 轉成 Byte 物件), 都會引發 NumberFormatException 例外。
將類別物件、資料型別轉成字串 • 在第 11 章已提過所有基本資料類別都有實作各自的 toString() 方法, 可將物件轉換成字串表示, 所以我們能在 print()、println() 方法中直接將之輸出, 或者轉成字串來處理。 • 除了將物件轉成字串外, 各數值型的類別也還另外提供一個 static 的 toString() 方法, 可將其對應的基本資料型別變數轉換成字串。
將類別物件、資料型別轉成字串 • 各類別的 toString() 方法都只能將數值轉成 10 進位制的字串表示, 若想轉成 2 進位、8 進位、16 進位、甚至於其它數字系統等方式來表示, 則可使用只有 Integer、Long 類別才提供的下列方法: