Java 常用類
記錄一些Java 學(xué)習(xí)使用, 經(jīng)常使用類進(jìn)行總結(jié).. 這個(gè)文章感覺還是很有必要的
后面會(huì)常總結(jié)擴(kuò)展...
String字符串相關(guān)的類
String Java.lang包
Java中字符串被稱作為 String 類型對(duì)象來處理
String類是Java設(shè)計(jì)人員預(yù)先提供一個(gè)非常有用的類
Java.lang包中!
- String是一個(gè)final類,代表不可變的字符序列
- 字符串是常量,用雙引號(hào)引起來表示睹簇。它們的值:
在創(chuàng)建之后不能更改
- String對(duì)象的字符內(nèi)容是存儲(chǔ)在一個(gè)字符數(shù)組value[]中的 ??
- 實(shí)現(xiàn)了
序列化
Comparable比較器
CharSequence
接口
String對(duì)象的創(chuàng)建:
子面量定義方式;
String s = "Hello World"; 就是我們常用的方式...
String代表不可變的字符序列,簡(jiǎn)稱不可變性:
在不new String(""); 情況直接賦值相同值String類型對(duì)象,==比較是相同的;
String a = "abc";
String b = "abc";
boolean isok = (a==b); 結(jié)果為true;(==比對(duì)象比地址)
原因:
Java首次通過字面量方式聲明給一個(gè)字符串賦值時(shí),會(huì)將字符串值聲明在: "Jvm方法區(qū)中常量池里,并把地址賦值給,棧空間中的String對(duì)象上;"
當(dāng)又一個(gè)String對(duì)象以字面量的方式賦同樣的值,它會(huì)直接引用相同的地址值;
所以: "字面量賦值相同的String對(duì)象值 == 比較值相同結(jié)果為: true" (其實(shí)就是地址相同;
String不可變性:
當(dāng)對(duì)字符串的值,重新賦值/拼接時(shí),常量池中會(huì)出現(xiàn)你新賦值的一個(gè)空間字符串,需要重新指定常量池的地址值;而不是在改變?cè)瓤臻g的值;
String s = new String();
new創(chuàng)建一個(gè)空字符串,相當(dāng)于底層new char[0];
在堆空間創(chuàng)建出,空間存儲(chǔ)值,并把地址復(fù)制給,棧空間的對(duì)象引用;
所以:
String s = new String("s");
String s1 = new String("s");
boolean isok = (s==s1); 結(jié)果為 false
對(duì)象指向的是堆空間的地址,new一個(gè)就產(chǎn)生一個(gè)...所以兩個(gè)new對(duì)象的地址永遠(yuǎn)不會(huì)true;
但因?yàn)镾tring值是存放在 常量池中的...所以其實(shí)真實(shí)情況是: "對(duì)象椑嗜簦———指向> 堆地址 ——指向> 方法區(qū)"
String的內(nèi)存解析:
首先我們要知道:Java創(chuàng)建對(duì)象
-
JVM 里面有兩個(gè)用于存儲(chǔ)對(duì)象的空間
堆
棧
堆:存放所有new出來的對(duì)象
棧:存放基本類型的變量數(shù)據(jù)和對(duì)象的引用
對(duì)象本身不存放在棧中,而是存放在:堆 或 常量池;引用類型棧對(duì)象只指向堆的地址~
所以: new a 和 new b 程序在堆空間開啟了兩個(gè)地址昌罩,a b指向的堆地址不同
a==b==比較地址返回 false
-
首先對(duì)于對(duì)象引用類型哭懈,程序每
new
一次的操作, 都會(huì)在JVM的堆空間中開辟一個(gè)內(nèi)存空間...
字面量方式賦值:
new String() 賦值:
String類的常用方法();
這里就不一一舉例了,使用多了自然就會(huì)用了...
int .length(); //返回字符串長(zhǎng)度;
char[] .toCharArray(); //String 與 char[]數(shù)組轉(zhuǎn)換;
//char[]數(shù)組轉(zhuǎn)換成String String str = new String(char[]);
byte[] .getBytes(); //String 與 byte[]數(shù)組轉(zhuǎn)換; byte類型值是數(shù)值類型的哦; a對(duì)應(yīng)97...
注意中文: 分為一個(gè)/多個(gè)字節(jié),注意編碼格式; .getBytes();使用編輯器默認(rèn)編碼格式,可以通過.getBytes("utf-8");指定編碼格式;
一個(gè)中文utf-8是3個(gè)字節(jié); GBK是2個(gè)字節(jié);
boolean .isEmpty(); //判斷字符串是否是否是空字符;
str.length()==0; 空true 則false
boolean .startWith(str); //判斷當(dāng)前字符串是否以 str開頭是true則false 區(qū)分大小寫;
boolean .endsWith(str); //判斷當(dāng)前字符串是否以 str結(jié)尾是true則false 區(qū)分大小寫;
boolean .contains(); //該方法判斷字符串中是否有指定字符內(nèi)容,
有true 無則false;
eg: ABCD.conntains("ABC"); true;
int .compareTo(String); //比較字符串大小;可進(jìn)行字符串排序;
str.compareTo(str1); 一個(gè)給比較內(nèi)部值 負(fù)數(shù)str小,正數(shù)str大 0str一樣大等于str1;
char .charAt(int); //獲取指定位置的字符;
注意數(shù)組越界 "String歸根結(jié)底是一個(gè) char[] 字符數(shù)組峡迷!"
String .replace("1","2"); //替換將字符串
指定位置1字符/字符串,替換為2字符/字符串;
boolean .equals(String); //比較字符串值是否一致 String
"String重寫了Object類的equals(Objetc o)方法;"
String .toLowerCase(); //轉(zhuǎn)換 字符串 中英文字母 為小寫;
返回字符串小寫形式,不影響堆/常量池
String .toUpperCase(); //轉(zhuǎn)換 字符串 中英文字母 為大寫;
返回字符串大寫形式,不影響堆/常量池
String .concat(); //字符串1 .concat(字符串2);
將2內(nèi)容追加在 1后面返回字符串; 也可以用'+' 拼接但效率低下;
String .trim(); 返回一個(gè)不含空格的字符串;將字符串中所有空格取消;
int .indexof(''); 從頭開始搜索 獲取字符在字符串中的位置:
下標(biāo) 0開始 如果沒有 該字符返回 -1; //如果參數(shù)是字符串以第一個(gè)字符為準(zhǔn)
int .lastIndexof(''); 從后搜索第一個(gè)符合指定字符的位置 0開始沒有返回 -1; //如果參數(shù) 是 字符串 以第一個(gè) 字符為準(zhǔn)
String .Substring(int); //提取從索引位置開始到后面所有的 字符串 返回;
String .Substring(int1,int2); //提取范圍內(nèi)字符串;
String[] .spilt(String,int); //拆分:
根據(jù) String 字符為拆分 字符進(jìn)行拆分 返回 拆分后字符串?dāng)?shù)組[] 如果不指定 String 則 按 每個(gè)單字符 返回 數(shù)組;
int 用來限制返回?cái)?shù)組中元素個(gè)數(shù); "可選,默認(rèn)即不限制返回String[] 數(shù)組银伟!";
還可以是 正則表達(dá)式: |表示,或: str.spilt(",|."); 根據(jù) 逗號(hào) 或 句號(hào) 拆分!
StringBuffer
StringBuffer:
-
我們都知道,String類绘搞,并不適合頻繁的拼接彤避,
每次拼接,其實(shí)是在JVM 方法區(qū)中有重復(fù)創(chuàng)建一個(gè)
字符常量數(shù)組夯辖! -
Java.lang.StringBuffer代表
可變的字符序列
即琉预,可以動(dòng)態(tài)的拼接String 而不會(huì)開辟新的空間消耗內(nèi)存! - 很多方法與String相同蒿褂,作為參數(shù)傳遞時(shí)圆米,方法內(nèi)部可以改變值。
創(chuàng)建:
StringBuffer類不同于String啄栓,其對(duì)象必須使用構(gòu)造器生成 有三個(gè)構(gòu)造器
-
StringBuffer()
初始容量為16的字符串緩沖區(qū)
本質(zhì)上StringBuffer 底層也是一個(gè)字符數(shù)組娄帖,但不是常量數(shù)組長(zhǎng)度可以動(dòng)態(tài)改變的
默認(rèn)長(zhǎng)度16 - StringBuffer(int size) 構(gòu)造指定容量的字符串緩沖區(qū)
- StringBuffer(String str) 將內(nèi)容初始化為指定字符串內(nèi)容 String s = new String("我喜歡學(xué)習(xí)");
StringBuffer類的常用方法:
StringBuffer s = new StringBuffer(); //聲明一個(gè)空 StringBuffer對(duì)象;底層相當(dāng)于 new char[16];
StringBuffer s = new StringBuffer("ABC"); //聲明一個(gè)字符串 "ABC", 底層相當(dāng)于 new char["abc".length()+16];
總而言之:
就是會(huì),預(yù)存多幾個(gè)位置,供添加,如果還是超過了16,放心不會(huì)越界,反而它還會(huì)變大.自動(dòng)擴(kuò)容原長(zhǎng)度*2...哈哈.
注意的是 s.length(); 長(zhǎng)度還是你本身的字符長(zhǎng)度....
StringBuffer .toString(); //將StringBuffer 類型字符串 轉(zhuǎn)換為String 類型對(duì)象返回; Object類方法 一些寫類重寫了其方法(自定義類也可以重其方法);
StringBuffer .append(String); //拼接指定字符串效率高..在char[]數(shù)組后添加..
StringBuffer .insert(int位置,參數(shù)); //在字符串指定位置 int 中插入?yún)?shù); 參數(shù)可以實(shí) String 任何類型....;
StringBuffer .delete(int start,int end); //刪除指定位置的內(nèi)容
StringBuffer .replace(int start, int end, String str); //把[start,end)位置替換為str
StringBuffer .reverse(); //把當(dāng)前字符串逆轉(zhuǎn)昙楚!
StringBuilder
StringBuilder 和 StringBuffer 非常類似近速,均代表可變的字符序列,而且 提供相關(guān)功能的方法也一樣
總結(jié):
String、StringBuffer削葱、StringBuilder
- 三者都是操作字符串的一種類:
- String(JDK1.0):不可變字符序列
- StringBuffer(JDK1.0):可變字符序列奖亚、效率低、
線程安全
- StringBuilder(JDK 5.0):可變字符序列析砸、效率高昔字、
線程不安全
三者執(zhí)行效率:
- String < StringBuffer < StringBuilder
注意:
作為參數(shù)傳遞的話,方法內(nèi)部String不會(huì)改變其值首繁,StringBuffer和StringBuilder 會(huì)改變其值
String 是一種特殊的 引用類型
, StringBuffer 和 StringBuilder 相當(dāng)于還是一種 引用類型的對(duì)字符串操作的一種類作郭!
JDK8 之前的日期時(shí)間 API
世界時(shí)間:
時(shí)間是一個(gè)非常抽象的概念,多少年來弦疮,吸引著無數(shù)科學(xué)家所坯、物理學(xué)家、甚至哲學(xué)家花費(fèi)畢生精力去解釋時(shí)間的本質(zhì)是什么
- 這里我們不探討高深莫測(cè)的學(xué)術(shù)知識(shí)挂捅,只把目光放聚焦在計(jì)算機(jī)這個(gè)很小的范疇內(nèi)芹助。
- 具體可以了解這里(大佬~)
計(jì)算世界時(shí)間的主要標(biāo)準(zhǔn):
UTC Coordinated Universal Time
- 世界標(biāo)準(zhǔn)時(shí)間:
- 協(xié)調(diào)世界時(shí)是以原子時(shí)秒長(zhǎng)為基礎(chǔ),國(guó)際原子時(shí)的準(zhǔn)確度為每日數(shù)納秒闲先,原子鐘
現(xiàn)在我們使用的互聯(lián)網(wǎng)就采用該計(jì)時(shí)標(biāo)準(zhǔn)
- 經(jīng)嚴(yán)謹(jǐn)計(jì)算得到的時(shí)間状土,精確到秒,誤差在0.9s以內(nèi)伺糠, 是比GMT更為精確的世界時(shí)間
GMT Greenwich Mean Time
- 格林威治時(shí)間
- 英國(guó)倫敦格林威治定為0°經(jīng)線開始的地方蒙谓,地球每15°經(jīng)度 被分為一個(gè)時(shí)區(qū),共分為24個(gè)時(shí)區(qū)训桶,相鄰時(shí)區(qū)相差一小時(shí)
中國(guó)北京位于東八區(qū)累驮,GMT時(shí)間比北京時(shí)間慢8小時(shí)
- 格林尼治標(biāo)準(zhǔn)時(shí)間的正午是指當(dāng)太陽橫穿格林尼治子午線時(shí)(也就是在格林尼治上空最高點(diǎn)時(shí), 時(shí)間
CST Central Standard Time
-
中亞時(shí)間
中國(guó): 北京時(shí)間~
-
四個(gè)不同時(shí)區(qū)的縮寫:
Central Standard Time (USA) UTC-6:00 美國(guó)標(biāo)準(zhǔn)時(shí)間
Central Standard Time (Australia) UTC+9:30 澳大利亞標(biāo)準(zhǔn)時(shí)間
China Standard Time UTC+8:00 中國(guó)標(biāo)準(zhǔn)時(shí)間
Cuba Standard Time UTC-4:00 古巴標(biāo)準(zhǔn)時(shí)間
在Java8之前時(shí)間API:
java.util.Date:表示Java中的日期,但是能夠操作到時(shí)間級(jí)別舵揭,
如今這個(gè)類中的很多方法都已經(jīng)被廢棄谤专,不建議使用;
Date主要負(fù)責(zé)存儲(chǔ)一個(gè)絕對(duì)時(shí)間并對(duì)兩邊提供操作接口
java.sql.Date:表示數(shù)據(jù)庫時(shí)間午绳,只能操作到日期置侍,不能讀取和修改時(shí)間;
java.sql.Time:表示數(shù)據(jù)庫時(shí)間拦焚;
java.sql.Timestamp:時(shí)間戳蜡坊;
Calendar:工具類,提供時(shí)間的加減等復(fù)雜操作赎败,支持時(shí)區(qū)秕衙;
Calendar負(fù)責(zé)對(duì)Date中特定信息僵刮,比如這個(gè)時(shí)間是該年的第幾個(gè)星期
此外据忘,還可以通過set,add,roll接口來進(jìn)行日期時(shí)間的增減TimeZone:表示時(shí)區(qū)峡钓;
SimpleDateFormat:日期格式化類,非常常用
SimpleDateFormat主要作為一些格式化的輸入輸出
Date java.util包
構(gòu)造器:
java.util 包提供了 Date 類來封裝當(dāng)前的日期和時(shí)間 Date 類提供兩個(gè)構(gòu)造函數(shù)來實(shí)例化 Date 對(duì)象
第一個(gè)構(gòu)造函數(shù)使用當(dāng)前日期和時(shí)間來初始化對(duì)象
new Date();
第二個(gè)構(gòu)造函數(shù)接收一個(gè)參數(shù)若河,該參數(shù)是從1970年1月1日起的毫秒數(shù)。
new Date(long l);
第三個(gè)還有很多構(gòu)造器被 @Deprecated 被Java過時(shí)注解標(biāo)記為,以過期了... "并不是不能使用,而是不建議使用...已經(jīng)過期了."
@Deprecated
public Date(int year, int month, int date){ ... } "該構(gòu)造器輸入的 年月日 創(chuàng)建日期對(duì)象, year month 并不準(zhǔn)確存在偏移量寞宫!"
應(yīng)該是這個(gè)被淘汰了吧, JDK8出現(xiàn)LocalDate "和他功能類似萧福!"
...
常用方法:
long getTime( ) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對(duì)象表示的毫秒數(shù)。
String toString( ) 把此 Date 對(duì)象轉(zhuǎn)換為以下形式的 String
dow mon dd hh:mm:ss zzz yyyy 其中:dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)
boolean after(Date date) 若當(dāng)調(diào)用此方法的Date對(duì)象在指定日期之后返回true,否則返回false
boolean before(Date date) 若當(dāng)調(diào)用此方法的Date對(duì)象在指定日期之前返回true,否則返回false
int compareTo(Date date) 比較當(dāng)調(diào)用此方法的Date對(duì)象和指定日期辈赋。兩者相等時(shí)候返回0,
調(diào)用對(duì)象在指定日期之前則返回負(fù)數(shù)
調(diào)用對(duì)象在指定日期之后則返回正數(shù)
boolean equals(Object date) Date 重寫的Object類的方法鲫忍! 使其比較的不在是地址!
Demo:
package com.wsm.date;
import java.util.Date;
/**
* Java.util.Date 時(shí)間類的使用:
*/
public class DateDemo {
public static void main(String[] args) {
//Java.util 包提供了 Date類來封裝當(dāng)前的日期和時(shí)間
//Date類提供兩個(gè)構(gòu)造函數(shù)來實(shí)例化 Date 對(duì)象
//new Date(); 構(gòu)造器;
Date d1 = new Date(); //默認(rèn)獲取當(dāng)前日期;
System.out.println("new Date():\t"+d1); //Date類默認(rèn)重寫的 toString(); 不直接打印地址钥屈!但,因?yàn)镴ava是老外開發(fā)的,日期格式并不符號(hào)中國(guó)~
//new Date(Long l); 構(gòu)造器;
long l = System.currentTimeMillis(); //獲取當(dāng)前日期時(shí)間戳..毫秒數(shù)~
Date d2 = new Date(l); //根據(jù): 給定的時(shí)間戳,獲取指定日期...
System.out.println("new Date(Long):\t"+d2);
//還有很多其它的構(gòu)造器,但是都過期了..
//Java注解: @Deprecated 注釋的方法類,表示JDK以過期不在維護(hù)的類,但并不影響使用...!
/**
* Date常用方法:
*/
System.out.println("getTime():\t"+d1.getTime()); //getTime(): 返回自1970 年 1 月 1 日 00:00:00 GMT 以來此Date對(duì)象,表示的毫秒數(shù);
System.out.println("toString():\t"+d1.toString()); //toString(): 把此 Date 對(duì)象轉(zhuǎn)換為以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 格式;
// dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)
// zzz是時(shí)間標(biāo)準(zhǔn),
/** 其它很多方法都過時(shí)了 */
}
}
Java.sql.Date
實(shí)例化 和 sql.Date 和 util.Date 相互轉(zhuǎn)換悟民;
package com.wsm.date;
import java.util.Date;
/**
* java.sql.Date對(duì)應(yīng)著數(shù)據(jù)庫中的日期類型的變量
* java.sql.Date extends java.util.Date 繼承Util.Date
*/
public class SqlDateDemo {
public static void main(String[] args) {
//創(chuàng)建java.sql.Date對(duì)象:
//對(duì)應(yīng)數(shù)據(jù)中的日期變量!`雖然如此但是好像還是很少使用,一般也直接使用 util.Date`
java.sql.Date date = new java.sql.Date(35235325345L); //它只包含日期而沒有時(shí)間部分,輸出時(shí)候只顯示年月日篷就!
System.out.println(date); //1971-02-13
/** 如何將java.util.Date對(duì)象轉(zhuǎn)換為java.sql.Date對(duì)象 */
//情況一:
//sql.Date 本質(zhì)上繼承了 util.Date
Date date1 = new java.sql.Date(2343243242323L); //子類賦值父類
java.sql.Date dateS = (java.sql.Date) date1; //然后在強(qiáng)轉(zhuǎn)回, 因?yàn)閐ate1 本來就是 sql.Date類型 可以強(qiáng)轉(zhuǎn)回 sql.Date;
System.out.println(dateS);
/** 運(yùn)行報(bào)錯(cuò)射亏! 父類前置轉(zhuǎn)換成子類... */
//情況二:
// java.sql.Date date2 = (java.sql.Date)new Date(); //父類直接強(qiáng)轉(zhuǎn)子類,編譯不報(bào)錯(cuò)運(yùn)行報(bào)錯(cuò)
//因?yàn)?
// 子類直接向上轉(zhuǎn)換成父類, 并可以強(qiáng)轉(zhuǎn)回子類:
// 子類本身繼承父類擁有父類的屬性方法,本身屬于 父類/子類可以來回轉(zhuǎn)換!
// 但:
// 子類繼承父類,可以聲明自己特有的方法屬性... 父類直接轉(zhuǎn)換子類,可能回不存在特有的屬性方法(); 故程序報(bào)錯(cuò)竭业!
/** java.util.Date對(duì)象轉(zhuǎn)換為java.sql.Date對(duì)象 */
//情況三:
// util.Date 存在一個(gè)方法 getTime(); 返回,當(dāng)前對(duì)象時(shí)間戳智润。
//而: sql.Date 剛好構(gòu)造函數(shù), 可以通過..時(shí)間戳聲明!
Date date3 = new Date();
java.sql.Date date4 = new java.sql.Date(date3.getTime());
System.out.println("Java.util.Date:"+date3);
System.out.println("Java.sql.Date:"+date4);
}
}
總結(jié):
sql.Date 本身繼承于 util.Date
: 擁有 util.Date 的屬性方法..
-
sql.Date 是為了未辆,和數(shù)據(jù)庫的日期類型進(jìn)行匹配賦值使用,
但實(shí)際開發(fā)中更多還是
util.Date - sql.Date 格式只能是:年月日
- util.Date 格式可以是:年月日時(shí)分秒...
Java.text.SimpleDateFormat
Date類的API不易于國(guó)際化窟绷,大部分被廢棄了
-
SimpleDateFormat 是對(duì)日期類Date的格式化 和 解析;
Date類型的toString 輸出的是英文格式的時(shí)間,而不同國(guó)家有自己的日期格式... - SimpleDateFormat 就可以以特定的規(guī)則進(jìn)行日期的 格式化Format
SimpleDateFormatDemo
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* SimpleDateFormat類:
* Date類的格式化 —— 解析
* 格式化:日期 --->字符串
* 解析:格式化的逆過程咐柜,字符串 ---> 日期
*
*/
public class SimpleDateFormatDemo {
public static void main(String[] args) throws ParseException {
//實(shí)例化SimpleDateFormat:使用默認(rèn)的構(gòu)造器
SimpleDateFormat sdf = new SimpleDateFormat(); /** 默認(rèn)的解析規(guī)則就是:(兩位)年 月 日 ... */
//格式化:日期 --->字符串
Date date = new Date();
System.out.println(date);
//格式化~
String format = sdf.format(date);
System.out.println(format);
//解析:格式化的逆過程兼蜈,字符串 ---> 日期
Date date1 = sdf.parse(format); /** 需要處理異常: 這里就throws 拋出了~ */
System.out.println(date1);
/** 使用最多... */
//*************按照指定的方式格式化和解析:調(diào)用帶參的構(gòu)造器*****************
// SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//格式化
String format1 = sdf1.format(date);
System.out.println(format1);
//解析:要求字符串必須是符合SimpleDateFormat識(shí)別的格式(通過構(gòu)造器參數(shù)體現(xiàn)),
//否則,拋異常~
Date date2 = sdf1.parse("2020-02-18 11:48:27");
System.out.println(date2);
}
}
日期和時(shí)間的格式化編碼
字母 | 描述 | 示例 |
---|---|---|
G | 紀(jì)元標(biāo)記 | AD |
y | 四位年份 | 2001 |
M | 月份 | July or 07 |
d | 一個(gè)月的日期 | 10 |
h | A.M./P.M. (1~12)格式小時(shí) | 12 |
H | 一天中的小時(shí) (0~23) | 22 |
m | 分鐘數(shù) | 30 |
s | 秒數(shù) | 55 |
S | 毫秒數(shù) | 234 |
E | 星期幾 | Tuesday |
D | 一年中的日子 | 360 |
F | 一個(gè)月中第幾周的周幾 | 2 (second Wed. in July) |
w | 一年中第幾周 | 40 |
W | 一個(gè)月中第幾周 | 1 |
a | A.M./P.M. 標(biāo)記 | PM |
k | 一天中的小時(shí)(1~24) | 24 |
K | A.M./P.M. (0~11)格式小時(shí) | 10 |
z | 時(shí)區(qū) | Eastern Standard Time |
' | 文字定界符 | Delimiter |
" | 單引號(hào) | ` |
java.util.Calendar 日歷類
Calendar是一個(gè)抽象類拙友,主用用于完成日期字段之間相互操作的功能
-
Calendar實(shí)例的方法
1.使用Calendar.getInstance()方法
2.調(diào)用它的子類GregorianCalendar的構(gòu)造器 -
一個(gè)Calendar的實(shí)例是系統(tǒng)時(shí)間的抽象表示为狸,通過get(int field)方法來取得想要的時(shí)間信息
常量: YEAR年
、MONTH月
遗契、DAY_OF_WEEK這一周第幾天
钥平、HOUR_OF_DAY這一月第幾天
MINUTE分鐘
、SECOND秒
通過get(常量);
獲取指定的~ -
常用方法
public final Date getTime()
public void set(int field,int value)
public void add(int field,int amount)
public final void setTime(Date date)
注意:
-
獲取月份時(shí):一月是0姊途,二月是1涉瘾,以此類推,12月是11
獲取星期時(shí):周日是1捷兰,周二是2 立叛, 。贡茅。秘蛇。其做。周六是7
CalendarDemo.Java
import java.util.Calendar;
import java.util.Date;
/** 日歷類對(duì)象Calendar 使用; */
public class CalendarDemo {
public static void main(String[] args) {
//1.實(shí)例化
//方式一:創(chuàng)建其子類(GregorianCalendar)的對(duì)象
// Calendar gregoriancalendar = new GregorianCalendar();
//方式二:調(diào)用其靜態(tài)方法getInstance()
Calendar calendar = Calendar.getInstance(); //獲取當(dāng)前日期的: Calendar日歷對(duì)象赁还!
// System.out.println(calendar.getClass());
//2.常用方法
//get():
// 根據(jù)常量參數(shù),獲取對(duì)應(yīng)的日期值~
int days = calendar.get(Calendar.DAY_OF_MONTH); //獲取當(dāng)月的第幾天~
System.out.println("當(dāng)月的第"+days+"天"); //打友埂!
System.out.println("當(dāng)年的第"+calendar.get(Calendar.DAY_OF_YEAR)+"天"); //獲取當(dāng)年的第幾天~
//set()
//calendar可變性
// 給當(dāng)前日歷對(duì)象 進(jìn)行年月賦值 返回值void: 直接返回給當(dāng)前對(duì)象賦值~
calendar.set(Calendar.DAY_OF_MONTH,22); //給當(dāng)前日歷對(duì)象設(shè)置為: 當(dāng)月第22天
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("修改日歷為當(dāng)月,第"+days+"天"); //打印: 22
//add(): 給當(dāng)前日歷對(duì)象進(jìn)行 + - 操作
calendar.add(Calendar.DAY_OF_MONTH,-3);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //打印: 22-3
//getTime():日歷類---> Date
// 根據(jù)當(dāng)前日歷對(duì)象的時(shí)間,返回一個(gè)Date類型數(shù)據(jù)~
Date date = calendar.getTime();
System.out.println(date);
//setTime():Date ---> 日歷類
// 將一個(gè)Date類型數(shù)據(jù),轉(zhuǎn)換為: 日歷對(duì)象艘策!
Date date1 = new Date();
calendar.setTime(date1);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
}
}
JDK8 新增的日期時(shí)間 API
前言:
Java8 之前的日期蹈胡,Date JDK1.0 時(shí)引入
基本可以滿足基本的需求。
但朋蔫,我們希望時(shí)間可以與晝夜 季節(jié) 四季有關(guān)罚渐,JDK1.1 引入了
Calendar類
而Calendar類并不比Date類好多少,它們面臨的問題
-
可變性:
calendar.set(Calendar.DAY_OF_MONTH,22); //給當(dāng)前日歷對(duì)象設(shè)置為: 當(dāng)月第22天 Calendar類的: Set(); 方法,賦值會(huì)直接改變當(dāng)前的類對(duì)象,這在Java 被成為 "可變性"
-
偏移性:
JDK8 之前時(shí)間的類Date 類其實(shí)是存在一個(gè)構(gòu)造器: "可以直接年月日返回 Date對(duì)象..." 但 Date中的年份是從1900開始的驯妄,而月份都從0開始, "直接賦值年月日,實(shí)際上返回的日期并不準(zhǔn)確,Date是存在偏移量的荷并!" //JDK8之前日期問題...Date存在便宜量~ @Test public void offsetDate(){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //Date(year, month, date); Date d1 = new Date(2000, 9, 9); //創(chuàng)建一個(gè)2020 9月9日的日期對(duì)象; System.out.println("Date類存在偏移量:"); System.out.println("未設(shè)置偏移量輸出:"+sdf.format(d1)); //設(shè)置便宜量: //Date 正因?yàn)榇嬖谄屏?而被淘汰! 而年便宜了 1900年 月默認(rèn)從0開始~所以 2020 09 09 應(yīng)該這個(gè)樣寫青扔! Date d2 = new Date(2000-1900, 9-1, 9); System.out.println("設(shè)置偏移量輸出: "+sdf.format(d2)); //正常輸出 20200909 } //控制臺(tái)輸出: Date類存在偏移量: 未設(shè)置偏移量輸出:3900-10-09 設(shè)置偏移量輸出: 2000-09-09
格式化:
格式化只對(duì)Date有用源织,Calendar則不行。 此外微猖,它們也不是線程安全的雀鹃;不能處理閏秒等。
Java8 新增API
對(duì)日期和時(shí)間的操作一直是Java程序員最痛苦的地方之一
因此:
Java8 之前出現(xiàn)了励两,
Joda-Time.Jar包
周大-泰~ 來更方便的操作黎茎,日期API而后,JDK8之后当悔,為了方便用戶操作傅瞻,直接集成了該Jar包的功能!
不在需要用戶盲憎,每次都要引入Joda-Time.Jar
依賴~
當(dāng)然如果嗅骄,你現(xiàn)在公司是Java7 你還想用這些時(shí)間ApI 還需要引入Joda-Time.Jar包
本地日期(LocalDate)
本地時(shí)間 (LocalTime)
本地日期時(shí)間(LocalDateTime)
時(shí)區(qū)(ZonedDateTime)
....為了方便操作,
古老的
Data類 Java8之后饼疙,也新增了toInstant() 方法;
用于將溺森,Date 轉(zhuǎn)換成新的表示形式,這些新增的本地化時(shí)間日期 API 大大簡(jiǎn)化了日期時(shí)間和本地化的管理窑眯。
LocalDate / Time / DateTime
LocalDate屏积、LocalTime、LocalDateTime
- LocalDate磅甩、LocalTime炊林、LocalDateTime 類是其中較重要的幾個(gè)類
它們的實(shí)例 是不可變的對(duì)象
-
分別表示使用 ISO-8601日歷系統(tǒng)的日期、時(shí)間卷要、日期和時(shí)間
它們提供了簡(jiǎn)單的本地日期或時(shí)間渣聚,并不包含當(dāng)前的時(shí)間信息独榴,也不包含與時(shí)區(qū)相關(guān)的信息 - LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存儲(chǔ) 生日、紀(jì)念日等日期
- LocalTime表示一個(gè)時(shí)間奕枝,而不是日期
- LocalDateTime是用來表示日期和時(shí)間的棺榔,這是一個(gè)最常用的類之一
ISO
-
ISO 國(guó)際標(biāo)準(zhǔn)化組織(International Organization for Standardization
常用方法
方法 | 描述 |
---|---|
now() now(ZoneId zone) |
靜態(tài)方法,根據(jù)當(dāng)前時(shí)間創(chuàng)建對(duì)象/指定時(shí)區(qū)的對(duì)象 |
of() | 靜態(tài)方法隘道,根據(jù)指定日期/時(shí)間創(chuàng)建對(duì)象 |
getDayOfMonth() getDayOfYear() |
獲得月份天數(shù)(1-31) /獲得年份天數(shù)(1-366) |
getMonthValue() getYear() |
獲得月份(1-12) /獲得年份 |
getHour() getMinute() getSecond() | 獲得當(dāng)前對(duì)象對(duì)應(yīng)的小時(shí)症歇、分鐘、秒 |
withDayOfMonth() withDayOfYear() withMonth() withYear() | 將月份天數(shù)薄声、年份天數(shù)、月份题画、年份修改為指定的值并返回新的對(duì)象 |
plusDays() plusWeeks() plusMonths() plusYears() plusHours() | 向當(dāng)前對(duì)象添加幾天默辨、幾周、幾個(gè)月苍息、幾年缩幸、幾小時(shí) |
minusMonths() minusWeeks() minusDays() minusYears() minusHours() | 從當(dāng)前對(duì)象減去幾月、幾周竞思、幾天表谊、幾年、幾小時(shí) |
Demo
LocalDateTimeDemo.Java
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;
/**
* JDK8之后的日期API
* LocalDate 年月日~
* LocalTime 時(shí)分秒~
* LocalDateTime 年月日時(shí)分秒~
* 三者,方法類似,都是JDK8 之后新增的日期類,分別用于表示不同的時(shí)間 日期 時(shí)間日期 描述的Java對(duì)象盖喷!
*/
public class LocalDateTimeDemo {
/** LocalDate LocalTime LocalDateTime 使用/常用方法();
* LocalDateTime相較于LocalDate爆办、LocalTime,使用頻率要高
* 類似于Calendar
* */
public static void main(String[] args) {
//now():獲取當(dāng)前的日期课梳、時(shí)間距辆、日期+時(shí)間
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("localDate:\t"+localDate);
System.out.println("localTime:\t"+localTime);
System.out.println("localDateTime:\t"+localDateTime);
/** 三個(gè)類重寫了toString(); 直接輸入的就是中國(guó)的日期格式~ */
//of():設(shè)置指定的年、月暮刃、日跨算、時(shí)、分椭懊、秒诸蚕。沒有偏移量
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 13, 23, 43);
System.out.println(localDateTime1);
//getXxx():獲取相關(guān)的屬性
System.out.println(localDateTime.getDayOfMonth()); //獲取當(dāng)前日是這個(gè)月的第幾天
System.out.println(localDateTime.getDayOfWeek()); //獲取當(dāng)前時(shí)間是一周中的哪一天
System.out.println(localDateTime.getMonth()); //獲取當(dāng)前月份
System.out.println(localDateTime.getMonthValue()); //獲取月份信息
System.out.println(localDateTime.getMinute()); //獲取分鐘
/** 三個(gè)類均可調(diào)用類似的方法~ 注意要存在符合的條件~ */
/** 體現(xiàn)不可變性 */
//withXxx():設(shè)置相關(guān)的屬性
// LocalDate 對(duì)象通過withxx(); 給日期對(duì)象設(shè)置日期屬性,但是,并不會(huì)改變當(dāng)前對(duì)象,而是會(huì)返回一個(gè)對(duì)象,是更高后的日期~ 本類并不會(huì)收受到影響~
LocalDate localDate1 = localDate.withDayOfMonth(22);
System.out.println("更新前對(duì)象:"+localDate);
System.out.println("更新后對(duì)象:"+localDate1);
//plusxxx(); 向當(dāng)前對(duì)象添加幾天、幾周氧猬、幾個(gè)月背犯、幾年、幾小時(shí)
LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
System.out.println(localDateTime);
System.out.println(localDateTime3);
//minusxxx(); 向當(dāng)前對(duì)象添加幾天盅抚、幾周媳板、幾個(gè)月、幾年泉哈、幾小時(shí)
LocalDateTime localDateTime4 = localDateTime.minusDays(6);
System.out.println(localDateTime);
System.out.println(localDateTime4);
}
//JDK8之前日期問題...Date存在便宜量~
@Test
public void offsetDate(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//Date(year, month, date);
Date d1 = new Date(2000, 9, 9); //創(chuàng)建一個(gè)2020 9月9日的日期對(duì)象;
System.out.println("Date類存在偏移量:");
System.out.println("未設(shè)置偏移量輸出:"+sdf.format(d1));
//設(shè)置便宜量:
//Date 正因?yàn)榇嬖谄屏?而被淘汰蛉幸! 而年便宜了 1900年 月默認(rèn)從0開始~所以 2020 09 09 應(yīng)該這個(gè)樣寫破讨!
Date d2 = new Date(2000-1900, 9-1, 9);
System.out.println("設(shè)置偏移量輸出: "+sdf.format(d2)); //正常輸出 20200909
}
}
Instant
Instant
- 時(shí)間線上的一個(gè)瞬時(shí)點(diǎn)。 這可能被用來記錄應(yīng)用程序中的事件時(shí)間戳
常用方法
方法 | 描述 |
---|---|
now() |
靜態(tài)方法奕纫,返回默認(rèn)UTC時(shí)區(qū)的Instant類的對(duì)象 UTC即本初子午線的時(shí)間... 與北京時(shí)間, 存在偏差~ |
ofEpochMilli(long epochMilli) | 靜態(tài)方法提陶,返回在1970-01-01 00:00:00基礎(chǔ)上加上指定毫秒 數(shù)之后的Instant類的對(duì)象 |
atOffset(ZoneOffset offset) |
結(jié)合即時(shí)的偏移來創(chuàng)建一個(gè) 可以通過它來, 向東偏移8 表示東八區(qū)北京時(shí)間!
|
OffsetDateTime toEpochMilli() | 返回1970-01-01 00:00:00到當(dāng)前時(shí)間的毫秒數(shù),即為時(shí)間戳 |
Demo
InsantDemo.Java
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
/***
* Instant 類的Demo學(xué)習(xí)
*
*/
public class InsantDemo {
public static void main(String[] args) {
//now():獲取本初子午線對(duì)應(yīng)的標(biāo)準(zhǔn)時(shí)間
Instant instant = Instant.now();
System.out.println(instant);//2019-02-18T07:29:41.719Z //
//北京世界東八區(qū)匹层! 1949年起的逾半世紀(jì)隙笆,在中國(guó)大陸、臺(tái)灣升筏、香港撑柔、澳門所使用的標(biāo)準(zhǔn)時(shí)間皆為東八區(qū)(UTC+8)時(shí)間
//中國(guó),占五個(gè)時(shí)區(qū).分別是東5區(qū) 東6區(qū) 東7區(qū) 東8區(qū) 東9區(qū) 據(jù)北京較遠(yuǎn)的地區(qū)也有不使用北京時(shí)間的 比如烏魯木齊時(shí)間就是東九區(qū)時(shí)間,比北京時(shí)間早一個(gè)小時(shí) 世界分24個(gè)時(shí)區(qū)
//添加時(shí)間的偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2019-02-18T15:32:50.611+08:00
//toEpochMilli(): 獲取自1970年1月1日0時(shí)0分0秒(UTC)開始的毫秒數(shù) ---> Date類的getTime()
long milli = instant.toEpochMilli();
System.out.println(milli);
//ofEpochMilli():通過給定的毫秒數(shù),獲取Instant實(shí)例 -->Date(long millis)
Instant instant1 = Instant.ofEpochMilli(1550475314878L);
System.out.println(instant1);
}
}
DateTimeFormatter
DateTimeFormatter
該類提供了三種格式化方法:
-
預(yù)定義的標(biāo)準(zhǔn)格式
就是默認(rèn)的日期格式化~ 不需要任何指定~ -
本地化相關(guān)的格式
提供了幾種定義好的枚舉您访,格式化類型~年月日時(shí)分秒
yyyy-MM-DD HH:mm:ss
-
自定義的格式
通過:ofPattern(yyyymm); 來指定日期的格式~
常用方法:
方法 | 描述 |
---|---|
ofPattern(String pattern) | 靜態(tài)方法 铅忿, 返 回一個(gè)指定字 符串格式 |
DateTimeFormatter format(TemporalAccessor t) | 格式化一個(gè)日期、時(shí)間灵汪,返回字符串 |
parse(CharSequence text) | 將指定格式的字符序列解析為一個(gè)日期檀训、時(shí)間 |
-
格式化:
將日期(對(duì)象) 轉(zhuǎn)換為字符串~
-
解析:
將字符串日期轉(zhuǎn)換為~ 日期對(duì)象
轉(zhuǎn)換的字符 和 日期對(duì)象的格式要一致, 不然轉(zhuǎn)換失敗享言!
Demo
DateTimeFormatterDemo.Java
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
/** DateTimeFormatter */
public class DateTimeFormatterDemo {
public static void main(String[] args) {
// 方式一:預(yù)定義的標(biāo)準(zhǔn)格式峻凫。如:ISO_LOCAL_DATE_TIME; ISO_LOCAL_DATE; ISO_LOCAL_TIME 分布對(duì)應(yīng)三個(gè)對(duì)象!
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//格式化:日期-->字符串
LocalDateTime localDateTime = LocalDateTime.now();
String str1 = formatter.format(localDateTime);
System.out.println(localDateTime);
System.out.println(str1);//2019-02-18T15:42:18.797
//解析:字符串 -->日期
TemporalAccessor parse = formatter.parse("2019-02-18T15:42:18.797");
System.out.println(parse);
// 方式二:
// 本地化相關(guān)的格式览露。如:ofLocalizedDateTime()
// FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :適用于LocalDateTime
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
//格式化
String str2 = formatter1.format(localDateTime);
System.out.println(str2);//2019年2月18日 下午03時(shí)47分16秒
// 本地化相關(guān)的格式荧琼。如:ofLocalizedDate()
// FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 適用于LocalDate
DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
//格式化
String str3 = formatter2.format(LocalDate.now());
System.out.println(str3);//2019-2-18
// 重點(diǎn): 方式三:自定義的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
System.out.println(str4);//2019-02-18 03:52:09
//解析
TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
System.out.println(accessor);
}
}
總結(jié):
Java8 新增了很多的日期API 其實(shí)常用的也就以上...
- Java8之前的其實(shí)還有很多人使用差牛,
JDK是向下兼容的铭腕,所以不必?fù)?dān)心
- 但,8聽說效率還挺高多糠,而且確實(shí)挺方便的...
JDK8其它API
System Java系統(tǒng)類:
java.lang 包下
的一個(gè) 系統(tǒng)類累舷,可以通過該類獲取的當(dāng)前計(jì)算機(jī)的:屬性~
-
該類的構(gòu)造器是private的 所以無法創(chuàng)建該類的對(duì)象粮揉,也就是無法實(shí)例化該類.
其內(nèi)部的成員變量和成員方法都是static
的岂嗓,所以也可以很方便的進(jìn)行調(diào)用
成員變量
-
System類內(nèi)部包含in、out和err三個(gè)成員變量
分別代表標(biāo)準(zhǔn)輸入流 (鍵盤輸入)
標(biāo)準(zhǔn)輸出流(顯示器)
標(biāo)準(zhǔn)錯(cuò)誤輸出流(顯示器)
成員方法
方法 | 描述 |
---|---|
native long currentTimeMillis() | 返回當(dāng)前的計(jì)算機(jī)時(shí)間伍绳,時(shí)間格式搭伤,當(dāng)前計(jì)算機(jī)時(shí)間和 格林威治時(shí)間所差的毫秒數(shù) |
void exit(int status) | 作用是退出程序只怎。其中status 的值為0代表正常退出,非零代表異常退出 在圖形界面編程中實(shí)現(xiàn)程序的退出功能等
|
void gc() | 作用是請(qǐng)求系統(tǒng)進(jìn)行垃圾回收怜俐。至于系統(tǒng)是否立刻回收身堡,則取決于系統(tǒng)中垃圾回收算法的實(shí)現(xiàn)以及系統(tǒng)執(zhí)行時(shí)的情況。 |
String getProperty(String key) | 該方法的作用是獲得系統(tǒng)中屬性名為key的屬性對(duì)應(yīng)的值: 如下?? |
Sacnner 掃描器:
java.util.Scanner 是 Java5 的新特征拍鲤,我們可以通過 Scanner 類來獲取用戶的控制臺(tái)輸入
需要搭配 System.in
的輸入流~ Scanner s = new Scanner(System.in);
常用方法:
方法 | 描述 |
---|---|
hasNext() 與 hasNextLine()
|
判斷是否還有輸入的數(shù)據(jù) 建議Next之前判斷一下... 這些方法執(zhí)行時(shí)都會(huì)造成堵塞贴谎,等待用戶在命令行輸入數(shù)據(jù)回車確認(rèn) |
next() 與 nextLine()
|
方法獲取輸入的字符串 nextLine() 會(huì)輸出一行信息...?? |
如果要輸入 int 或 float 類型的數(shù)據(jù)汞扎,在 Scanner 類中也有支持
next.Byte() nextDouble() nextFloat,nextInt() nextLin() nextLong() nextShot()
但是在輸入之前最好先使用 hasNextXxx() 方法進(jìn)行驗(yàn)證,再使用 nextXxx() 來讀取擅这,不然輸入int 的輸入了一個(gè) String會(huì)報(bào)錯(cuò)~
/** 成員屬性: in out err */
//in: 配合Scanner 掃描器,可以實(shí)現(xiàn)控制臺(tái)的輸入流...
//out: 這個(gè),最常用: System.out.print(); 返回一個(gè)輸出流,輸出信息
//err: 和out 類似,但是它輸出的信息一般表示錯(cuò)誤,比較顯眼的 紅色信息澈魄!
//創(chuàng)建一個(gè)掃描儀
Scanner scanner = new Scanner(System.in);
System.out.println("請(qǐng)輸入一段話s1:");
String s1 = scanner.next();
System.out.println("請(qǐng)輸入一段話s2:");
String s2 = scanner.next();
System.err.println("s1:"+s1);
System.err.println("s2:"+s2);
//注意: 不要同時(shí)兩個(gè)
// scanner.nextxxx() 寫在一起,這些方法執(zhí)行時(shí)都會(huì)造成堵塞,等待用戶在命令行輸入數(shù)據(jù)回車確認(rèn).
// 寫在一起,輸入了一個(gè)回車,則所有的 nextxxx() 都結(jié)束了仲翎!
scanner.close(); /** 要注意關(guān)閉流o 不然占用程序資源... */
SystemDemo
SysDemo.Java
import java.util.Scanner;
/**
* System 系統(tǒng)類的學(xué)習(xí)...
*/
public class SysDemo {
//main 主方法...
public static void main(String[] args) {
/** 成員屬性: in out err */
//in: 配合Scanner 掃描器,可以實(shí)現(xiàn)控制臺(tái)的輸入流...
//out: 這個(gè),最常用: System.out.print(); 返回一個(gè)輸出流,輸出信息
//err: 和out 類似,但是它輸出的信息一般表示錯(cuò)誤,比較顯眼的 紅色信息痹扇!
//創(chuàng)建一個(gè)掃描儀
Scanner scanner = new Scanner(System.in);
System.out.println("請(qǐng)輸入一段話s1:");
String s1 = scanner.next();
System.out.println("請(qǐng)輸入一段話s2:");
String s2 = scanner.next();
System.err.println("s1:"+s1);
System.err.println("s2:"+s2);
//注意: 不要同時(shí)兩個(gè)
// scanner.nextxxx() 寫在一起,這些方法執(zhí)行時(shí)都會(huì)造成堵塞,等待用戶在命令行輸入數(shù)據(jù)回車確認(rèn).
// 寫在一起,輸入了一個(gè)回車,則所有的 nextxxx() 都結(jié)束了溯香!
scanner.close(); /** 要注意關(guān)閉流o 不然占用程序資源... */
/** currentTimeMillis */
long timeStamp = System.currentTimeMillis(); //返回當(dāng)前時(shí)間,時(shí)間戳;
//時(shí)間戳: 值當(dāng)前日期距離,格林威治時(shí)間(GMT)1970-01-01 的毫秒數(shù)~
//使用:
// 通出旯梗可以,用于生產(chǎn)一個(gè)時(shí)間戳, 時(shí)間唯一的一個(gè)ID, 用作在數(shù)據(jù)庫/文件名...表示數(shù)據(jù)唯一~
System.out.println(timeStamp);
/** getProperty(): 獲取系統(tǒng)的參數(shù)信息!*/
String javaVersion = System.getProperty("java.version");
System.out.println("java的環(huán)境版本:" + javaVersion);
String javaHome = System.getProperty("java.home");
System.out.println("java的安裝路徑:" + javaHome);
String osName = System.getProperty("os.name");
System.out.println("操作系統(tǒng)的名稱:" + osName);
String osVersion = System.getProperty("os.version");
System.out.println("操作系統(tǒng)的版本:" + osVersion);
String userName = System.getProperty("user.name");
System.out.println("計(jì)算機(jī)用戶賬戶名:" + userName);
String userHome = System.getProperty("user.home");
System.out.println("用戶的主目錄:" + userHome);
String userDir = System.getProperty("user.dir");
System.out.println("用戶當(dāng)前工作目錄:" + userDir);
}
}
Math Java數(shù)學(xué)類:
Java 的 Math 包含了用于執(zhí)行基本數(shù)學(xué)運(yùn)算的屬性和方法玫坛,如初等指數(shù)结笨、對(duì)數(shù)、平方根和三角函數(shù)
Math 的方法都被定義為 static 形式昂秃,通過 Math 類可以在主函數(shù)中直接調(diào)用 不用new 可以直接調(diào)用禀梳!
常用方法:
方法 | 描述 |
---|---|
算術(shù)計(jì)算 | |
Math.sqrt() | 計(jì)算平方根 |
Math.cbrt() | 計(jì)算立方根 |
Math.pow(a, b) | 計(jì)算a的b次方 |
Math.max( , ) | 計(jì)算最大值 |
Math.min( , ) | 計(jì)算最小值 |
Math.abs() |
取絕對(duì)值 就是正數(shù)杜窄!1 -1 絕對(duì)值都是 1
|
進(jìn)位 | |
Math.ceil() |
逢余進(jìn)一 有小數(shù)就+1
|
Math.floor() |
逢余舍一 舍去小數(shù)肠骆!
|
Math.rint() | 四舍五入,返回double值塞耕。注意.5的時(shí)候會(huì)取偶數(shù) |
Math.round() | 四舍五入蚀腿,float時(shí)返回int值,double時(shí)返回long值 |
隨機(jī)數(shù) | |
Math.random() |
取得一個(gè) [0~1] 范圍內(nèi)的隨機(jī)數(shù) 通成ㄍ猓可以用該 方法+算法 獲取:1-10 1-100.. 隨機(jī)數(shù)莉钙!
|
更多待擴(kuò)展... |
MathDemo
MathDemo.Java
public static void main(String[] args) {
/** 算術(shù)計(jì)算 */
System.out.println("--------算術(shù)計(jì)算-----------");
System.out.println(Math.sqrt(16)); // 4.0 4^2 4的二次方=16
System.out.println(Math.cbrt(8)); // 2.0 2^3 2的三次方= 8
System.out.println(Math.pow(3, 2)); // 9.0 3^2 3的二次方=16 幾次方就是, x乘x次! 3x3=9
System.out.println(Math.max(2.3, 4.5)); // 4.5 判斷最大值!
System.out.println(Math.min(2.3, 4.5)); // 2.3 判斷最小值筛谚!
/**
* abs求絕對(duì)值: 就是把一個(gè)數(shù)變成 + 正數(shù)磁玉!
*/
System.out.println(Math.abs(-10.4)); // 10.4
System.out.println(Math.abs(10.1)); // 10.1
/** 進(jìn)位 */
System.out.println("--------進(jìn)位-----------");
/**
* ceil天花板的意思,就是逢余進(jìn)一
* 正數(shù)+1
* 小數(shù)+1, 小數(shù)+1~
*/
System.out.println("--------ceil-----------");
System.out.println(Math.ceil(-10.1)); // -10.0
System.out.println(Math.ceil(10.7)); // 11.0
System.out.println(Math.ceil(-0.7)); // -0.0
System.out.println(Math.ceil(0.0)); // 0.0
System.out.println(Math.ceil(-0.0)); // -0.0
System.out.println(Math.ceil(-1.7)); // -1.0
/**
* floor地板的意思驾讲,就是逢余舍一
*/
System.out.println("--------floor-----------");
System.out.println(Math.floor(-10.1)); // -11.0
System.out.println(Math.floor(10.7)); // 10.0
System.out.println(Math.floor(-0.7)); // -1.0
System.out.println(Math.floor(0.0)); // 0.0
System.out.println(Math.floor(-0.0)); // -0.0
/**
* rint 四舍五入蚊伞,返回double值 注意.5的時(shí)候會(huì)取偶數(shù) 異常的尷尬=。=
*/
System.out.println("--------rint-----------");
System.out.println(Math.rint(10.1)); // 10.0
System.out.println(Math.rint(10.7)); // 11.0
System.out.println(Math.rint(11.5)); // 12.0
System.out.println(Math.rint(10.5)); // 10.0
System.out.println(Math.rint(10.51)); // 11.0
System.out.println(Math.rint(-10.5)); // -10.0
/**
* round 四舍五入吮铭,float時(shí)返回int值时迫,double時(shí)返回long值
*/
System.out.println("--------round-----------");
System.out.println(Math.round(10)); // 10
System.out.println(Math.round(10.1)); // 10
System.out.println(Math.round(10.7)); // 11
System.out.println(Math.round(10.5)); // 11
System.out.println(Math.round(10.51)); // 11
System.out.println(Math.round(-10.5)); // -10
}
獲取100以內(nèi)的隨機(jī)數(shù)!
@Test
/** 獲取100以內(nèi)的隨機(jī)數(shù)谓晌! */
public void randomHundred(){
// Math.random() 獲取0-1 的隨機(jī)數(shù)! 包含0!
System.out.println("隨機(jī)0-1");
System.out.println(Math.random());
System.out.println("隨機(jī)0-100");
System.out.println((int)(Math.random()*100)+1);
/**
* (int)(Math.random()*100)+1
* 因?yàn)? Math.random() 獲取0-1 的隨機(jī)數(shù)! 包含0!
* *100 獲取隨機(jī)數(shù)進(jìn)兩位小數(shù),強(qiáng)制轉(zhuǎn)換(int) 會(huì)截取小數(shù)點(diǎn)..
* 因?yàn)榘? 所以+1 就不會(huì)出現(xiàn)呢0 的情況了B尤!纸肉!
*/
}
BigInteger 與 BigDecimal 類:
BigInteger
Java.math包
Interger類作為int的包裝類溺欧,能存儲(chǔ)的最大整型值為2^{31-1}
Long類也是有限的喊熟, 最大為2^{63-1}
- 如果要表示再大的整數(shù),不管是基本數(shù)據(jù)類型還是他們的包裝類都無能為力胧奔,更不用說進(jìn)行運(yùn)算了
-
BigInteger 提供所有 Java 的基本整數(shù)操作符的對(duì)應(yīng)物
并提供 Java.lang.Math 的所有相關(guān)方法 -
BigInteger 還提供以下運(yùn)算:
模算術(shù)逊移、GCD 計(jì)算、質(zhì)數(shù)測(cè)試龙填、素?cái)?shù)生成胳泉、 位操作以及一些其他操作
構(gòu)造器
- BigInteger(String val):根據(jù)字符串構(gòu)建BigInteger對(duì)象
常用方法:
BigInteger abs() 返回大整數(shù)的絕對(duì)值
BigInteger add(BigInteger val) 返回兩個(gè)大整數(shù)的和
BigInteger and(BigInteger val) 返回兩個(gè)大整數(shù)的按位與的結(jié)果
BigInteger andNot(BigInteger val) 返回兩個(gè)大整數(shù)與非的結(jié)果
BigInteger divide(BigInteger val) 返回兩個(gè)大整數(shù)的商
double doubleValue() 返回大整數(shù)的double類型的值
float floatValue() 返回大整數(shù)的float類型的值
BigInteger gcd(BigInteger val) 返回大整數(shù)的最大公約數(shù)
int intValue() 返回大整數(shù)的整型值
long longValue() 返回大整數(shù)的long型值
BigInteger max(BigInteger val) 返回兩個(gè)大整數(shù)的最大者
BigInteger min(BigInteger val) 返回兩個(gè)大整數(shù)的最小者
BigInteger mod(BigInteger val) 用當(dāng)前大整數(shù)對(duì)val求模
BigInteger multiply(BigInteger val) 返回兩個(gè)大整數(shù)的積
BigInteger negate() 返回當(dāng)前大整數(shù)的相反數(shù)
BigInteger not() 返回當(dāng)前大整數(shù)的非
BigInteger or(BigInteger val) 返回兩個(gè)大整數(shù)的按位或
BigInteger pow(int exponent) 返回當(dāng)前大整數(shù)的exponent次方
BigInteger remainder(BigInteger val)返回當(dāng)前大整數(shù)除以val的余數(shù)
BigInteger leftShift(int n) 將當(dāng)前大整數(shù)左移n位后返回
BigInteger rightShift(int n) 將當(dāng)前大整數(shù)右移n位后返回
BigInteger subtract(BigInteger val) 返回兩個(gè)大整數(shù)相減的結(jié)果
byte[] toByteArray(BigInteger val) 將大整數(shù)轉(zhuǎn)換成二進(jìn)制反碼保存在byte數(shù)組中
String toString() 將當(dāng)前大整數(shù)轉(zhuǎn)換成十進(jìn)制的字符串形式
BigInteger xor(BigInteger val) 返回兩個(gè)大整數(shù)的異或
BigDecimal
Decimal:[中:小數(shù)]
一般的Float類和Double類可以用來做科學(xué)計(jì)算或工程計(jì)算
但在商業(yè)計(jì)算中, 要求數(shù)字精度比較高岩遗,故用到 Java.math.BigDecimal
類
BigDecimal類支持不可變的扇商、任意精度的有符號(hào)十進(jìn)制定點(diǎn)數(shù)
構(gòu)造器
- public BigDecimal(double val)
- public BigDecimal(String val)
常用方法
add(BigDecimal) BigDecimal對(duì)象中的值相加,然后返回這個(gè)對(duì)象宿礁。
subtract(BigDecimal) BigDecimal對(duì)象中的值相減案铺,然后返回這個(gè)對(duì)象。
multiply(BigDecimal) BigDecimal對(duì)象中的值相乘梆靖,然后返回這個(gè)對(duì)象控汉。
divide(BigDecimal) BigDecimal對(duì)象中的值相除,然后返回這個(gè)對(duì)象返吻。
toString() 將BigDecimal對(duì)象的數(shù)值轉(zhuǎn)換成字符串姑子。
doubleValue() 將BigDecimal對(duì)象中的值以雙精度數(shù)返回。
floatValue() 將BigDecimal對(duì)象中的值以單精度數(shù)返回测僵。
longValue() 將BigDecimal對(duì)象中的值以長(zhǎng)整數(shù)返回街佑。
intValue() 將BigDecimal對(duì)象中的值以整數(shù)返回
Java的 flot double 計(jì)算有問題:
查看下面的代碼:
@Test
public void bigDecimal(){
System.out.println(0.1+0.2);
System.out.println(0.3-0.1);
System.out.println(0.2*0.1);
System.out.println(0.3/0.1);
}
因?yàn)椴徽撌莊loat 還是double都是浮點(diǎn)數(shù),而計(jì)算機(jī)是二進(jìn)制的捍靠,浮點(diǎn)數(shù)會(huì)失去一定的精確度
- 根本原因是:十進(jìn)制值通常沒有完全相同的二進(jìn)制表示形式
- 十進(jìn)制數(shù)的二進(jìn)制表示形式可能不精確沐旨。只能無限接近于那個(gè)值
但:
- 在項(xiàng)目中,我們不可能讓這種情況出現(xiàn)榨婆,特別是金融項(xiàng)目
-
如果你的支付寶賬戶余額顯示193.99999999999998磁携,那是一種怎么樣的體驗(yàn)?
??