摘要:類提供方法和方法來(lái)通知系統(tǒng)進(jìn)行垃圾回收清理系統(tǒng)資源,并提供了和方法來(lái)加載文件和動(dòng)態(tài)鏈接庫(kù)。返回按照標(biāo)準(zhǔn)的規(guī)定,對(duì)兩個(gè)參數(shù)進(jìn)行余數(shù)運(yùn)算。
與用戶互動(dòng) 運(yùn)行Java程序的參數(shù)
//Java程序入口:main()方法 public static void main(String[] args){...}
public修飾符:Java類由JVM調(diào)用,為了讓JVM可以自由調(diào)用這個(gè)main()方法,所以使用public修飾符把這個(gè)方法暴露出來(lái)
static修飾符:JVM調(diào)用這個(gè)主方法時(shí),不會(huì)先創(chuàng)建該主類的對(duì)象,然后通過(guò)對(duì)象來(lái)調(diào)用該主方法。JVM直接通過(guò)該類來(lái)調(diào)用主方法,因此使用static修飾該主方法。
void返回值:因?yàn)橹鞣椒ū籎VM調(diào)用,該方法的返回值將返回給JVM,因此main()方法沒有返回值。
使用Scanner獲取鍵盤輸入使用Scanner類可以很方便地獲取用戶的鍵盤輸入,Scanner是一個(gè)基于正則表達(dá)式的文本掃描器,可以從文件、輸入流、字符串中解析出基本類型值和字符串值。
Scanner主要提供了兩個(gè)方法來(lái)掃描輸入
hasNextXxx():是否還有下一個(gè)輸入項(xiàng),其中Xxx可以是Int、Long等代表基本數(shù)據(jù)類型的字符串。如果只是判斷是否包含下一個(gè)字符串,則直接使用hasNext()
nextXxx():獲取下一個(gè)輸入項(xiàng)。
默認(rèn)情況下,Scanner使用空白(空格、Tab空白、回車)作為多個(gè)輸入項(xiàng)之間的分隔符。
import java.util.Scanner; public class ScannerKeyBoardTest { public static void main(String[] args) { //System.in代表標(biāo)準(zhǔn)輸入,就是鍵盤輸入 Scanner sc = new Scanner(System.in); //增加下面一行將只把回車作為分隔符 //sc.useDelimiter(" "); //判斷是否還有下一個(gè)輸入項(xiàng) while (sc.hasNext()) { //輸出輸入項(xiàng) System.out.println("鍵盤輸入的內(nèi)容是:"+ sc.next()); } } }
Scanner提供了兩個(gè)簡(jiǎn)單的方法來(lái)逐行讀取
boolean hasNextLine():返回輸入源中是否還有下一行
String nextLine():返回輸入源中下一行的字符串
創(chuàng)建Scanner對(duì)象,傳入一個(gè)File對(duì)象作為參數(shù),程序?qū)⒆x取ScannerFileTest.java文件中的內(nèi)容
import java.io.File; import java.util.Scanner; public class ScannerFileTest { public static void main(String[] args) throws Exception { //將一個(gè)File對(duì)象作為Scanner的構(gòu)造器參數(shù),Scanner讀取文件內(nèi)容 Scanner sc = new Scanner(new File("ScannerFileTest.java")); System.out.println("ScannerFileTest.java文件內(nèi)容如下:"); //判斷是否還有下一行 while (sc.hasNextLine()) { //輸出文件中的下一行 System.out.println(sc.nextLine()); } } }系統(tǒng)相關(guān) System類
System類代表了當(dāng)前Java程序的運(yùn)行平臺(tái),程序不能創(chuàng)建System類的對(duì)象,System類提供了一些類變量和類方法,允許直接通過(guò)System類來(lái)調(diào)用這些類變量和類方法。
加載文件和動(dòng)態(tài)鏈接庫(kù)主要對(duì)naive方法有用,對(duì)于一些特殊的功能(如訪問操作系統(tǒng)底層硬件設(shè)備等)Java程序無(wú)法實(shí)現(xiàn)必須借助C語(yǔ)音來(lái)完成,此時(shí)需要使用C語(yǔ)音為Java方法提供實(shí)現(xiàn)
Java程序中聲明native修飾的方法,類似于abstract方法,只有方法簽名,沒有實(shí)現(xiàn)。編譯該Java程序,生成一個(gè)class文件
用javah編譯第1步生成的class文件,將生成一個(gè).h文件
寫一個(gè).cpp文件實(shí)現(xiàn)native,這一步需要包含第2步生成的.h文件(.h文件中包含JDK帶的jni.h文件)
將第3步的.cpp文件編譯成動(dòng)態(tài)鏈接庫(kù)文件
在Java中用System類的loadLibrary..()方法或Runtime類的loadLibrary()方法加載第4步產(chǎn)生的動(dòng)態(tài)鏈接庫(kù)文件,Java程序中就可以調(diào)用這個(gè)native方法了。
import java.io.FileOutputStream; import java.util.Map; import java.util.Properties; public class SystemTest { public static void main(String[] args) throws Exception { //獲取系統(tǒng)所有的環(huán)境變量 Mapenv = System.getenv(); for(String name : env.keySet()) { System.out.println(name + " ---> " + env.get(name)); } //獲取指定環(huán)境變量的值 System.out.println(System.getenv("JAVA_HOME")); //獲取所有的系統(tǒng)屬性 Properties properties = System.getProperties(); //將所有的系統(tǒng)屬性保存到properties.txt文件中 properties.store(new FileOutputStream("properties.txt"), "System Properties"); //輸出特定的系統(tǒng)屬性 System.out.println(System.getProperty("os.name")); } }
System類的in、out和err分別代表系統(tǒng)的標(biāo)準(zhǔn)輸入(通常是鍵盤)、標(biāo)準(zhǔn)輸出(通常是顯示器)和錯(cuò)誤輸出流,并提供了setIn()、setOut()和setErr()方法
identityHashCode(Object x)方法,該方法返回指定對(duì)象的精確hashCode值,也就是根據(jù)該對(duì)象的地址計(jì)算得到的hashCode值。如果兩個(gè)對(duì)象的identityHashCode值相同,則兩個(gè)對(duì)象絕對(duì)是同一個(gè)對(duì)象。
public class IdentityHashCodeTest { public static void main(String[] args) { //下面程序中s1和s2是兩個(gè)不同的對(duì)象 String s1 = new String("Hello"); String s2 = new String("Hello"); //String重寫了hashCode()方法——改為根據(jù)字符序列計(jì)算hashCode值 //因?yàn)閟1和s2的字符序列相同,所有它們的hashCode()方法返回值相同 System.out.println(s1.hashCode() + "---" + s2.hashCode()); //s1和s2是不同的字符串對(duì)象,所以它們的identityHashCode值不同 System.out.println(System.identityHashCode(s1) + "---" + System.identityHashCode(s2)); String s3 = "Java"; String s4 = "Java"; //s3和s4是相同的字符串對(duì)象,所以它們的identityHashCode值相同 System.out.println(System.identityHashCode(s3) + "---" + System.identityHashCode(s4)); } }Runtime類
Runtime類代表Java程序的運(yùn)行時(shí)環(huán)境,可以訪問JVM的相關(guān)信息,如處理器數(shù)量、內(nèi)存信息等。每個(gè)Java程序都有一個(gè)與之對(duì)應(yīng)的Runtime實(shí)例,應(yīng)用程序通過(guò)該對(duì)象與其運(yùn)行時(shí)環(huán)境相連。應(yīng)用程序不能創(chuàng)建自己的Runtime實(shí)例,但可以通過(guò)getRuntime()方法獲取與之關(guān)聯(lián)的Runtime對(duì)象。
Runtime類提供gc()方法和runFinalization()方法來(lái)通知系統(tǒng)進(jìn)行垃圾回收、清理系統(tǒng)資源,并提供了load(String filename)和loadLibrary(String libname)方法來(lái)加載文件和動(dòng)態(tài)鏈接庫(kù)。
public class ExecTest { public static void main(String[] args) throws Exception { //獲取Java程序關(guān)聯(lián)的運(yùn)行時(shí)對(duì)象 Runtime runtime = Runtime.getRuntime(); System.out.println("處理器數(shù)量:" + runtime.availableProcessors()); System.out.println("空閑內(nèi)存數(shù):" + runtime.freeMemory()); System.out.println("總內(nèi)存數(shù):" + runtime.totalMemory()); System.out.println("可用最大內(nèi)存數(shù)" + runtime.maxMemory()); //運(yùn)行記事本程序 runtime.exec("notepad.exe"); } }常用類 Object類
Object類是所有類、數(shù)組、枚舉類的父類,Java允許把任何類型的對(duì)象賦給Object類型的變量。
boolean equals(Object obj):判斷指定對(duì)象與該對(duì)象是否相等
protected void finalize():當(dāng)系統(tǒng)中沒有引用變量引用到該對(duì)象時(shí),垃圾回收器調(diào)用該方法來(lái)清理該對(duì)象的資源
Class>getClass():返回該對(duì)象的運(yùn)行時(shí)類
int hashCode():返回該對(duì)象的hashCode()值
String toString():返回該對(duì)象的字符串表示,當(dāng)程序使用System.out.println()方法輸出一個(gè)對(duì)象,或者把某個(gè)對(duì)象和字符串進(jìn)行連接運(yùn)算時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用該對(duì)象的toString()方法返回該對(duì)象的字符串表示。
Java提供protected修飾的clone()方法,用于幫助其他對(duì)象來(lái)實(shí)現(xiàn)“自我克隆”,需要被子類重寫或調(diào)用。
自定義類實(shí)現(xiàn)“克隆”的步驟
自定義類實(shí)現(xiàn)Cloneable接口
自定義實(shí)現(xiàn)自己的clone()方法
實(shí)現(xiàn)clone()方法時(shí)通過(guò)super.clone();調(diào)用Object實(shí)現(xiàn)的clone()方法來(lái)得到該對(duì)象的副本,并返回該副本。
class Address { String detail; public Address(String detail) { this.detail =detail; } } //實(shí)現(xiàn)Cloneable接口 class User implements Cloneable { int age; Address address; public User(int age) { this.age = age; address = new Address("珠江新城"); } //通過(guò)調(diào)用super.clone()來(lái)實(shí)現(xiàn)clone()方法 public User clone() throws CloneNotSupportedException { return (User)(super.clone()); } } public class CloneTest { public static void main(String[] args) throws CloneNotSupportedException { User u1 = new User(27); //clone得到u1對(duì)象的副本 User u2 = u1.clone(); //判斷u1、u2是否相同 System.out.println(u1 == u2); //判斷u1、u2的address是否相同 System.out.println(u1.address == u2.address); } }Java7新增的Object類
如果不能確定一個(gè)引用變量是否為null,如果貿(mào)然地調(diào)用該變量的toString()方法,則可能引發(fā)NullPointerException異常;如果使用Object類提供的toString(Object o)方法,就不會(huì)引發(fā)空指針異常,當(dāng)o為null時(shí),程序?qū)⒎祷匾粋€(gè)"null"字符串。
Java為工具類的命名習(xí)慣是添加一個(gè)字母s,比如操作數(shù)組的工具類Arrays,操作集合的工具類Collections。
import java.util.Objects; public class ObjectsTest { //定義一個(gè)objectsTest變量,它的默認(rèn)值是null static ObjectsTest objectsTest; public static void main(String[] args) { //輸出一個(gè)null對(duì)象的hashCode值,輸出0 System.out.println(Objects.hashCode(objectsTest)); //輸出一個(gè)null對(duì)象的toString,輸出null System.out.println(Objects.toString(objectsTest)); //要求objectsTest不能為null,如果objectsTest為null System.out.println(Objects.requireNonNull(objectsTest,"objectsTest參數(shù)不能是null!")); } }
requireNonNull()方法,當(dāng)傳入的參數(shù)不為null時(shí),該方法返回參數(shù)本身;否則將會(huì)引發(fā)NullPointerException異常。
Math類構(gòu)造器被定義成private的,因此無(wú)法參加Math類的對(duì)象,所有方法都是類方法,可以直接通過(guò)類名來(lái)調(diào)用它們,還提供了兩個(gè)類變量:PI和E
public class MathTest { public static void main(String[] args) { /*---------下面是三角運(yùn)算---------*/ // 將弧度轉(zhuǎn)換角度 System.out.println("Math.toDegrees(1.57):" + Math.toDegrees(1.57)); // 將角度轉(zhuǎn)換為弧度 System.out.println("Math.toRadians(90):" + Math.toRadians(90)); // 計(jì)算反余弦,返回的角度范圍在 0.0 到 pi 之間。 System.out.println("Math.acos(1.2):" + Math.acos(1.2)); // 計(jì)算反正弦;返回的角度范圍在 -pi/2 到 pi/2 之間。 System.out.println("Math.asin(0.8):" + Math.asin(0.8)); // 計(jì)算反正切;返回的角度范圍在 -pi/2 到 pi/2 之間。 System.out.println("Math.atan(2.3):" + Math.atan(2.3)); // 計(jì)算三角余弦。 System.out.println("Math.cos(1.57):" + Math.cos(1.57)); // 計(jì)算值的雙曲余弦。 System.out.println("Math.cosh(1.2 ):" + Math.cosh(1.2 )); // 計(jì)算正弦 System.out.println("Math.sin(1.57 ):" + Math.sin(1.57 )); // 計(jì)算雙曲正弦 System.out.println("Math.sinh(1.2 ):" + Math.sinh(1.2 )); // 計(jì)算三角正切 System.out.println("Math.tan(0.8 ):" + Math.tan(0.8 )); // 計(jì)算雙曲正切 System.out.println("Math.tanh(2.1 ):" + Math.tanh(2.1 )); // 將矩形坐標(biāo) (x, y) 轉(zhuǎn)換成極坐標(biāo) (r, thet)); System.out.println("Math.atan2(0.1, 0.2):" + Math.atan2(0.1, 0.2)); /*---------下面是取整運(yùn)算---------*/ // 取整,返回小于目標(biāo)數(shù)的最大整數(shù)。 System.out.println("Math.floor(-1.2 ):" + Math.floor(-1.2 )); // 取整,返回大于目標(biāo)數(shù)的最小整數(shù)。 System.out.println("Math.ceil(1.2):" + Math.ceil(1.2)); // 四舍五入取整 System.out.println("Math.round(2.3 ):" + Math.round(2.3 )); /*---------下面是乘方、開方、指數(shù)運(yùn)算---------*/ // 計(jì)算平方根。 System.out.println("Math.sqrt(2.3 ):" + Math.sqrt(2.3 )); // 計(jì)算立方根。 System.out.println("Math.cbrt(9):" + Math.cbrt(9)); // 返回歐拉數(shù) e 的n次冪。 System.out.println("Math.exp(2):" + Math.exp(2)); // 返回 sqrt(x2 +y2) System.out.println("Math.hypot(4 , 4):" + Math.hypot(4 , 4)); // 按照 IEEE 754 標(biāo)準(zhǔn)的規(guī)定,對(duì)兩個(gè)參數(shù)進(jìn)行余數(shù)運(yùn)算。 System.out.println("Math.IEEEremainder(5 , 2):" + Math.IEEEremainder(5 , 2)); // 計(jì)算乘方 System.out.println("Math.pow(3, 2):" + Math.pow(3, 2)); // 計(jì)算自然對(duì)數(shù) System.out.println("Math.log(12):" + Math.log(12)); // 計(jì)算底數(shù)為 10 的對(duì)數(shù)。 System.out.println("Math.log10(9):" + Math.log10(9)); // 返回參數(shù)與 1 之和的自然對(duì)數(shù)。 System.out.println("Math.log1p(9):" + Math.log1p(9)); /*---------下面是符號(hào)相關(guān)的運(yùn)算---------*/ // 計(jì)算絕對(duì)值。 System.out.println("Math.abs(-4.5):" + Math.abs(-4.5)); // 符號(hào)賦值,返回帶有第二個(gè)浮點(diǎn)數(shù)符號(hào)的第一個(gè)浮點(diǎn)參數(shù)。 System.out.println("Math.copySign(1.2, -1.0):" + Math.copySign(1.2, -1.0)); // 符號(hào)函數(shù);如果參數(shù)為 0,則返回 0;如果參數(shù)大于 0, // 則返回 1.0;如果參數(shù)小于 0,則返回 -1.0。 System.out.println("Math.signum(2.3):" + Math.signum(2.3)); /*---------下面是大小相關(guān)的運(yùn)算---------*/ // 找出最大值 System.out.println("Math.max(2.3 , 4.5):" + Math.max(2.3 , 4.5)); // 計(jì)算最小值 System.out.println("Math.min(1.2 , 3.4):" + Math.min(1.2 , 3.4)); // 返回第一個(gè)參數(shù)和第二個(gè)參數(shù)之間與第一個(gè)參數(shù)相鄰的浮點(diǎn)數(shù)。 System.out.println("Math.nextAfter(1.2, 1.0):" + Math.nextAfter(1.2, 1.0)); // 返回比目標(biāo)數(shù)略大的浮點(diǎn)數(shù) System.out.println("Math.nextUp(1.2 ):" + Math.nextUp(1.2 )); // 返回一個(gè)偽隨機(jī)數(shù),該值大于等于 0.0 且小于 1.0。 System.out.println("Math.random():" + Math.random()); } }Java 7的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è)類,在并發(fā)訪問環(huán)境下,可以減少多線程資源競(jìng)爭(zhēng),最終保證系統(tǒng)具有更好的線程安全性。提供靜態(tài)的current()方法來(lái)獲取ThreadLocalRandom對(duì)象,獲取該對(duì)象之后調(diào)用各種nextXxx()方法來(lái)獲取偽隨機(jī)數(shù)
import java.util.Arrays; import java.util.Random; public class RandomTest { public static void main(String[] args) { Random random = new Random(); System.out.println("random.nextBoolean():"+random.nextBoolean()); byte[] buffer = new byte[16]; random.nextBytes(buffer); System.out.println(Arrays.toString(buffer)); //生成0.0~1.0之間的偽隨機(jī)double數(shù) System.out.println("random.nextDouble():"+random.nextDouble()); //生成0.0~1.0之間的偽隨機(jī)float數(shù) System.out.println("random.nextFloat():"+random.nextFloat()); //生成平均值是0.0,標(biāo)準(zhǔn)差是1.0的偽高斯數(shù) System.out.println("random.nextGaussian():"+random.nextGaussian()); //生成0~26之間的偽隨機(jī)整數(shù) System.out.println("random.nextInt(26):"+random.nextInt(26)); //生成一個(gè)處于long整數(shù)取值范圍的偽隨機(jī)整數(shù) System.out.println("random.nextLong():"+random.nextLong()); } }
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ì)象的種子
Random rt = new Random(System.currentTimeMillis());
ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current(); //生成一個(gè)4~20之間的偽隨機(jī)整數(shù) int vall = threadLocalRandom.nextInt(4, 20); //生成一個(gè)2.0~10.0之間的偽隨機(jī)浮點(diǎn)數(shù) int vall2 = threadLocalRandom.nextDouble(2.0, 10.0);BigDecimal類
BigDecimal能精確表示、計(jì)算浮點(diǎn)數(shù)。該類提供了大量的構(gòu)造器用于創(chuàng)建BigDecimal對(duì)象,包括把所有基本數(shù)值型變量轉(zhuǎn)換成一個(gè)BigDecimal對(duì)象,也包括利用數(shù)字字符串、數(shù)字字符數(shù)組來(lái)創(chuàng)建BigDecimal對(duì)象。
BigDecimal(String val)構(gòu)造器的結(jié)果是可預(yù)知的——寫入new BigDecimal("0.1")將創(chuàng)建一個(gè)BigDecimal對(duì)象,優(yōu)先建議使用基于String的構(gòu)造器
如果必須使用double浮點(diǎn)數(shù)作為BigDecimal構(gòu)造器的參數(shù)時(shí), 不要直接將該double浮點(diǎn)數(shù)作為構(gòu)造器參數(shù)創(chuàng)建BigDecimal對(duì)象,而是通過(guò)BigDecimal.valueOf(double calue)靜態(tài)方法來(lái)創(chuàng)建BigDecimal對(duì)象
Java8的日期、時(shí)間類 Date類Date():生成一個(gè)代表當(dāng)前日期的Date對(duì)象
Date(long date):根據(jù)指定的long型整數(shù)來(lái)生成一個(gè)Date對(duì)象
boolean after(Date when):測(cè)試該日期是否在指定日期when之后
boolean before(Date when):測(cè)試該日期是否在指定日期when之前
long getTime():返回該時(shí)間對(duì)應(yīng)的long型整數(shù),即從GMT 1970-01-01 00:00:00到該Date對(duì)象之間的時(shí)間差,以毫秒為計(jì)時(shí)單位
void setTime():設(shè)置該Date對(duì)象的時(shí)間
Calendar類是一個(gè)抽象類,所以不能使用構(gòu)造器來(lái)創(chuàng)建Calendar對(duì)象。但它提供了幾個(gè)靜態(tài)getInstance()方法來(lái)獲取Calendar對(duì)象,這些方法根據(jù)TimeZone,Locale類來(lái)獲取特定的Calendar
Calendar類提供了大量訪問、修改日期時(shí)間的方法
void add(int field, int amount):根據(jù)日歷的規(guī)則,為給定的日歷字段添加或減去指定的時(shí)間量
int get(int field):返回給定日歷字段的值
int getActualMaximum(int field):返回指定日歷字段可能擁有的最大值
int getActualMinimum(int field):返回指定日歷字段可能擁有的最小值
void roll(int field, int amount):向指定日歷字段添加指定(有符號(hào)的)時(shí)間量,不更改更大的字段
void set(int field, int value):將給定的日歷字段設(shè)置為給定值
void set(int year, int month, int date):設(shè)置日歷字段年、月、日的值
void set(int year, int month, int date, int hourOfDay, int minute):設(shè)置日歷字段年、月、日、時(shí)、分、秒的值。
public class CalendarTest { public static void main(String[] args) { Calendar c = Calendar.getInstance(); // 取出年 System.out.println(c.get(YEAR)); // 取出月份 System.out.println(c.get(MONTH)); // 取出日 System.out.println(c.get(DATE)); // 分別設(shè)置年、月、日、小時(shí)、分鐘、秒 c.set(2003 , 10 , 23 , 12, 32, 23); //2003-11-23 12:32:23 System.out.println(c.getTime()); // 將Calendar的年前推1年 c.add(YEAR , -1); //2002-11-23 12:32:23 System.out.println(c.getTime()); // 將Calendar的月前推8個(gè)月 c.roll(MONTH , -8); //2002-03-23 12:32:23 System.out.println(c.getTime()); Calendar cal1 = Calendar.getInstance(); cal1.set(2003, 7, 23, 0, 0 , 0); // 2003-8-23 cal1.add(MONTH, 6); //2003-8-23 => 2004-2-23 System.out.println(cal1.getTime()); Calendar cal2 = Calendar.getInstance(); cal2.set(2003, 7, 31, 0, 0 , 0); // 2003-8-31 // 因?yàn)檫M(jìn)位到后月份改為2月,2月沒有31日,自動(dòng)變成29日 cal2.add(MONTH, 6); // 2003-8-31 => 2004-2-29 System.out.println(cal2.getTime()); Calendar cal3 = Calendar.getInstance(); cal3.set(2003, 7, 23, 0, 0 , 0); //2003-8-23 // MONTH字段“進(jìn)位”,但YEAR字段并不增加 cal3.roll(MONTH, 6); //2003-8-23 => 2003-2-23 System.out.println(cal3.getTime()); Calendar cal4 = Calendar.getInstance(); cal4.set(2003, 7, 31, 0, 0 , 0); //2003-8-31 // MONTH字段“進(jìn)位”后變成2,2月沒有31日, // YEAR字段不會(huì)改變,2003年2月只有28天 cal4.roll(MONTH, 6); //2003-8-31 => 2003-2-28 System.out.println(cal4.getTime()); } }add與roll的區(qū)別
add(int field, int amount)
當(dāng)被修改的字段超過(guò)它允許的范圍時(shí),會(huì)發(fā)生進(jìn)位,即上一級(jí)字段會(huì)增大
如果下一級(jí)字段也需要改變,那么該字段會(huì)修正到變化最小的值
roll當(dāng)被修改的字段超過(guò)它允許的范圍時(shí),上一級(jí)字段不會(huì)增大,下一級(jí)字段的處理規(guī)則與add相似
Calendar的容錯(cuò)性public class LenientTest { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // 結(jié)果是YEAR字段加1,MONTH字段為1(二月) cal.set(MONTH , 13); //① System.out.println(cal.getTime()); // 關(guān)閉容錯(cuò)性 cal.setLenient(false); // 導(dǎo)致運(yùn)行時(shí)異常 cal.set(MONTH , 13); //② System.out.println(cal.getTime()); } }
①代碼可以正常運(yùn)行,YEAR字段加1;②代碼將會(huì)導(dǎo)致運(yùn)行時(shí)異常,因?yàn)樵O(shè)置MONTH字段超出了MONTH字段允許的范圍。Calendar提供了一個(gè)setLenient()用于設(shè)置它的容錯(cuò)性,Calendar默認(rèn)支持較好的容錯(cuò)性,通過(guò)setLenient(false)可以關(guān)閉Calendar的容錯(cuò)性,讓它嚴(yán)格的參數(shù)檢查。
Java8新增的日期、時(shí)間包Clock:該類用于獲取指定時(shí)間的當(dāng)前的日期、時(shí)間。該類可取代System類的currentTimeMillis()方法,而且提供了更多方法來(lái)獲取當(dāng)前日期、時(shí)間。該類提供了大量靜態(tài)方法來(lái)獲取Clock對(duì)象
Duration:該類代表持續(xù)的時(shí)間
Instant:代表一個(gè)具體的時(shí)刻,可以精確到納秒。提供了靜態(tài)now()方法來(lái)獲取當(dāng)前時(shí)刻,也提供了靜態(tài)的now(Clock clock)方法來(lái)獲取clock對(duì)應(yīng)的時(shí)刻。minusXxx()和plusXxx()方法在當(dāng)前時(shí)刻的基礎(chǔ)上減去/加上一段時(shí)間
LocalDate:該類代表不帶時(shí)區(qū)的日期。供了靜態(tài)的now(Clock clock)方法來(lái)獲取clock對(duì)應(yīng)的日期。minusXxx()和plusXxx()方法在當(dāng)前年份基礎(chǔ)上減去/加上幾年、幾月、幾周或幾日
LocalTime:該類代表不帶時(shí)區(qū)的時(shí)間。供了靜態(tài)的now(Clock clock)方法來(lái)獲取clock對(duì)應(yīng)的時(shí)間。minusXxx()和plusXxx()方法在當(dāng)前年份基礎(chǔ)上減去/加上幾小時(shí)、幾分、幾秒等
LocalDateTime:該類代表不帶時(shí)區(qū)的日期、時(shí)間。供了靜態(tài)的now(Clock clock)方法來(lái)獲取clock對(duì)應(yīng)的時(shí)間、日期。minusXxx()和plusXxx()方法在當(dāng)前年份基礎(chǔ)上減去/加上幾年、幾月、幾周、幾日、幾小時(shí)、幾分、幾秒等
MonthDay:該類僅表示月日。提供了靜態(tài)的now(Clock clock)方法
Year:該類僅表示年。提供了靜態(tài)的now(Clock clock)方法。minusYears()和plusYears()方法
-YearMonth:該類僅代表年月。提供了靜態(tài)的now(Clock clock)方法,minusXxx()和plusXxx()方法
ZonedDatetime:該類代表一個(gè)時(shí)區(qū)化的日期、時(shí)間
ZoneId:該類代表一個(gè)時(shí)區(qū)
DayofWeek:這是一個(gè)枚舉類周一到周六的枚舉
Mouth:該類也是一個(gè)枚舉類,定義一月到十二月的枚舉值
public class NewDatePackageTest
{
public static void main(String[] args) { // -----下面是關(guān)于Clock的用法----- // 獲取當(dāng)前Clock Clock clock = Clock.systemUTC(); // 通過(guò)Clock獲取當(dāng)前時(shí)刻 System.out.println("當(dāng)前時(shí)刻為:" + clock.instant()); // 獲取clock對(duì)應(yīng)的毫秒數(shù),與System.currentTimeMillis()輸出相同 System.out.println(clock.millis()); System.out.println(System.currentTimeMillis()); // -----下面是關(guān)于Duration的用法----- Duration d = Duration.ofSeconds(6000); System.out.println("6000秒相當(dāng)于" + d.toMinutes() + "分"); System.out.println("6000秒相當(dāng)于" + d.toHours() + "小時(shí)"); System.out.println("6000秒相當(dāng)于" + d.toDays() + "天"); // 在clock基礎(chǔ)上增加6000秒,返回新的Clock Clock clock2 = Clock.offset(clock, d); // 可看到clock2與clock1相差1小時(shí)40分 System.out.println("當(dāng)前時(shí)刻加6000秒為:" +clock2.instant()); // -----下面是關(guān)于Instant的用法----- // 獲取當(dāng)前時(shí)間 Instant instant = Instant.now(); System.out.println(instant); // instant添加6000秒(即100分鐘),返回新的Instant Instant instant2 = instant.plusSeconds(6000); System.out.println(instant2); // 根據(jù)字符串中解析Instant對(duì)象 Instant instant3 = Instant.parse("2014-02-23T10:12:35.342Z"); System.out.println(instant3); // 在instant3的基礎(chǔ)上添加5小時(shí)4分鐘 Instant instant4 = instant3.plus(Duration .ofHours(5).plusMinutes(4)); System.out.println(instant4); // 獲取instant4的5天以前的時(shí)刻 Instant instant5 = instant4.minus(Duration.ofDays(5)); System.out.println(instant5); // -----下面是關(guān)于LocalDate的用法----- LocalDate localDate = LocalDate.now(); System.out.println(localDate); // 獲得2014年的第146天 localDate = LocalDate.ofYearDay(2014, 146); System.out.println(localDate); // 2014-05-26 // 設(shè)置為2014年5月21日 localDate = LocalDate.of(2014, Month.MAY, 21); System.out.println(localDate); // 2014-05-21 // -----下面是關(guān)于LocalTime的用法----- // 獲取當(dāng)前時(shí)間 LocalTime localTime = LocalTime.now(); // 設(shè)置為22點(diǎn)33分 localTime = LocalTime.of(22, 33); System.out.println(localTime); // 22:33 // 返回一天中的第5503秒 localTime = LocalTime.ofSecondOfDay(5503); System.out.println(localTime); // 01:31:43 // -----下面是關(guān)于localDateTime的用法----- // 獲取當(dāng)前日期、時(shí)間 LocalDateTime localDateTime = LocalDateTime.now(); // 當(dāng)前日期、時(shí)間加上25小時(shí)3分鐘 LocalDateTime future = localDateTime.plusHours(25).plusMinutes(3); System.out.println("當(dāng)前日期、時(shí)間的25小時(shí)3分之后:" + future); // 下面是關(guān)于Year、YearMonth、MonthDay的用法示例----- Year year = Year.now(); // 獲取當(dāng)前的年份 System.out.println("當(dāng)前年份:" + year); // 輸出當(dāng)前年份 year = year.plusYears(5); // 當(dāng)前年份再加5年 System.out.println("當(dāng)前年份再過(guò)5年:" + year); // 根據(jù)指定月份獲取YearMonth YearMonth ym = year.atMonth(10); System.out.println("year年10月:" + ym); // 輸出XXXX-10,XXXX代表當(dāng)前年份 // 當(dāng)前年月再加5年,減3個(gè)月 ym = ym.plusYears(5).minusMonths(3); System.out.println("year年10月再加5年、減3個(gè)月:" + ym); MonthDay md = MonthDay.now(); System.out.println("當(dāng)前月日:" + md); // 輸出--XX-XX,代表幾月幾日 // 設(shè)置為5月23日 MonthDay md2 = md.with(Month.MAY).withDayOfMonth(23); System.out.println("5月23日為:" + md2); // 輸出--05-23 }
}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/66328.html
摘要:正則表達(dá)式的概述和簡(jiǎn)單使用正則表達(dá)式是指一個(gè)用來(lái)描述或者匹配一系列符合某個(gè)語(yǔ)法規(guī)則的字符串的單個(gè)字符串。例如,在表達(dá)式中,存在四個(gè)這樣的組組零始終代表整個(gè)表達(dá)式。 1_正則表達(dá)式的概述和簡(jiǎn)單使用 A:正則表達(dá)式 是指一個(gè)用來(lái)描述或者匹配一系列符合某個(gè)語(yǔ)法規(guī)則的字符串的單個(gè)字符串。其實(shí)就是一種規(guī)則。有自己特殊的應(yīng)用。 作用:比如注冊(cè)郵箱,郵箱有用戶名和密碼,一般會(huì)對(duì)其限制長(zhǎng)度,這個(gè)...
格式化數(shù)字打印輸出 之前你已經(jīng)看到使用print和println方法將字符串打印到標(biāo)準(zhǔn)輸出(System.out),由于所有數(shù)字都可以轉(zhuǎn)換為字符串(你將在本課后面看到),你可以使用這些方法打印出任意的字符串和數(shù)字混合,但是,Java編程語(yǔ)言還有其他方法,可以在包含數(shù)字時(shí)對(duì)打印輸出進(jìn)行更多控制。 printf和format方法 java.io包中包含一個(gè)PrintStream類,它有兩種格式化方法可...
摘要:常用類概述包含執(zhí)行基本數(shù)字運(yùn)算的方法沒有構(gòu)造方法,如何使用類中的成員呢看類的成員是否都是靜態(tài)的,如果是,通過(guò)類名就可以直接調(diào)用。所有類都直接或間接的繼承該類。 1 常用API1.1 Math1.1.1 Math類概述Math包含執(zhí)行基本數(shù)字運(yùn)算的方法沒有構(gòu)造方法,如何使用類中的成員呢?看類的成員是否都是靜態(tài)的,...
摘要:基礎(chǔ)知識(shí)之日期操作簡(jiǎn)介中的時(shí)間使用標(biāo)準(zhǔn)類庫(kù)的其表示特定的瞬間,精確到毫秒。常用的方法實(shí)例化對(duì)象簡(jiǎn)介是一個(gè)以與語(yǔ)言環(huán)境有關(guān)的方式來(lái)格式化和解析日期的具體類。它允許進(jìn)行格式化日期文本解析文本日期和規(guī)范化。 Java基礎(chǔ)知識(shí)之日期操作 1. Date 簡(jiǎn)介 Java中的時(shí)間使用標(biāo)準(zhǔn)類庫(kù)的java.util.Date,其表示特定的瞬間,精確到毫秒。 是用距離一個(gè)固定時(shí)間點(diǎn)的毫秒數(shù)(可正可負(fù),l...
摘要:打印字符串我在人民廣場(chǎng)吃著炸雞打印字符串模板我在吃著炸雞人民廣場(chǎng)我在人民廣場(chǎng)吃著炸雞打印數(shù)組日志工具封裝的日志工廠兼容了各大日志框架,使用起來(lái)也非常簡(jiǎn)便。 前言 無(wú)...
閱讀 1398·2021-09-04 16:40
閱讀 3512·2021-07-28 00:13
閱讀 2945·2019-08-30 11:19
閱讀 2667·2019-08-29 12:29
閱讀 3219·2019-08-29 12:24
閱讀 1169·2019-08-26 13:28
閱讀 2454·2019-08-26 12:01
閱讀 3500·2019-08-26 11:35