Java基礎(chǔ)類庫
本章思維導(dǎo)圖

用戶互動(dòng)
使用Scanner獲取鍵盤輸入
- Scanner主要提供了兩個(gè)方法來掃描輸入
-
hasNextXxx();- 是否還有下一個(gè)輸入項(xiàng),其中
Xxx可以是int、long等代表基本數(shù)據(jù)類型的字符串。
- 是否還有下一個(gè)輸入項(xiàng),其中
-
nextXxx();- 獲取下一個(gè)輸入項(xiàng)。
Xxx的含義與前一個(gè)方法中的Xxx相同。
- 獲取下一個(gè)輸入項(xiàng)。
-
默認(rèn)情況下,Scanner使用空白(空格、Tab、回車)作為多個(gè)輸入項(xiàng)之間的分隔符。
如果希望改變Scanner的分隔符,使用方法useDelimiter(String pattern);
Scanner的讀取操作可能被阻塞,Scanner的hasNext();和next();方法都有可能阻塞,hasNext();方法是否阻塞與和其相關(guān)的next();方法是否阻塞無關(guān)
為Scanenr設(shè)置分隔符使用useDelimiter(String pattern);方法即可,該方法的參數(shù)應(yīng)該是一個(gè)正則表達(dá)式
-
Scanner提供了兩個(gè)簡(jiǎn)單的方法來逐行讀取
-
boolean hasNextLine();- 返回輸入源中是否還有下一行
-
String nextLine();- 返回輸入源中下一行的字符串
-
-
Scanner不僅能讀取用戶的鍵盤輸入,還可以讀取文件輸入。
- 只要在創(chuàng)建Scanner對(duì)象時(shí)傳入一個(gè)
File對(duì)象作為參數(shù),就可以讓Scanner讀取該文件的內(nèi)容。
- 只要在創(chuàng)建Scanner對(duì)象時(shí)傳入一個(gè)
系統(tǒng)相關(guān)
System類
System類代表當(dāng)前Java程序的運(yùn)行平臺(tái),程序不能創(chuàng)建System類的對(duì)象,System類提供了一些類變量和類方法,允許直接通過System類來調(diào)用這些類變量和類方法。
- System類提供了代表標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出的類變量,并提供了一些靜態(tài)方法用于訪問環(huán)境變量、系統(tǒng)屬性的方法,還提供了加載文件和動(dòng)態(tài)鏈接庫的方法。
-
加載文件和動(dòng)態(tài)鏈接庫主要對(duì)
native方法有用,對(duì)于一些特殊的功能(如訪問操作系統(tǒng)底層硬件設(shè)備等)Java程序無法實(shí)現(xiàn),必須借助C語言來完成,此時(shí)需要C語言為Java方法提供實(shí)現(xiàn)。- Java程序中聲明native修飾的方法,類似于
abstract方法,只有方法簽名,沒有實(shí)現(xiàn)。編譯該Java程序,生產(chǎn)一個(gè)class文件。
- Java程序中聲明native修飾的方法,類似于
- 用
javah編譯第1步生產(chǎn)的class文件,將生產(chǎn)一個(gè).h文件。
- 用
- 寫一個(gè)
cpp文件實(shí)現(xiàn)native方法,這一步需要包含第2步產(chǎn)生的.h文件(這個(gè).h文件中包含了JDK帶的jni.h文件)。
- 寫一個(gè)
- 將第3步的
.cpp文件編譯成動(dòng)態(tài)鏈接庫文件。
- 將第3步的
- 在Java中用System類活動(dòng)
loadLibrary..()方法或Runtime類的loadLibrary()方法加載第4步產(chǎn)生的動(dòng)態(tài)鏈接庫文件,Java程序中就可以調(diào)用這個(gè)native方法了。
- 在Java中用System類活動(dòng)
-
加載文件和動(dòng)態(tài)鏈接庫主要對(duì)
調(diào)用System類的getenv()、getProperties()、getProperty()等方法來訪問程序所在平臺(tái)的環(huán)境變量和系統(tǒng)屬性。
System類提供了通知系統(tǒng)進(jìn)行垃圾回收的gc()方法,以及通知系統(tǒng)進(jìn)行資源清理的runFinalization()方法。
- System類還有兩個(gè)獲取系統(tǒng)當(dāng)前時(shí)間的方法
currentTimeMillis();nanoTime();- 它們都返回一個(gè)
long型整數(shù);實(shí)際上它們都返回當(dāng)前時(shí)間與UTC1970年1月1日午夜的時(shí)間差,前者以毫秒作為單位,后者以納秒作為單位。 - 這兩個(gè)方法返回的時(shí)間粒度取決于底層的操作系統(tǒng),可能所在的操作系統(tǒng)根本不支持以毫秒、納秒作為計(jì)時(shí)單位。
- 許多操作系統(tǒng)以幾十毫秒為單位測(cè)量時(shí)間,
currentTimeMillis()方法不可能返回精確的毫秒數(shù);而nanoTime()方法很少用,因?yàn)榇蟛糠植僮飨到y(tǒng)都不支持使用納秒作為計(jì)時(shí)單位。
System類的in、out、err分別代表系統(tǒng)的標(biāo)準(zhǔn)輸入(通常是鍵盤輸入)、標(biāo)準(zhǔn)輸出(通常是顯示器)和錯(cuò)誤輸出流,并提供了setIn()、setOut()和setErr()方法來改變系統(tǒng)的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出流。
System類還提供了一個(gè)identityHashCode(Object x);方法,該方法返回指定對(duì)象的精確hashCode值,根據(jù)該對(duì)象的地址計(jì)算得到的hashCode值。
Runtime類與java9的ProcessHandle
Runtime類代表Java程序運(yùn)行時(shí)的環(huán)境,每個(gè)Java程序都有一個(gè)與之對(duì)應(yīng)的Runtime實(shí)例,應(yīng)用程序通過該對(duì)象與其運(yùn)行時(shí)環(huán)境相連。
應(yīng)用程序不能創(chuàng)建自己的Runtime實(shí)例,但可以通過getRuntime()方法獲取與之關(guān)聯(lián)的Runtime對(duì)象。
Runtime類也提供了gc()方法或runFinalization()方法來通知系統(tǒng)進(jìn)行垃圾回收、清理系統(tǒng)資源,并提供了load(String filename)和loadLibrary(String libname)方法來加載文件和動(dòng)態(tài)鏈接庫。
- Runtime類部分方法
availableProcessors();freeMemory();totalMemory();maxMemory();exec();
通過exec啟動(dòng)平臺(tái)上的命令之后,它就變成了一個(gè)進(jìn)程,Java使用Process來代表進(jìn)程。
Java9新增了一個(gè)ProcessorHandle接口,通過該接口可獲取進(jìn)程的ID、父進(jìn)程和后代進(jìn)程;通過該接口的onExit()方法可在進(jìn)程結(jié)束時(shí)完成某些行為。
ProcessorHandle還提供了一個(gè)ProcessorHandle.Info類,用于獲取進(jìn)程的命令、參數(shù)、啟動(dòng)時(shí)間、累計(jì)運(yùn)行時(shí)間、用戶等信息。
常用類
Object類
- 常用方法
-
boolean equals(Object obj);- 判斷指定對(duì)象與該對(duì)象是否相等。
-
protected void finalize();- 當(dāng)系統(tǒng)中沒有引用變量引用到該對(duì)象時(shí),垃圾回收器調(diào)用此方法來清理該對(duì)象的資源。
-
Class<?> getClass();- 返回該對(duì)象的運(yùn)行時(shí)類。
-
int hashCode();- 返回該對(duì)象的hashCode值。
-
String toString();- 返回該對(duì)象的字符串表示。
-
Java還提供了一個(gè)protected修飾的clone()方法,該方法用于幫助其他對(duì)象實(shí)現(xiàn)自我克隆,就是得到一個(gè)當(dāng)前對(duì)象的副本,而且二者之間完全隔離。
- 自定義類實(shí)現(xiàn)克隆的步驟
- 自定義類實(shí)現(xiàn)
Cloneable接口。這是一個(gè)標(biāo)記行性的接口,實(shí)現(xiàn)接口的對(duì)象可以實(shí)現(xiàn)自我克隆,接口里沒有定義任何方法。
- 自定義類實(shí)現(xiàn)
- 自定義類實(shí)現(xiàn)自己的
clone()方法。
- 自定義類實(shí)現(xiàn)自己的
- 實(shí)現(xiàn)
clone()方法時(shí)通過super.clone();調(diào)用Object實(shí)現(xiàn)的clone()方法來得到該對(duì)象的副本,并返回副本。
- 實(shí)現(xiàn)
Object類提供的Clone機(jī)制只對(duì)對(duì)象里各實(shí)例變量進(jìn)行簡(jiǎn)單復(fù)制,如果實(shí)例變量的類型是引用類型,Object的Clone機(jī)制也只是簡(jiǎn)單地復(fù)制這個(gè)引用變量,這樣原有對(duì)象的引用類型的實(shí)例變量與克隆對(duì)象的引用類型的實(shí)例變量依然指向內(nèi)存中的同一個(gè)實(shí)例。
Object類的clone()方法只是一種淺克隆,只克隆該對(duì)象的所有成員變量值,不會(huì)對(duì)引用類型的成員變量值所引用的對(duì)象進(jìn)行克隆。
如果需要對(duì)對(duì)象進(jìn)行深克隆,則需要進(jìn)行遞歸克隆,保證所有引用類型的成員變量值所引用的對(duì)象都被復(fù)制了。
Objects類
Java7新增的一個(gè)類,提供了一些工具方法來操作對(duì)象,這些工具方法大多是空指針安全的。
Java為工具類的命名習(xí)慣是添加一個(gè)字母s,比如操作數(shù)組的工具類是Arrays,操作集合的工具類是Collections。
Java9改進(jìn)的String、StringBuffer和StringBuilder類
Java提供了String、StringBuffer和StringBuilder三個(gè)類來封裝字符串,并提供了一系列方法來操作字符串對(duì)象。
String類是不可變類,即一旦一個(gè)String對(duì)象被創(chuàng)建以后,包含在這個(gè)對(duì)象的字符序列是不可改變的,直至這個(gè)對(duì)象被銷毀。
StringBuffer對(duì)象則代表一個(gè)字符序列可變的字符串,當(dāng)一個(gè)StringBuffer被創(chuàng)建以后,通過StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法改變這個(gè)字符串對(duì)象的字符序列。一旦通過StringBuffer生產(chǎn)了最終想要的字符串,就可以調(diào)用它的toString()方法將其轉(zhuǎn)換為一個(gè)String對(duì)象。
StringBuilder類是JDK1.5新增的類,它也代表可變字符串對(duì)象。StringBuffer和StringBuilder基本相似,兩個(gè)類的構(gòu)造器和方法也基本相同。不同的是,StringBuffer是線程安全的,而StringBuilder則沒有實(shí)現(xiàn)線程安全功能,所以性能略高。
String、StringBuffer、StringBuilder都實(shí)現(xiàn)了CharSequence接口,因此CharSequence可認(rèn)為是一個(gè)字符串的協(xié)議接口。
-
String類提供了大量構(gòu)造器來創(chuàng)建String對(duì)象
-
String():創(chuàng)建了一個(gè)包含0個(gè)的字符串序列的String對(duì)象。 -
String(byte[] bytes, Charset charset):使用指定的字符集將指定的byte[]數(shù)組解碼成一個(gè)新的String對(duì)象。 -
String(byte[] bytes, int offset, int length):使用平臺(tái)默認(rèn)的字符集將指定的byte[]數(shù)組從offset開始、長(zhǎng)度為length的子數(shù)組解碼成一個(gè)新的String對(duì)象。 -
String(byte[] bytes, int offset, int length, String charsetName):使用指定的字符集將指定的byte[]數(shù)組從offset開始、長(zhǎng)度為length的子數(shù)組解碼成一個(gè)新的String對(duì)象。 -
String(byte[] bytes, String charsetName):使用指定的字符集將指定的byte[]數(shù)組解碼成一個(gè)新的String對(duì)象。 -
String(char[] value, int offset, int count):將指定的字符數(shù)組從offset開始、長(zhǎng)度為count的字符元素連綴成字符串。 -
String(String original):根據(jù)字符串直接量來創(chuàng)建一個(gè)String對(duì)象。 -
String(StringBuffer buffer):根據(jù)StringBuffer對(duì)象來創(chuàng)建對(duì)應(yīng)的String對(duì)象。 -
String(StringBuilder builder):根據(jù)StringBuilder對(duì)象來創(chuàng)建對(duì)應(yīng)的String對(duì)象。
-
-
String類也提供了大量方法來操作字符串對(duì)象
-
char charAt(int index):獲取字符串中指定位置的字符。 -
int compareTo(String anotherString):比較兩個(gè)字符串的大小。如果兩個(gè)字符串的字符序列相等,則返回0;不相等時(shí),從兩個(gè)字符串第0個(gè)字符開始比較,返回第一個(gè)不相等的字符差。另一種情況,較長(zhǎng)字符串的前面部分恰巧是較短的字符串,則返回它們的長(zhǎng)度差。 -
String concat(String str):將該String對(duì)象和str連接在一起。 -
boolean contentEquals(StringBuffer sb):將該對(duì)象與StringBuffer對(duì)象sb進(jìn)行比較,當(dāng)它們包含的字符序列相同時(shí)返回true。 -
static String copy ValueOf(char[] data):將字?jǐn)?shù)組連綴成字符串。 -
static String copyValueOf(char[] data, int offset, int count):將char數(shù)組的子數(shù)組中的元素連綴成字符串。 -
boolean endsWith(String suffix):返回該String對(duì)象是否以suffix結(jié)尾。 -
boolean equals(Object anObject):將字符串與指定對(duì)象比較,如果二者包含的字符序列相等,則返回true,否則返回false。 -
boolean equalsIgnoreCase(String str):將字符串與str忽略大小寫比較。 -
byte[] getBytes():將該String對(duì)象轉(zhuǎn)換成byte數(shù)組。 -
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):該方法將字符串中從srcBegin開始,到srcEnd結(jié)束的字符復(fù)制到dst字符數(shù)組中,其中dstBegin為目標(biāo)字符數(shù)組的起始復(fù)制位置。 -
int indexOf(int ch, int fromIndex):找出ch字符在該字符串中從fromIndex開始第一次出現(xiàn)的位置。 -
int indexOf(String str):找出str子字符串在該字符串中第一次出現(xiàn)的位置。 -
int indexOf(String str, int fromIndex):找出str子字符串在該字符串中從fromIndex開始第一次出現(xiàn)的位置。 -
int lastIndexOf(int ch):找出ch字符在該字符串中最后一次出現(xiàn)的位置。 -
int lastIndexOf(int ch, int fromIndex):找出ch字符中從fronIndex在該字符串中最后一次出現(xiàn)的位置。 -
int lastIndexOf(String str):找出str子字符串在該字符串中最后一次出現(xiàn)的位置。 -
int lastIndexOf(String str, int fromIndex):找出str子字符串在該字符串中從fromIndex開始后最后一次出現(xiàn)的位置。 -
int length():返回當(dāng)前字符串長(zhǎng)度。 -
String replace(char oldChar, char newChar):將字符串中第一個(gè)oldChar替換成newChar。 -
boolean startsWith(String prefix):該String對(duì)象是否以prefix開始。 -
boolean startsWith(String prefix, int toffset):該String對(duì)象從toffset位置算起,是否以prefix開始。 -
String substring(int beginIndex):獲取從beginIndex位置開始到結(jié)束的字符串。 -
String substring(int beginIndex, int endIndex):獲取從beginIndex位置開始到endIndex位置的子字符串。 -
char[] toCharArray():將該String對(duì)象轉(zhuǎn)換成char數(shù)組。 -
String toLowerCase():將字符串轉(zhuǎn)換成小寫。 -
String toUpeprCase():將字符串轉(zhuǎn)換成大寫。 -
static String valueOf(X x):一系列用于將基本類型值轉(zhuǎn)換為String對(duì)象的方法。
-
-
StringBuffer、StringBuilder有兩個(gè)屬性:
length和capacity。- 其中
length屬性表示其包含的字符串序列的長(zhǎng)度。與String對(duì)象不同的是,StringBuffer、StringBuilder的length是可以改變的,可以通過length()、setLength(int len)方法來訪問和修改其字符序列的長(zhǎng)度。 -
capacity屬性表示StringBuilder的容量,capacity通常比length大,程序通常無需關(guān)心capacity屬性。
- 其中
Math類
Math類是一個(gè)工具類,它的構(gòu)造器被定義成private的,因此無法創(chuàng)建Math類的對(duì)象;Math類中的所有方法都是類方法;還提供了的兩個(gè)類變量PI和E。
ThreadLocalRandom與Random
Random類專門用于生成一個(gè)偽隨機(jī)數(shù),它有兩個(gè)構(gòu)造器:一個(gè)構(gòu)造器使用默認(rèn)的種子(以當(dāng)前時(shí)間作為種子),另一個(gè)構(gòu)造器需要顯式傳入一個(gè)long型整數(shù)的種子。
ThreadLocalRandom類是Java7新增的一個(gè)類,它是Random的增強(qiáng)版。在并發(fā)訪問的環(huán)境下,使用ThreadLocalRandom來代替Random可以減少多線程資源競(jìng)爭(zhēng),最終保證系統(tǒng)具有更好的線程安全性。
ThreadLocalRandom類的用法和Random類的用法基本相似,它提供了一個(gè)靜態(tài)的current()方法來獲取ThreadLocalRandom對(duì)象,獲取該對(duì)象之后即可調(diào)用各種nextXxx()方法來獲取偽隨機(jī)數(shù)。
Random使用一個(gè)48位的種子,如果這個(gè)類的兩個(gè)實(shí)例都是用同一個(gè)種子創(chuàng)建的,對(duì)它們以同樣的順序調(diào)用方法,則它們會(huì)產(chǎn)生相同的數(shù)字序列。
為避免兩個(gè)Random對(duì)象產(chǎn)生相同的數(shù)字序列,通常推薦使用當(dāng)前時(shí)間作為Random對(duì)象的種子:System.currentTimeMillis();
BigDecimal類
float、double兩種基本浮點(diǎn)類型的浮點(diǎn)數(shù)容易引起精度丟失。
為了精確表示、計(jì)算浮點(diǎn)數(shù),Java提供了BigDecimal類,該類提供了大量的構(gòu)造器用于創(chuàng)建BigDecimal對(duì)象,包括把所有的基本數(shù)值類型變量轉(zhuǎn)換成一個(gè)BigDecimal對(duì)象,包括利用數(shù)字字符串、數(shù)字字符數(shù)組來創(chuàng)建BigDecimal對(duì)象。
不推薦使用BigDecimal(double val);構(gòu)造器來創(chuàng)建對(duì)象,而是BigDecimal(String val);或BigDecimal.valueOf(double value);靜態(tài)方法來創(chuàng)建BigDecimal對(duì)象。
BigDecimal類提供了add()、subtract()、multiply()、divide()、pow()等方法對(duì)精確浮點(diǎn)數(shù)進(jìn)行常規(guī)算術(shù)運(yùn)算。
日期、時(shí)間類
Date類
Java提供了Date類來處理日期、時(shí)間,Date對(duì)象既包含日期,也包含時(shí)間。
Date類從JDK1.0起就開始存在了,但正因?yàn)樗鼩v史悠久,所以它的大部分構(gòu)造器、方法都已經(jīng)過時(shí),不在推薦使用了。
Date類提供了6個(gè)構(gòu)造器,其中4個(gè)已經(jīng)Deprecated(Java不在推薦使用,使用不再推薦的構(gòu)造器時(shí)編譯會(huì)提出警告信息,并導(dǎo)致程序性能、安全性能等方面的問題),剩下的兩個(gè)構(gòu)造器:
-
Date():生成一個(gè)代表當(dāng)前日期時(shí)間的Date對(duì)象。該構(gòu)造器在底層調(diào)用System.currentMillis()獲得long整數(shù)作為日期參數(shù)。 -
Date(long date):根據(jù)指定的long型整數(shù)來生成一個(gè)Date對(duì)象。該構(gòu)造器的參數(shù)表示創(chuàng)建的Date對(duì)象和GMT1970年1月1日00:00:00之間的時(shí)間差,以毫秒作為計(jì)時(shí)單位。
Date對(duì)象的大部分方法也Deprecated了,剩下為數(shù)不多的幾個(gè)方法:
-
boolean after(Date when):測(cè)試該日期是否在指定日期when之后。 -
boolean before(Date when):測(cè)試該日期是否在指定日期when之前。 -
long getTime():返回該時(shí)間對(duì)應(yīng)的long型整數(shù),即從GMT1970-01-01 00:00:00到該Date對(duì)象之間的時(shí)間差,以毫秒作為計(jì)時(shí)單位。 -
void setTime(long time):設(shè)置Date對(duì)象的時(shí)間。
總體來說,Date是一個(gè)設(shè)計(jì)相當(dāng)糟糕的類,Java官方推薦盡量少用Date的構(gòu)造器和方法。
Calendar類
由于Date類在設(shè)計(jì)上存在一些缺陷,所以Java提供了Calendar類來更好地處理日期和時(shí)間。
Calendar類本身是一個(gè)抽象類,它是所有日歷類的模板,并提供了一些所有日歷通用的方法;但它本身不能直接實(shí)例化,程序只能創(chuàng)建Calendar子類的實(shí)例,Java本身提供了一個(gè)GregorianCalendar類,一個(gè)代表格里高利日歷的子類,它代表了通常所說的公歷。
Calendar類是一個(gè)抽象類,所以不能使用構(gòu)造器來創(chuàng)建Calendar對(duì)象。但它提供了幾個(gè)靜態(tài)getInstance()方法來獲取Calendar對(duì)象,這些方法根據(jù)TimeZone、Locale類來獲取特定的Calendar,如果不指定TimeZone、Locale,則使用默認(rèn)的TimeZone、Locale來創(chuàng)建Calendar。
Calendar和Date都是表示日期的工具類,他們直接可以自由轉(zhuǎn)換。
Calendar類提供了大量訪問、修改日期時(shí)間的方法:
-
void add(int field, int amount):根據(jù)日歷的規(guī)則,為給定的日歷字段添加或減去指定的時(shí)間量。 -
int get(int field):返回指定日歷字段的值。 -
int getActualMaximum(int field):返回指定日歷字段可能擁有的最大值。 -
int getActualMinimum(int field):返回指定日歷字段可能擁有的最小值。 -
void set(int field, int value):為給定的日歷字段設(shè)置為給定值。 -
void set(int year, int month, int date):設(shè)置Calendar對(duì)象的年、月、日三個(gè)字段的值。 -
void set(int year, int month, int date, int hourOfDay, int minute, int second):設(shè)置Calendar對(duì)象的年、月、日、時(shí)、分、秒6個(gè)字段的值。
上面的很多方法都需要一個(gè)int類型的field參數(shù),field是Cakendar類的類變量,如Calendar.YEAR、Calendar.MONTH等分別代表了年、月、日、小時(shí)、分鐘、秒等時(shí)間字段。
Calendar.MONTH字段代表月份,月份的起始值不是1,而是0。
Calendar類的注意點(diǎn):
-
add與roll的區(qū)別-
add(int field, int amount)的功能非常強(qiáng)大,add主要用于改變Calendar的特定字段的值。有兩條規(guī)則:- 當(dāng)被修改的字段超出它允許的范圍時(shí),會(huì)發(fā)生進(jìn)位,即上一級(jí)字段也會(huì)增大。
- 如果下一級(jí)字段也需要改變,那么該字段會(huì)修正到變化最小的值。
-
roll()的規(guī)則與add()的處理規(guī)則不同:當(dāng)被修改的字段超出它允許的范圍時(shí),上一級(jí)字段不會(huì)增大;下一級(jí)字段的處理規(guī)則與add()相似。
-
- 設(shè)置
Calendar的容錯(cuò)性- Calendar有兩種解釋日歷字段的模式:
lenient模式和non-lenient模式。當(dāng)處于lenient模式時(shí),每個(gè)時(shí)間字段可接受超過它允許范圍的值;當(dāng)處于non-lenient模式時(shí),如果為某個(gè)時(shí)間字段設(shè)置的值超出了它允許的取值范圍,程序?qū)?huì)拋出異常。
- Calendar有兩種解釋日歷字段的模式:
-
set()方法延遲修改-
set(f, value)方法將日歷字段f更改為value,此處它還設(shè)置了一個(gè)內(nèi)部成員變量,以指示日歷字段f已經(jīng)被更改。盡管日歷字段f是立即更改的,但該Calendar所代表的時(shí)間不會(huì)立即修改,直到下次調(diào)用get()、getTime()、getTimeInMillis()、add()或roll()時(shí)才會(huì)重新計(jì)算日歷的時(shí)間。
-
Java8新增的日期、時(shí)間包
Java8新增了一個(gè)java.time包,該包包含如下常用類:
-
Clock:該類用于獲取指定時(shí)區(qū)的當(dāng)前日期、時(shí)間。該類可取代System類的currentTimeMillis()方法,而且提供了更多方法來獲取當(dāng)前日期、時(shí)間。該類提供了大量靜態(tài)方法來獲取Clock對(duì)象。 -
Duration:該類代表持續(xù)時(shí)間。該類可以非常方便地獲取一段時(shí)間。 -
Instant:代表一個(gè)具體的時(shí)刻,可以精確到納秒。該類提供了靜態(tài)的now()方法來獲取當(dāng)前時(shí)刻,也提供了靜態(tài)的now(Clock clock)方法來獲取clock對(duì)應(yīng)的時(shí)刻。除此之外,它還提供了一系列minusXxx()方法在當(dāng)前時(shí)刻基礎(chǔ)上減去一段時(shí)間,也提供了plusXxx()方法在當(dāng)前時(shí)刻基礎(chǔ)上加上一段時(shí)間。 -
LocalDate:該類代表不帶時(shí)區(qū)的日期,例如1999-10-30。該類提供了靜態(tài)的now()方法來獲取當(dāng)前日期,也提供了靜態(tài)的now(Clock clock)方法來獲取當(dāng)前clock對(duì)應(yīng)的日期。除此之外,它還提供了一系列minusXxx()方法在當(dāng)前年份基礎(chǔ)上減去幾年、幾月、幾周或幾日,也提供了plusXxx()方法在當(dāng)前年份基礎(chǔ)上加上幾年、幾月、幾周或幾日。 -
LocalTime:該類代表不帶時(shí)區(qū)的時(shí)間,例如10:30:13。該類提供了靜態(tài)的now()方法來獲取當(dāng)前時(shí)間,也提供了靜態(tài)的now(Clock clock)方法來獲取clock對(duì)應(yīng)的時(shí)間。除此之外,它還提供了一系列minusXxx()方法在當(dāng)前年份基礎(chǔ)上減去幾小時(shí)、幾分、幾秒等,也提供了plusXxx()方法在當(dāng)前年份基礎(chǔ)上加上加幾小時(shí)、幾分、幾秒等。 -
LocalDateTime:該類代表不帶時(shí)區(qū)的日期、時(shí)間,例如1999-10-30T10:30:13。該類提供了靜態(tài)的now()方法來獲取當(dāng)前日期、時(shí)間,也提供了靜態(tài)的now(Clock clock)方法來獲取clock對(duì)應(yīng)的日期、時(shí)間。除此之外,它還提供了一系列minusXxx()方法在當(dāng)前年份基礎(chǔ)上減去幾年、幾月、幾日幾小時(shí)、幾分、幾秒等,也提供了plusXxx()方法在當(dāng)前年份基礎(chǔ)上加上幾年、幾月、幾日幾小時(shí)、幾分、幾秒等。 -
MonthDay:該類僅代表月日,例如--10-30。該類提供了靜態(tài)的now()方法來獲取當(dāng)前月日,也提供了靜態(tài)的now(Clock clock)方法來獲取clock對(duì)應(yīng)的月日。 -
Year:該類僅代表年,例如1999。該類提供了靜態(tài)的now()方法來獲取當(dāng)前年份,也提供了靜態(tài)的now(Clock clock)方法來獲取clock對(duì)應(yīng)的年份。除此之外,它還提供了minusYears()方法在當(dāng)前年份基礎(chǔ)上減去幾年,也提供了plusYear()方法在當(dāng)前年份基礎(chǔ)上加上幾年。 -
YearMonth:該類僅代表年月,例如1999-10。該類提供了靜態(tài)的now()方法來獲取當(dāng)前年月,也提供了靜態(tài)的now(Clock clock)方法來獲取clock對(duì)應(yīng)的年月。除此之外,它還提供了minusXxx()方法在當(dāng)前年月基礎(chǔ)上減去幾年、幾月,也提供了plusXxx()方法在當(dāng)前年月基礎(chǔ)上加上幾年、幾月。-
ZonedDateTime:該類代表一個(gè)時(shí)區(qū)化的日期、時(shí)間。 -
ZoneId:該類代表一個(gè)時(shí)區(qū)。 -
DayOfWeek:這是一個(gè)枚舉類,定義了周日到周六的枚舉值。 -
Month:這是一個(gè)枚舉類,定義了一月到十二月的枚舉值。
-
正則表達(dá)式
正則表達(dá)式是一個(gè)強(qiáng)大的字符串處理工具,可以對(duì)字符串進(jìn)行查找、提取、分割、替換等操作。
String類里也提供了如下幾個(gè)特殊方法:
-
boolean matches(String regex):判斷該字符串是否匹配指定的正則表達(dá)式。 -
String replaceAll(String regex, String replacement):將該字符串中所有匹配regex的字串替換成replacement。 -
String repalceFirst(String regex, String replacement):將該字符串中第一個(gè)匹配regex的字串替換成replacement。 -
String[] split(String regex):以regex作為分隔符,把該字符串分割成多個(gè)字串。
上面這些特殊的方法都依賴于Java提供的正則表達(dá)式支持,除此之外,Java還提供了Pattern和Matches兩個(gè)類專門用于提供正則表達(dá)式支持。
創(chuàng)建正則表達(dá)式
正則表達(dá)式所支持的合法字符:
-
x:字符x(x可代表任何合法的字符) -
\0mnn:八進(jìn)制數(shù)0mnn所代表的字符 -
\xhh:十六進(jìn)制值0xhh所代表的字符 -
\uhhhh:十六進(jìn)制值0xhhhh所代表的Unicode字符 -
\t:制表符('\u000A') -
\n:新行(換行)符('\u000A') -
\r:回車符('\u000D') -
\f:換頁符('\u000C') -
\a:報(bào)警(bell)符('\u0007') -
\e:Escape符('\u001B') -
\cx:x對(duì)應(yīng)的控制符。x值必須為A~Z或a~z之一。
正則表達(dá)式中有一些特殊字符,這些特殊字符在正則表達(dá)式中有其特殊的用途,如果需要匹配這些特殊字符,就必須首先將這些字符轉(zhuǎn)義,也就是在前面加一個(gè)反斜線(\)。
-
$:匹配一行的結(jié)尾。 -
^:匹配一行的開頭。 -
():標(biāo)記子表達(dá)式的開始和結(jié)束位置。 -
[]:用于確定中括號(hào)表達(dá)式的開始和結(jié)束位置。 -
{}:用于標(biāo)記前面子表達(dá)式的出現(xiàn)頻度。 -
*:指定前面子表達(dá)式可以出現(xiàn)零次或多次, -
+:指定前面表達(dá)式可以出現(xiàn)一次或多次。 -
?:指定前面子表達(dá)式可以出現(xiàn)零次或一次。 -
\:用于轉(zhuǎn)義下一個(gè)字符,或指定八進(jìn)制、十六進(jìn)制字符。 -
|:指定兩項(xiàng)之間任選一項(xiàng)。
預(yù)定義字符
-
.:可以匹配任何字符。 -
\d:匹配0~9的所有數(shù)字。 -
\D:匹配非數(shù)字。 -
\s:匹配所有的空白字符,包括空格、制表符、回車符、換頁符、換行符等。 -
\S:匹配所有的非空白字符。 -
\w:匹配所有的單詞字符,包括0~9所有數(shù)字、26個(gè)英文字母和下劃線(_)。 -
\W:匹配所有的非單詞字符。
方括號(hào)表達(dá)式
- 表示枚舉:例如
[fx],表示f、x其中任意一個(gè)字符;[jk]表示j、x其中任意一個(gè)字符。 - 表示范圍-:例如
[a-f],表示a~f范圍內(nèi)的任意字符;如[a-cx-z],表示a~c、x~z范圍內(nèi)的任意字符。 - 表示求否
^:例如[^abc],表示非a、b、c的任意字符;[^a-f],表示不是a~f范圍內(nèi)的任意字符。 - 表示與運(yùn)算
&&:例如[a-z&&[def]],求a~z和[def]的交集,表示d、e或f;[a-z&&[^bc]],a~z范圍內(nèi)的所有字符,除b和c之外,即[ad-z]。 - 表示并運(yùn)算:并運(yùn)算與前面的枚舉類似。例如
[a-d[m-p]],表示[a-dm-p]。
邊界匹配符
-
^:行的開頭 -
$:行的結(jié)尾 -
\b:單詞的邊界 -
\B:非單詞的邊界 -
\A:輸入的開頭 -
\G:前一個(gè)匹配的結(jié)尾 -
\Z:輸入的結(jié)尾,僅用于最后的結(jié)束符。 -
\z:輸入的結(jié)尾
數(shù)量標(biāo)識(shí)符
-
Greedy(貪婪模式):數(shù)量標(biāo)識(shí)符默認(rèn)采用貪婪模式,除非另有表示。貪婪模式的表達(dá)式會(huì)一直匹配下去,直到無法匹配為止。-
X?:X表達(dá)式出現(xiàn)零次或一次 -
X*:X表達(dá)式出現(xiàn)零次或多次 -
X+:X表達(dá)式出現(xiàn)一次或多次 -
X{n}:X表達(dá)式出現(xiàn)n次 -
X{n,}:X表達(dá)式最少出現(xiàn)n次 -
X{n,m}:X表達(dá)式最少出現(xiàn)n次,最多出現(xiàn)m次
-
-
Reluctant(勉強(qiáng)模式):用問號(hào)后綴(?)表示,它只會(huì)匹配最少的字符。也稱為最小匹配模式。-
X??:X表達(dá)式出現(xiàn)零次或一次 -
X*?:X表達(dá)式出現(xiàn)零次或多次 -
X+?:X表達(dá)式出現(xiàn)一次或多次 -
X{n}?:X表達(dá)式出現(xiàn)n次 -
X{n,}?:X表達(dá)式最少出現(xiàn)n次 -
X{n,m}?:X表達(dá)式最少出現(xiàn)n次,最多出現(xiàn)m次
-
-
Possessive(占有模式):用加號(hào)后綴(+)表示,目前只有Java支持占有模式,通常比較少用。-
X?+:X表達(dá)式出現(xiàn)零次或一次 -
X*+:X表達(dá)式出現(xiàn)零次或多次 -
X++:X表達(dá)式出現(xiàn)一次或多次 -
X{n}+:X表達(dá)式出現(xiàn)n次 -
X{n,}+:X表達(dá)式最少出現(xiàn)n次 -
X{n,m}+:X表達(dá)式最少出現(xiàn)n次,最多出現(xiàn)m次
-
使用正則表達(dá)式
一旦在程序中定義了正則表達(dá)式,就可以使用Pattern和Matcher來使用正則表達(dá)式。
Pattern對(duì)象是正則表達(dá)式編譯后在內(nèi)存中的表示形式,因此,正則表達(dá)式字符串必須先被編譯為Pattern對(duì)象,然后再利用Pattern對(duì)象創(chuàng)建對(duì)應(yīng)的Matcher對(duì)象。執(zhí)行匹配所涉及的狀態(tài)保留在Matcher對(duì)象中,多個(gè)Matcher對(duì)象可共享同一個(gè)Pattern對(duì)象。
如果某個(gè)正則表達(dá)式僅需一次使用,則可直接使用Pattern類的靜態(tài)matches()方法,此方法自動(dòng)把指定字符串編譯成匿名Pattern對(duì)象,并執(zhí)行匹配。
Pattern是不可變類,可供多個(gè)并發(fā)線程安全使用。
Matcher類提供了如下幾個(gè)常用方法:
-
find():返回目標(biāo)字符串中是否包含與Pattern匹配的子串。 -
group():返回上一次與Pattern匹配的子串。 -
start():返回上一次與Pattern匹配的子串在目標(biāo)字符串中的開始位置。 -
end():返回上一次與Pattern匹配的子串在目標(biāo)字符串中的結(jié)束位置加1。 -
lookingAt():返回目標(biāo)字符串前面部分與Pattern是否匹配。 -
matches():返回整個(gè)目標(biāo)字符串與Pattern是否匹配。 -
reset():將現(xiàn)有的Matcher對(duì)象應(yīng)用于一個(gè)新的字符序列。
通過Matcher類的find()和group()方法可以從目標(biāo)字符串中依次取出特定子串(匹配正則表達(dá)式的子串)。
find()方法依次查找字符串中與Pattern匹配的子串,一旦找到對(duì)應(yīng)的子串,下次調(diào)用find()方法時(shí)將接著向下查找。
find()方法還可以傳入一個(gè)int類型的參數(shù),帶int參數(shù)的find()方法將從該int索引處向下搜索。start()和end()方法主要用于確定子串在目標(biāo)字符串中的位置。
使用find()、group()方法逐項(xiàng)取出目標(biāo)字符串中與指定正則表達(dá)式匹配的子串,并使用start()、end()方法返回子串在目標(biāo)字符串中的位置。
matches()和lookingAt()方法有點(diǎn)相似,只是matches()方法要求整個(gè)字符串和Pattern完全匹配時(shí)才返回true,而lookingAt()只要字符串以Pattern開頭就會(huì)返回true。reset()方法可將現(xiàn)有的Matcher對(duì)象應(yīng)用于新的字符序列。
從某個(gè)角度看,Matcher的matches()、lookingAt()和String類的equals()、startWith()有點(diǎn)相似。區(qū)別是String類的equals()和、startWith()都是與字符串進(jìn)行比較,而Matcher的matches()和lookingAt()則是與正則表達(dá)式進(jìn)行匹配。
String類里也提供了matches()方法,該方法返回該字符串是否匹配指定的正則表達(dá)式。
還可以利用正則表達(dá)式對(duì)目標(biāo)字符串進(jìn)行分割、查找、替換等操作。
Matcher類提供了replaceAll(String replacement)把字符串中所有與正則表達(dá)式匹配的子串替換成replacement,還提供了一個(gè)replaceFirst(String replacement)方法,該方法僅替換第一個(gè)匹配的子串。
String類也提供了replaceAll()、replaceFirst()、split()等方法。
變量處理和方法處理
Java9引入了一個(gè)新的VarHandle類,并增強(qiáng)了原有的MethodHandle類。通過這兩個(gè)類,允許Java像動(dòng)態(tài)語言一樣引用變量、飲用方法,并調(diào)用它們。
Java9增強(qiáng)的MethodHandle
-
MethodHandle為Java增強(qiáng)了方法引用的功能,方法引用的概念有點(diǎn)類似于C的函數(shù)指針。這種方法引用是一種輕量級(jí)的引用方式,它不會(huì)檢查方法的訪問權(quán)限,也不管方法所屬的類、實(shí)例方法或靜態(tài)方法,MethodHandle就是簡(jiǎn)單代表特定的方法,并可通過MethodHandle來調(diào)用方法。 - 為了使用
MethodHandle類,還涉及如以下幾個(gè)類:-
MethodHandles:MethodHandle的工廠類,它提供了一系列靜態(tài)方法用于獲取MethodHandle。 -
MethodHandles.Lookup:Lookup靜態(tài)內(nèi)部類也是MethodHandle、VarHandle的工廠類,專門用于獲取MethodHandle和VarHandle。 -
MethodType:代表一個(gè)方法類型。MethodType根據(jù)方法的形參、返回值類型來確定方法類型。 - 程序使用
MethodHandles.Lookup對(duì)象根據(jù)類、方法名、方法類型來獲取MethodHandle對(duì)象。獲取的方法名是一個(gè)字符串類型,這意味著通過MethodHandle可以讓Java動(dòng)態(tài)調(diào)用某個(gè)方法。
-
Java9增強(qiáng)的VarHandle
-
VarHandle主要用于動(dòng)態(tài)操作數(shù)組的元素或?qū)ο蟮某蓡T變量。VarHandle和MethodHandle非常相似,它也需要通過MethodHandles來獲取實(shí)例,接下來調(diào)用VarHandle的方法即可動(dòng)態(tài)操作指定數(shù)組的元素或指定對(duì)象的成員變量。
Java9改進(jìn)的國(guó)際化與格式化
國(guó)際化是指應(yīng)用程序運(yùn)行時(shí),可根據(jù)客戶端請(qǐng)求來自的國(guó)家/地區(qū)、語言的不同而顯示不同的界面。
Java國(guó)際化的思路:
- Java程序的國(guó)際化思路是將程序中的標(biāo)簽、提示等信息放在資源文件中,程序需要支持哪些國(guó)家、語言環(huán)境,就對(duì)應(yīng)提供的資源文件。
- 資源文件是
key-value對(duì),每個(gè)資源文件中的key是不變的,但value則隨不同的國(guó)家、語言而改變。 - Java程序的國(guó)際化主要是通過如下三個(gè)類完成:
-
java.util.ResourceBundle:用于加載國(guó)家、語言資源包。 -
java.util.Locale:用于封裝特定的國(guó)家/區(qū)域、語言環(huán)境。 -
java.text.MessageFormat:用于格式化帶占位符的字符串。
-
- 資源文件的命名可以有如下三種形式:
baseName_language_country.propertiesbaseName_language.propertiesbaseName.properties
- 其中
baseName是資源文件的基本名,用戶可隨意指定;而language和country都不可隨意變化,必須是Java所支持的語言和國(guó)家。
Java支持的國(guó)家和語言:
- 可調(diào)用
Locale類的getAvailableLocales()方法,該方法返回一個(gè)Locale數(shù)組,該數(shù)組包含了Java所支持的國(guó)家和語言。
完成程序國(guó)際化:
- 為了讓字符串常量可以改變,可以將需要輸出的各種字符串(不同的國(guó)家/語言環(huán)境對(duì)應(yīng)不同的字符串)定義在資源包中。
- Java9支持使用
UTF-8字符集來保存屬性文件,這樣在屬性文件中就可以直接包含非西歐字符。 - Java9程序國(guó)際化的關(guān)鍵類是
ResourceBundle,它有一個(gè)靜態(tài)方法:getBUndle(String baseName, Locale locale),該方法將根據(jù)Locale加載資源文件,而Locale封裝了一個(gè)國(guó)家、語言。
使用MessageFormat處理包含占位符的字符串:
- 如果需要輸出的消息中必須包含動(dòng)態(tài)的內(nèi)容,可以使用帶占位符的消息。
- 例如:
msg=你好!{0}!今天是{1}。當(dāng)程序使用ResourceBundle的getString()方法來取出msg對(duì)應(yīng)的字符串時(shí),程序還需要為{0}和{1}兩個(gè)占位符賦值。 - 此時(shí)需要使用
MessageFormat類,該類包含一個(gè)有用的靜態(tài)方法:-
format(String pattern, Object... values):返回后面的多個(gè)參數(shù)值填充前面的pattern字符串,其中patter不是正則表達(dá)式,而是一個(gè)帶占位符的字符串。
-
使用類文件代替資源文件:
除使用屬性文件作為資源文件外,Java也允許使用類文件代替資源文件,即將所有的key-value對(duì)存入class文件。
使用類文件來代替資源文件必須滿足以下條件:
- 該類的類名必須是
baseName_language_country,這與屬性文件的命名相似。 - 該類必須繼承
ListResourceBundle,并重寫getContents()方法,該方法返回Object數(shù)組,該數(shù)組的每一項(xiàng)都是key-value對(duì)。
如果系統(tǒng)同時(shí)存在資源文件、類文件,系統(tǒng)將以類文件為主,而不會(huì)調(diào)用資源文件。
對(duì)于簡(jiǎn)體中文的Locale,ResourceBundle搜索資源文件的順序是:
baseName_zh_CN.classbaseName_zh_CN.propertiesbaseName_zh.classbaseName_zh.propertiesbaseName.classbaseName.properties
Java9新增的日志API
Java9強(qiáng)化了原有的日志API,這套日志API只是定義了記錄消息的最小API,開發(fā)者可將這些日志消息路由到各種主流的日志框架(如SLF4J、Log4J等),否則默認(rèn)使用Java傳統(tǒng)的java.util.logging日志API。
這套日志API的用法非常簡(jiǎn)單,只要兩步即可:
- 調(diào)用
System類的getLogger(String name)方法獲取System.Logger對(duì)象 - 調(diào)用
System.Logger對(duì)象的log()方法輸出日志。該方法的第一個(gè)參數(shù)用于指定日志級(jí)別。- 日志級(jí)別:
- Java9日志級(jí)別
-
ALL:最低級(jí)別,系統(tǒng)將會(huì)輸出所有日志信息。 -
TRACE:輸出系統(tǒng)的各種跟蹤信息。 -
DEBUG:輸出系統(tǒng)的各種調(diào)試信息。 -
INFO:輸出系統(tǒng)內(nèi)需要提示用戶的提示信息。 -
WARNING:只輸出系統(tǒng)內(nèi)警告用戶的警告信息。 -
ERROR:只輸出系統(tǒng)發(fā)生錯(cuò)誤的錯(cuò)誤信息。 -
OFF:關(guān)閉日志輸出。
-
- 傳統(tǒng)日志級(jí)別
-
ALL:最低級(jí)別,系統(tǒng)將會(huì)輸出所有日志信息。 -
FINER:輸出系統(tǒng)的各種跟蹤信息。 -
FINE:輸出系統(tǒng)的各種調(diào)試信息。 -
INFO:輸出系統(tǒng)內(nèi)需要提示用戶的提示信息。 -
WARNING:只輸出系統(tǒng)內(nèi)警告用戶的警告信息。 -
SERVRE:只輸出系統(tǒng)發(fā)生錯(cuò)誤的錯(cuò)誤信息。 -
OFF:關(guān)閉日志輸出。
-
- Java9日志級(jí)別
- 日志級(jí)別:
Java9的日志API也支持國(guó)際化,System類除使用簡(jiǎn)單的getLogger(String name)方法獲取System.Logger對(duì)象之外,還可使用getLogger(String name, ResourceBundle bundle)方法來獲取該對(duì)象,該方法需要傳入一個(gè)國(guó)際化語言資源包,這樣該Logger對(duì)象即可根據(jù)key來輸出國(guó)際化的日志信息。
使用NumberFormat格式化數(shù)字
MessageFormat是抽象類Format的子類,Format抽象類還有兩個(gè)子類:NumberFormat和DateFormat,它們分別用以實(shí)現(xiàn)數(shù)值、日期的格式化。NumberFormat、DateFormat可以將數(shù)值、日期轉(zhuǎn)換成字符串,也可以將字符串轉(zhuǎn)換成數(shù)值、日期。
NumberFormat和DateFormat都包含了format()和parse()方法,其中format()用于將數(shù)值、日期格式化成字符串,parse()用于將字符串解析成數(shù)值、日期。
NumberFormat也是一個(gè)抽象基類,所以無法通過它的構(gòu)造器來創(chuàng)建NumberFormat對(duì)象,它提供了如下幾個(gè)類方法來得到NumberFormat對(duì)象:
-
getCurrencyInstance():返回默認(rèn)Locale的貨幣格式器。也可以在調(diào)用該方法時(shí)傳入指定的Locale,則獲取指定Locale的貨幣格式器。 -
getIntegerInstance():返回默認(rèn)Locale的整數(shù)格式器。也可以在調(diào)用該方法時(shí)傳入指定的Locale,則獲取指定Locale的整數(shù)格式器。 -
getNumberInstance():返回默認(rèn)Locale的通用數(shù)值格式器。也可以在調(diào)用該方法時(shí)傳入指定的Locale,則獲取指定的Locale的通用數(shù)值格式器。 -
getPercentInstance():返回默認(rèn)的Locale的百分?jǐn)?shù)格式器。也可以在調(diào)用該方法時(shí)傳入指定的Locale,則獲取指定的Locale的百分?jǐn)?shù)格式器。
一旦獲得了NumberFormat對(duì)象后,就可以調(diào)用它的format()方法來格式化數(shù)值,包括整數(shù)和浮點(diǎn)數(shù)。
使用DateFormat格式化日期、時(shí)間
- 與
NumberFormat相似的是,DateFormat也是一個(gè)抽象類,它也提供了如下幾個(gè)類方法用于獲取DateFormat對(duì)象:-
getDateInstance():返回一個(gè)日期格式器,它格式化后的字符串只有日期,沒有時(shí)間。該方法可以傳入多個(gè)參數(shù),用于指定日期樣式和Locale等參數(shù);如果不指定這些參數(shù),則使用默認(rèn)參數(shù)。 -
getTimeInstance():返回一個(gè)時(shí)間格式器,它格式化后的字符串只有時(shí)間,沒有日期。該方法可以傳入多個(gè)參數(shù),用于指定時(shí)間樣式和Locale等參數(shù);如果不指定這些參數(shù),則使用默認(rèn)參數(shù)。 -
getDateTimeInstance():返回一個(gè)日期、時(shí)間格式器,它格式化后的字符串既有日期,也有時(shí)間。該方法可以傳入多個(gè)參數(shù),用于指定日期樣式、時(shí)間樣式和Locale等參數(shù);如果不指定這些參數(shù),則使用默認(rèn)參數(shù)。
-
上面三個(gè)方法可以指定日期樣式、時(shí)間樣式參數(shù),它們是DateFormat的4個(gè)靜態(tài)常量:FULL、LONG、MEDIUM和SHORT,通過這4個(gè)樣式參數(shù)可以控制生成的格式化字符串。
DateFormat的parse()方法可以把一個(gè)字符串解析成Date對(duì)象,但它要求被解析的字符串必須符合日期字符串的要求,否則可能拋出ParseException異常。
使用SimpleDateFormat格式化日期
DateFormat的parse()方法可以把字符串解析成Date對(duì)象,但parse()方法不夠靈活,它要求被解析的字符串必須滿足特定的格式;為了更好地格式化日期、解析日期字符串,Java提供了SimpleDateFormat類。
-
SimpleDateFormat是DateFormat的子類。 -
SimpleDateFormat可以非常靈活地格式化Date,也可以用于解析各種格式的日期字符串。創(chuàng)建SimpleDateFormat對(duì)象時(shí)需要傳入一個(gè)pattern字符串,這個(gè)pattern不是正則表達(dá)式,而是一個(gè)日期模板字符串。
Java8新增的日期、時(shí)間格式器
java.time.format包下提供了一個(gè)DateTimeFormatter格式器類,該類相當(dāng)于DateFormat和SimpleDateFormat的合體。
DateTimeFormatter不僅可以將日期、時(shí)間對(duì)象格式化成字符串,也可以將特定格式的字符串解析成日期、時(shí)間對(duì)象。
為了使用DateTimeFormatter進(jìn)行格式化或解析,必須先獲取DateTimeFormatter對(duì)象,獲取對(duì)象有如下三種常見的方式:
- 直接使用靜態(tài)常量創(chuàng)建
DateTimeFormatter格式器。DateTimeFormatter類中包含了大量形如ISO_LOCAL_DATE、ISO_LOCAL_TIME、ISO_LOCAL_DATE_TIME等靜態(tài)常量,這些靜態(tài)常量本身就是DateTimeFormatter實(shí)例。 - 使用代表不同風(fēng)格的枚舉值來創(chuàng)建
DateTimeFormatter格式器。在FormatStyle枚舉類中定義了FULL、LONG、MEDIUM、SHORT四個(gè)枚舉值,它們代表日期、時(shí)間不同的風(fēng)格。 - 根據(jù)模式字符串來創(chuàng)建
DateTimeFormatter格式器。類似于SimpleDateFormat,可以采用模式字符串來創(chuàng)建DateTimeFormatter。
使用DateTimeFormatter完成格式化
使用DateTimeFormatter將日期、時(shí)間(LocalDate、LocalDateTime、LocalTime等實(shí)例)格式化為字符串,可通過如下兩種方式:
- 調(diào)用
DateTimeFormatter的format(TemporalAccessor temporal)方法執(zhí)行格式化,其中LocalDate、LocalDateTime、LocalTime類都是TemporalAccessor接口的實(shí)現(xiàn)類。 - 調(diào)用
LocalDate、LocalDateTime、LocalTime等日期、時(shí)間對(duì)象的format(DateTimeFormatter formatter)方法執(zhí)行格式化。
DateTimeFormatter則提供了一個(gè)toFormat()方法,該方法可獲取DateTimeFormatter對(duì)應(yīng)的Format對(duì)象。
使用DateTimeFormatter解析字符串
使DateTimeFormatter將指定格式的字符串解析成日期、時(shí)間對(duì)象(LocalDate、LocalDateTime、LocalTime等實(shí)例),可通過日期、時(shí)間對(duì)象提供的parse(CharSequence text, DateTimeFormatter formatter)方法進(jìn)行解析。