Java 常用類
記錄一些Java 學習使用, 經常使用類進行總結… 這個文章感徑訓是很有必要的 后面會常總結擴展…
String字串相關的類
String Java.lang包

Java中字串被稱作為 String 型別物件來處理 String類是Java設計人員預先提供一個非常有用的類 Java.lang包中!
- String是一個final類,代表不可變的字符序列
- 字串是常量,用雙引號引起來表示,它們的值:
在創建之后不能更改 - String物件的字符內容是存盤在一個字符陣列value[]中的 👀
- 實作了
序列化Comparable比較器CharSequence介面
String物件的創建:
子面量定義方式;
String s = "Hello World"; 就是我們常用的方式...
String代表不可變的字符序列,簡稱不可變性:
在不new String(""); 情況直接賦值相同值String型別物件,==比較是相同的;
String a = "abc";
String b = "abc";
boolean isok = (a==b); 結果為true;(==比物件比地址)
原因:
Java首次通過字面量方式宣告給一個字串賦值時,會將字串值宣告在: "Jvm方法區中常量池里,并把地址賦值給,堆疊空間中的String物件上;"
當又一個String物件以字面量的方式賦同樣的值,它會直接參考相同的地址值;
所以: "字面量賦值相同的String物件值 == 比較值相同結果為: true" (其實就是地址相同;
String不可變性:
當對字串的值,重新賦值/拼接時,常量池中會出現你新賦值的一個空間字串,需要重新指定常量池的地址值;而不是在改變原先空間的值;
String s = new String();
new創建一個空字串,相當于底層new char[0];
在堆空間創建出,空間存盤值,并把地址復制給,堆疊空間的物件參考;
所以:
String s = new String("s");
String s1 = new String("s");
boolean isok = (s==s1); 結果為 false
物件指向的是堆空間的地址,new一個就產生一個...所以兩個new物件的地址永遠不會true;
但因為String值是存放在 常量池中的...所以其實真實情況是: "物件堆疊———指向> 堆地址 ——指向> 方法區"
String的記憶體決議:
首先我們要知道:Java創建物件
- JVM 里面有兩個用于存盤物件的空間
堆堆疊
堆:存放所有new出來的物件
堆疊:存放基本型別的變數資料和物件的參考物件本身不存放在堆疊中,而是存放在:堆 或 常量池;參考型別堆疊物件只指向堆的地址~
所以: new a 和 new b 程式在堆空間開啟了兩個地址,a b指向的堆地址不同a==b==比較地址回傳 false - 首先對于物件參考型別,程式每
new一次的操作, 都會在JVM的堆空間中開辟一個記憶體空間…
字面量方式賦值:

new String() 賦值:

String類的常用方法();
這里就不一一舉例了,使用多了自然就會用了…
int .length(); //回傳字串長度;
char[] .toCharArray(); //String 與 char[]陣列轉換;
//char[]陣列轉換成String String str = new String(char[]);
byte[] .getBytes(); //String 與 byte[]陣列轉換; byte型別值是數值型別的哦; a對應97...
注意中文: 分為一個/多個位元組,注意編碼格式; .getBytes();使用編輯器默認編碼格式,可以通過.getBytes("utf-8");指定編碼格式;
一個中文utf-8是3個位元組; GBK是2個位元組;
boolean .isEmpty(); //判斷字串是否是否是空字符;
str.length()==0; 空true 則false
boolean .startWith(str); //判斷當前字串是否以 str開頭是true則false 區分大小寫;
boolean .endsWith(str); //判斷當前字串是否以 str結尾是true則false 區分大小寫;
boolean .contains(); //該方法判斷字串中是否有指定字符內容,
有true 無則false;
eg: ABCD.conntains("ABC"); true;
int .compareTo(String); //比較字串大小;可進行字串排序;
str.compareTo(str1); 一個給比較內部值 負數str小,正數str大 0str一樣大等于str1;
char .charAt(int); //獲取指定位置的字符;
注意陣列越界 "String歸根結底是一個 char[] 字符陣列!"
String .replace("1","2"); //替換將字串
指定位置1字符/字串,替換為2字符/字串;
boolean .equals(String); //比較字串值是否一致 String
"String重寫了Object類的equals(Objetc o)方法;"
String .toLowerCase(); //轉換 字串 中英文字母 為小寫;
回傳字串小寫形式,不影響堆/常量池
String .toUpperCase(); //轉換 字串 中英文字母 為大寫;
回傳字串大寫形式,不影響堆/常量池
String .concat(); //字串1 .concat(字串2);
將2內容追加在 1后面回傳字串; 也可以用'+' 拼接但效率低下;
String .trim(); 回傳一個不含空格的字串;將字串中所有空格取消;
int .indexof(''); 從頭開始搜索 獲取字符在字串中的位置:
下標 0開始 如果沒有 該字符回傳 -1; //如果引數是字串以第一個字符為準
int .lastIndexof(''); 從后搜索第一個符合指定字符的位置 0開始沒有回傳 -1; //如果引數 是 字串 以第一個 字符為準
String .Substring(int); //提取從索引位置開始到后面所有的 字串 回傳;
String .Substring(int1,int2); //提取范圍內字串;
String[] .spilt(String,int); //拆分:
根據 String 字符為拆分 字符進行拆分 回傳 拆分后字串陣列[] 如果不指定 String 則 按 每個單字符 回傳 陣列;
int 用來限制回傳陣列中元素個數; "可選,默認即不限制回傳String[] 陣列!";
還可以是 正則運算式: |表示,或: str.spilt(",|."); 根據 逗號 或 句號 拆分!
StringBuffer
StringBuffer:
- 我們都知道,String類,并不適合頻繁的拼接,
每次拼接,其實是在JVM 方法區中有重復創建一個字符常量陣列! - Java.lang.StringBuffer代表
可變的字符序列
即,可以動態的拼接String 而不會開辟新的空間消耗記憶體! - 很多方法與String相同,作為引數傳遞時,方法內部可以改變值,
創建:
StringBuffer類不同于String,其物件必須使用構造器生成 有三個構造器
- StringBuffer()
初始容量為16的字串緩沖區
本質上StringBuffer 底層也是一個字符陣列,但不是常量陣列長度可以動態改變的默認長度16 - StringBuffer(int size) 構造指定容量的字串緩沖區
- StringBuffer(String str) 將內容初始化為指定字串內容 String s = new String(“我喜歡學習”);

StringBuffer類的常用方法:
StringBuffer s = new StringBuffer(); //宣告一個空 StringBuffer物件;底層相當于 new char[16];
StringBuffer s = new StringBuffer("ABC"); //宣告一個字串 "ABC", 底層相當于 new char["abc".length()+16];
總而言之:
就是會,預存多幾個位置,供添加,如果還是超過了16,放心不會越界,反而它還會變大.自動擴容原長度*2...哈哈.
注意的是 s.length(); 長度還是你本身的字符長度....
StringBuffer .toString(); //將StringBuffer 型別字串 轉換為String 型別物件回傳; Object類方法 一些寫類重寫了其方法(自定義類也可以重其方法);
StringBuffer .append(String); //拼接指定字串效率高..在char[]陣列后添加..
StringBuffer .insert(int位置,引數); //在字串指定位置 int 中插入引數; 引數可以實 String 任何型別....;
StringBuffer .delete(int start,int end); //洗掉指定位置的內容
StringBuffer .replace(int start, int end, String str); //把[start,end)位置替換為str
StringBuffer .reverse(); //把當前字串逆轉!
StringBuilder
StringBuilder 和 StringBuffer 非常類似,均代表可變的字符序列,而且 提供相關功能的方法也一樣
總結:
String、StringBuffer、StringBuilder
- 三者都是操作字串的一種類:
- String(JDK1.0):不可變字符序列
- StringBuffer(JDK1.0):可變字符序列、效率低、
執行緒安全 - StringBuilder(JDK 5.0):可變字符序列、效率高、
執行緒不安全
三者執行效率:
- String < StringBuffer < StringBuilder
注意:
作為引數傳遞的話,方法內部String不會改變其值,StringBuffer和StringBuilder 會改變其值
String 是一種特殊的 參考型別, StringBuffer 和 StringBuilder 相當于還是一種 參考型別的對字串操作的一種類!
JDK8 之前的日期時間 API
世界時間:
時間是一個非常抽象的概念,多少年來,吸引著無數科學家、物理學家、甚至哲學家花費畢生精力去解釋時間的本質是什么
- 這里我們不探討高深莫測的學術知識,只把目光放聚焦在計算機這個很小的范疇內,
- 具體可以了解這里(大佬~)
計算世界時間的主要標準:
UTC Coordinated Universal Time
- 世界標準時間:
- 協調世界時是以原子時秒長為基礎,國際原子時的準確度為每日數納秒,原子鐘
現在我們使用的互聯網就采用該計時標準 - 經嚴謹計算得到的時間,精確到秒,誤差在0.9s以內, 是比GMT更為精確的世界時間
GMT Greenwich Mean Time
- 格林威治時間
- 英國倫敦格林威治定為0°經線開始的地方,地球每15°經度 被分為一個時區,共分為24個時區,相鄰時區相差一小時
中國北京位于東八區,GMT時間比北京時間慢8小時 - 格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時(也就是在格林尼治上空最高點時, 時間
CST Central Standard Time
- 中亞時間
中國: 北京時間~ - 四個不同時區的縮寫:
Central Standard Time (USA) UTC-6:00 美國標準時間
Central Standard Time (Australia) UTC+9:30 澳大利亞標準時間
China Standard Time UTC+8:00 中國標準時間
Cuba Standard Time UTC-4:00 古巴標準時間
在Java8之前時間API:

-
java.util.Date:表示Java中的日期,但是能夠操作到時間級別,
如今這個類中的很多方法都已經被廢棄,不建議使用;
Date主要負責存盤一個絕對時間并對兩邊提供操作介面 -
java.sql.Date:表示資料庫時間,只能操作到日期,不能讀取和修改時間;
-
java.sql.Time:表示資料庫時間;
-
java.sql.Timestamp:時間戳;
-
Calendar:工具類,提供時間的加減等復雜操作,支持時區;
Calendar負責對Date中特定資訊,比如這個時間是該年的第幾個星期
此外,還可以通過set,add,roll介面來進行日期時間的增減 -
TimeZone:表示時區;
-
SimpleDateFormat:日期格式化類,非常常用
SimpleDateFormat主要作為一些格式化的輸入輸出
Date java.util包
構造器:
java.util 包提供了 Date 類來封裝當前的日期和時間 Date 類提供兩個建構式來實體化 Date 物件
第一個建構式使用當前日期和時間來初始化物件
new Date();
第二個建構式接收一個引數,該引數是從1970年1月1日起的毫秒數,
new Date(long l);
第三個還有很多構造器被 @Deprecated 被Java過時注解標記為,以過期了... "并不是不能使用,而是不建議使用...已經過期了."
@Deprecated
public Date(int year, int month, int date){ ... } "該構造器輸入的 年月日 創建日期物件, year month 并不準確存在偏移量!"
應該是這個被淘汰了吧, JDK8出現LocalDate "和他功能類似!"
...
常用方法:
long getTime( ) 回傳自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 物件表示的毫秒數,
String toString( ) 把此 Date 物件轉換為以下形式的 String
dow mon dd hh:mm:ss zzz yyyy 其中:dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)
boolean after(Date date) 若當呼叫此方法的Date物件在指定日期之后回傳true,否則回傳false
boolean before(Date date) 若當呼叫此方法的Date物件在指定日期之前回傳true,否則回傳false
int compareTo(Date date) 比較當呼叫此方法的Date物件和指定日期,兩者相等時候回傳0,
呼叫物件在指定日期之前則回傳負數
呼叫物件在指定日期之后則回傳正數
boolean equals(Object date) Date 重寫的Object類的方法! 使其比較的不在是地址!
Demo:
package com.wsm.date;
import java.util.Date;
/**
* Java.util.Date 時間類的使用:
*/
public class DateDemo {
public static void main(String[] args) {
//Java.util 包提供了 Date類來封裝當前的日期和時間
//Date類提供兩個建構式來實體化 Date 物件
//new Date(); 構造器;
Date d1 = new Date(); //默認獲取當前日期;
System.out.println("new Date():\t"+d1); //Date類默認重寫的 toString(); 不直接列印地址!但,因為Java是老外開發的,日期格式并不符號中國~
//new Date(Long l); 構造器;
long l = System.currentTimeMillis(); //獲取當前日期時間戳..毫秒數~
Date d2 = new Date(l); //根據: 給定的時間戳,獲取指定日期...
System.out.println("new Date(Long):\t"+d2);
//還有很多其它的構造器,但是都過期了..
//Java注解: @Deprecated 注釋的方法類,表示JDK以過期不在維護的類,但并不影響使用...!
/**
* Date常用方法:
*/
System.out.println("getTime():\t"+d1.getTime()); //getTime(): 回傳自1970 年 1 月 1 日 00:00:00 GMT 以來此Date物件,表示的毫秒數;
System.out.println("toString():\t"+d1.toString()); //toString(): 把此 Date 物件轉換為以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 格式;
// dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)
// zzz是時間標準,
/** 其它很多方法都過時了 */
}
}
Java.sql.Date
實體化 和 sql.Date 和 util.Date 相互轉換;
package com.wsm.date;
import java.util.Date;
/**
* java.sql.Date對應著資料庫中的日期型別的變數
* java.sql.Date extends java.util.Date 繼承Util.Date
*/
public class SqlDateDemo {
public static void main(String[] args) {
//創建java.sql.Date物件:
//對應資料中的日期變數!`雖然如此但是好像還是很少使用,一般也直接使用 util.Date`
java.sql.Date date = new java.sql.Date(35235325345L); //它只包含日期而沒有時間部分,輸出時候只顯示年月日!
System.out.println(date); //1971-02-13
/** 如何將java.util.Date物件轉換為java.sql.Date物件 */
//情況一:
//sql.Date 本質上繼承了 util.Date
Date date1 = new java.sql.Date(2343243242323L); //子類賦值父類
java.sql.Date dateS = (java.sql.Date) date1; //然后在強轉回, 因為date1 本來就是 sql.Date型別 可以強轉回 sql.Date;
System.out.println(dateS);
/** 運行報錯! 父類前置轉換成子類... */
//情況二:
// java.sql.Date date2 = (java.sql.Date)new Date(); //父類直接強轉子類,編譯不報錯運行報錯
//因為:
// 子類直接向上轉換成父類, 并可以強轉回子類:
// 子類本身繼承父類擁有父類的屬性方法,本身屬于 父類/子類可以來回轉換!
// 但:
// 子類繼承父類,可以宣告自己特有的方法屬性... 父類直接轉換子類,可能回不存在特有的屬性方法(); 故程式報錯!
/** java.util.Date物件轉換為java.sql.Date物件 */
//情況三:
// util.Date 存在一個方法 getTime(); 回傳,當前物件時間戳,
//而: sql.Date 剛好建構式, 可以通過..時間戳宣告!
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);
}
}
總結:
sql.Date 本身繼承于 util.Date: 擁有 util.Date 的屬性方法…
- sql.Date 是為了,和資料庫的日期型別進行匹配賦值使用,
但實際開發中更多還是util.Date - sql.Date 格式只能是:年月日
- util.Date 格式可以是:年月日時分秒…
Java.text.SimpleDateFormat
Date類的API不易于國際化,大部分被廢棄了
- SimpleDateFormat 是對日期類Date的格式化 和 決議;
Date型別的toString 輸出的是英文格式的時間,而不同國家有自己的日期格式… - SimpleDateFormat 就可以以特定的規則進行日期的 格式化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 {
//實體化SimpleDateFormat:使用默認的構造器
SimpleDateFormat sdf = new SimpleDateFormat(); /** 默認的決議規則就是:(兩位)年 月 日 ... */
//格式化:日期 --->字串
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);
/** 使用最多... */
//*************按照指定的方式格式化和決議:呼叫帶參的構造器*****************
// 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識別的格式(通過構造器引數體現),
//否則,拋例外~
Date date2 = sdf1.parse("2020-02-18 11:48:27");
System.out.println(date2);
}
}
日期和時間的格式化編碼
| 字母 | 描述 | 示例 |
|---|---|---|
| G | 紀元標記 | AD |
| y | 四位年份 | 2001 |
| M | 月份 | July or 07 |
| d | 一個月的日期 | 10 |
| h | A.M./P.M. (1~12)格式小時 | 12 |
| H | 一天中的小時 (0~23) | 22 |
| m | 分鐘數 | 30 |
| s | 秒數 | 55 |
| S | 毫秒數 | 234 |
| E | 星期幾 | Tuesday |
| D | 一年中的日子 | 360 |
| F | 一個月中第幾周的周幾 | 2 (second Wed. in July) |
| w | 一年中第幾周 | 40 |
| W | 一個月中第幾周 | 1 |
| a | A.M./P.M. 標記 | PM |
| k | 一天中的小時(1~24) | 24 |
| K | A.M./P.M. (0~11)格式小時 | 10 |
| z | 時區 | Eastern Standard Time |
| ’ | 文字定界符 | Delimiter |
| " | 單引號 | ` |
java.util.Calendar 日歷類
Calendar是一個抽象類,主用用于完成日期欄位之間相互操作的功能
- Calendar實體的方法
1.使用Calendar.getInstance()方法
2.呼叫它的子類GregorianCalendar的構造器 - 一個Calendar的實體是系統時間的抽象表示,通過get(int field)方法來取得想要的時間資訊
常量: 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)
注意:
- 獲取月份時:一月是0,二月是1,以此類推,12月是11
獲取星期時:周日是1,周二是2 , ,,,,周六是7
CalendarDemo.Java
import java.util.Calendar;
import java.util.Date;
/** 日歷類物件Calendar 使用; */
public class CalendarDemo {
public static void main(String[] args) {
//1.實體化
//方式一:創建其子類(GregorianCalendar)的物件
// Calendar gregoriancalendar = new GregorianCalendar();
//方式二:呼叫其靜態方法getInstance()
Calendar calendar = Calendar.getInstance(); //獲取當前日期的: Calendar日歷物件!
// System.out.println(calendar.getClass());
//2.常用方法
//get():
// 根據常量引數,獲取對應的日期值~
int days = calendar.get(Calendar.DAY_OF_MONTH); //獲取當月的第幾天~
System.out.println("當月的第"+days+"天"); //列印!
System.out.println("當年的第"+calendar.get(Calendar.DAY_OF_YEAR)+"天"); //獲取當年的第幾天~
//set()
//calendar可變性
// 給當前日歷物件 進行年月賦值 回傳值void: 直接回傳給當前物件賦值~
calendar.set(Calendar.DAY_OF_MONTH,22); //給當前日歷物件設定為: 當月第22天
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("修改日歷為當月,第"+days+"天"); //列印: 22
//add(): 給當前日歷物件進行 + - 操作
calendar.add(Calendar.DAY_OF_MONTH,-3);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); //列印: 22-3
//getTime():日歷類---> Date
// 根據當前日歷物件的時間,回傳一個Date型別資料~
Date date = calendar.getTime();
System.out.println(date);
//setTime():Date ---> 日歷類
// 將一個Date型別資料,轉換為: 日歷物件!
Date date1 = new Date();
calendar.setTime(date1);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
}
}
JDK8 新增的日期時間 API
前言:
Java8 之前的日期,Date JDK1.0 時引入 基本可以滿足基本的需求,
但,我們希望時間可以與晝夜 季節 四季有關,JDK1.1 引入了 Calendar類
-
而Calendar類并不比Date類好多少,它們面臨的問題
-
可變性:
calendar.set(Calendar.DAY_OF_MONTH,22); //給當前日歷物件設定為: 當月第22天 Calendar類的: Set(); 方法,賦值會直接改變當前的類物件,這在Java 被成為 "可變性" -
偏移性:
JDK8 之前時間的類Date 類其實是存在一個構造器: "可以直接年月榷訓傳 Date物件..." 但 Date中的年份是從1900開始的,而月份都從0開始, "直接賦值年月日,實際上回傳的日期并不準確,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); //創建一個2020 9月9日的日期物件; System.out.println("Date類存在偏移量:"); System.out.println("未設定偏移量輸出:"+sdf.format(d1)); //設定便宜量: //Date 正因為存在偏移量,而被淘汰! 而年便宜了 1900年 月默認從0開始~所以 2020 09 09 應該這個樣寫! Date d2 = new Date(2000-1900, 9-1, 9); System.out.println("設定偏移量輸出: "+sdf.format(d2)); //正常輸出 20200909 } //控制臺輸出: Date類存在偏移量: 未設定偏移量輸出:3900-10-09 設定偏移量輸出: 2000-09-09 -
格式化:
格式化只對Date有用,Calendar則不行, 此外,它們也不是執行緒安全的;不能處理閏秒等,
Java8 新增API
對日期和時間的操作一直是Java程式員最痛苦的地方之一
因此:
-
Java8 之前出現了,
Joda-Time.Jar包周大-泰~ 來更方便的操作,日期API -
而后,JDK8之后,為了方便用戶操作,直接集成了該Jar包的功能!
不在需要用戶,每次都要引入Joda-Time.Jar依賴~
當然如果,你現在公司是Java7 你還想用這些時間ApI 還需要引入Joda-Time.Jar包 -
本地日期(LocalDate)
本地時間 (LocalTime)
本地日期時間(LocalDateTime)
時區(ZonedDateTime)
… -
為了方便操作,
古老的Data類 Java8之后,也新增了toInstant() 方法;
用于將,Date 轉換成新的表示形式,這些新增的本地化時間日期 API 大大簡化了日期時間和本地化的管理,
LocalDate / Time / DateTime
LocalDate、LocalTime、LocalDateTime
- LocalDate、LocalTime、LocalDateTime 類是其中較重要的幾個類
它們的實體 是不可變的物件 - 分別表示使用 ISO-8601日歷系統的日期、時間、日期和時間
它們提供了簡單的本地日期或時間,并不包含當前的時間資訊,也不包含與時區相關的資訊 - LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存盤 生日、紀念日等日期
- LocalTime表示一個時間,而不是日期
- LocalDateTime是用來表示日期和時間的,這是一個最常用的類之一
ISO
ISO 國際標準化組織(International Organization for Standardization

常用方法
| 方法 | 描述 |
|---|---|
| now() now(ZoneId zone) | 靜態方法,根據當前時間創建物件/指定時區的物件 |
| of() | 靜態方法,根據指定日期/時間創建物件 |
| getDayOfMonth() getDayOfYear() | 獲得月份天數(1-31) /獲得年份天數(1-366) |
| getMonthValue() getYear() | 獲得月份(1-12) /獲得年份 |
| getHour() getMinute() getSecond() | 獲得當前物件對應的小時、分鐘、秒 |
| withDayOfMonth() withDayOfYear() withMonth() withYear() | 將月份天數、年份天數、月份、年份修改為指定的值并回傳新的物件 |
| plusDays() plusWeeks() plusMonths() plusYears() plusHours() | 向當前物件添加幾天、幾周、幾個月、幾年、幾小時 |
| minusMonths() minusWeeks() minusDays() minusYears() minusHours() | 從當前物件減去幾月、幾周、幾天、幾年、幾小時 |
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 時分秒~
* LocalDateTime 年月日時分秒~
* 三者,方法類似,都是JDK8 之后新增的日期類,分別用于表示不同的時間 日期 時間日期 描述的Java物件!
*/
public class LocalDateTimeDemo {
/** LocalDate LocalTime LocalDateTime 使用/常用方法();
* LocalDateTime相較于LocalDate、LocalTime,使用頻率要高
* 類似于Calendar
* */
public static void main(String[] args) {
//now():獲取當前的日期、時間、日期+時間
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);
/** 三個類重寫了toString(); 直接輸入的就是中國的日期格式~ */
//of():設定指定的年、月、日、時、分、秒,沒有偏移量
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 13, 23, 43);
System.out.println(localDateTime1);
//getXxx():獲取相關的屬性
System.out.println(localDateTime.getDayOfMonth()); //獲取當前日是這個月的第幾天
System.out.println(localDateTime.getDayOfWeek()); //獲取當前時間是一周中的哪一天
System.out.println(localDateTime.getMonth()); //獲取當前月份
System.out.println(localDateTime.getMonthValue()); //獲取月份資訊
System.out.println(localDateTime.getMinute()); //獲取分鐘
/** 三個類均可呼叫類似的方法~ 注意要存在符合的條件~ */
/** 體現不可變性 */
//withXxx():設定相關的屬性
// LocalDate 物件通過withxx(); 給日期物件設定日期屬性,但是,并不會改變當前物件,而是會回傳一個物件,是更高后的日期~ 本類并不會收受到影響~
LocalDate localDate1 = localDate.withDayOfMonth(22);
System.out.println("更新前物件:"+localDate);
System.out.println("更新后物件:"+localDate1);
//plusxxx(); 向當前物件添加幾天、幾周、幾個月、幾年、幾小時
LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
System.out.println(localDateTime);
System.out.println(localDateTime3);
//minusxxx(); 向當前物件添加幾天、幾周、幾個月、幾年、幾小時
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); //創建一個2020 9月9日的日期物件;
System.out.println("Date類存在偏移量:");
System.out.println("未設定偏移量輸出:"+sdf.format(d1));
//設定便宜量:
//Date 正因為存在偏移量,而被淘汰! 而年便宜了 1900年 月默認從0開始~所以 2020 09 09 應該這個樣寫!
Date d2 = new Date(2000-1900, 9-1, 9);
System.out.println("設定偏移量輸出: "+sdf.format(d2)); //正常輸出 20200909
}
}
Instant
Instant
- 時間線上的一個瞬時點, 這可能被用來記錄應用程式中的事件時間戳
常用方法
| 方法 | 描述 |
|---|---|
| now() | 靜態方法,回傳默認UTC時區的Instant類的物件 UTC即本初子午線的時間... 與北京時間, 存在偏差~ |
| ofEpochMilli(long epochMilli) | 靜態方法,回傳在1970-01-01 00:00:00基礎上加上指定毫秒 數之后的Instant類的物件 |
| atOffset(ZoneOffset offset) | 結合即時的偏移來創建一個 可以通過它來, 向東偏移8 表示東八區北京時間! |
| OffsetDateTime toEpochMilli() | 回傳1970-01-01 00:00:00到當前時間的毫秒數,即為時間戳 |
Demo
InsantDemo.Java
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
/***
* Instant 類的Demo學習
*
*/
public class InsantDemo {
public static void main(String[] args) {
//now():獲取本初子午線對應的標準時間
Instant instant = Instant.now();
System.out.println(instant);//2019-02-18T07:29:41.719Z //
//北京世界東八區! 1949年起的逾半世紀,在中國大陸、臺灣、香港、澳門所使用的標準時間皆為東八區(UTC+8)時間
//中國,占五個時區.分別是東5區 東6區 東7區 東8區 東9區 據北京較遠的地區也有不使用北京時間的 比如烏魯木齊時間就是東九區時間,比北京時間早一個小時 世界分24個時區
//添加時間的偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2019-02-18T15:32:50.611+08:00
//toEpochMilli(): 獲取自1970年1月1日0時0分0秒(UTC)開始的毫秒數 ---> Date類的getTime()
long milli = instant.toEpochMilli();
System.out.println(milli);
//ofEpochMilli():通過給定的毫秒數,獲取Instant實體 -->Date(long millis)
Instant instant1 = Instant.ofEpochMilli(1550475314878L);
System.out.println(instant1);
}
}
DateTimeFormatter
DateTimeFormatter
該類提供了三種格式化方法:
- 預定義的標準格式
就是默認的日期格式化~ 不需要任何指定~ - 本地化相關的格式
提供了幾種定義好的列舉,格式化型別~年月日時分秒yyyy-MM-DD HH:mm:ss - 自定義的格式
通過:ofPattern(yyyymm); 來指定日期的格式~
常用方法:
| 方法 | 描述 |
|---|---|
| ofPattern(String pattern) | 靜態方法 , 返 回一個指定字 符串格式 |
| DateTimeFormatter format(TemporalAccessor t) | 格式化一個日期、時間,回傳字串 |
| parse(CharSequence text) | 將指定格式的字符序列決議為一個日期、時間 |
- 格式化:
將日期(物件) 轉換為字串~ - 決議:
將字串日期轉換為~ 日期物件轉換的字符 和 日期物件的格式要一致, 不然轉換失敗!
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) {
// 方式一:預定義的標準格式,如:ISO_LOCAL_DATE_TIME; ISO_LOCAL_DATE; ISO_LOCAL_TIME 分布對應三個物件!
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);
// 方式二:
// 本地化相關的格式,如: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時47分16秒
// 本地化相關的格式,如: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
// 重點: 方式三:自定義的格式,如: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);
}
}
總結:
Java8 新增了很多的日期API 其實常用的也就以上…
- Java8之前的其實還有很多人使用,
JDK是向下兼容的,所以不必擔心 - 但,8聽說效率還挺高,而且確實挺方便的…
JDK8其它API

System Java系統類:
java.lang 包下的一個 系統類,可以通過該類獲取的當前計算機的:屬性~
- 該類的構造器是private的 所以無法創建該類的物件,也就是無法實體化該類.
其內部的成員變數和成員方法都是static的,所以也可以很方便的進行呼叫
成員變數
- System類內部包含in、out和err三個成員變數
分別代表標準輸入流 (鍵盤輸入)
標準輸出流(顯示幕)
標準錯誤輸出流(顯示幕)
成員方法
| 方法 | 描述 |
|---|---|
| native long currentTimeMillis() | 回傳當前的計算機時間,時間格式,當前計算機時間和 格林威治時間所差的毫秒數 |
| void exit(int status) | 作用是退出程式,其中status的值為0代表正常退出,非零代表例外退出 在圖形界面編程中實作程式的退出功能等 |
| void gc() | 作用是請求系統進行垃圾回收,至于系統是否立刻回收,則取決于系統中垃圾回收演算法的實作以及系統執行時的情況, |
| String getProperty(String key) | 該方法的作用是獲得系統中屬性名為key的屬性對應的值: 如下👇 |
Sacnner 掃描器:
java.util.Scanner 是 Java5 的新特征,我們可以通過 Scanner 類來獲取用戶的控制臺輸入
需要搭配 System.in 的輸入流~ Scanner s = new Scanner(System.in);
常用方法:
| 方法 | 描述 |
|---|---|
hasNext() 與 hasNextLine() | 判斷是否還有輸入的資料 建議Next之前判斷一下... 這些方法執行時都會造成堵塞,等待用戶在命令列輸入資料回車確認 |
next() 與 nextLine() | 方法獲取輸入的字串 nextLine() 會輸出一行資訊…👇 |
如果要輸入 int 或 float 型別的資料,在 Scanner 類中也有支持
next.Byte() nextDouble() nextFloat,nextInt() nextLin() nextLong() nextShot()
但是在輸入之前最好先使用 hasNextXxx() 方法進行驗證,再使用 nextXxx() 來讀取,不然輸入int 的輸入了一個 String會報錯~
/** 成員屬性: in out err */
//in: 配合Scanner 掃描器,可以實作控制臺的輸入流...
//out: 這個,最常用: System.out.print(); 回傳一個輸出流,輸出資訊
//err: 和out 類似,但是它輸出的資訊一般表示錯誤,比較顯眼的 紅色資訊!
//創建一個掃描儀
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入一段話s1:");
String s1 = scanner.next();
System.out.println("請輸入一段話s2:");
String s2 = scanner.next();
System.err.println("s1:"+s1);
System.err.println("s2:"+s2);
//注意: 不要同時兩個
// scanner.nextxxx() 寫在一起,這些方法執行時都會造成堵塞,等待用戶在命令列輸入資料回車確認.
// 寫在一起,輸入了一個回車,則所有的 nextxxx() 都結束了!
scanner.close(); /** 要注意關閉流o 不然占用程式資源... */
SystemDemo
SysDemo.Java
import java.util.Scanner;
/**
* System 系統類的學習...
*/
public class SysDemo {
//main 主方法...
public static void main(String[] args) {
/** 成員屬性: in out err */
//in: 配合Scanner 掃描器,可以實作控制臺的輸入流...
//out: 這個,最常用: System.out.print(); 回傳一個輸出流,輸出資訊
//err: 和out 類似,但是它輸出的資訊一般表示錯誤,比較顯眼的 紅色資訊!
//創建一個掃描儀
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入一段話s1:");
String s1 = scanner.next();
System.out.println("請輸入一段話s2:");
String s2 = scanner.next();
System.err.println("s1:"+s1);
System.err.println("s2:"+s2);
//注意: 不要同時兩個
// scanner.nextxxx() 寫在一起,這些方法執行時都會造成堵塞,等待用戶在命令列輸入資料回車確認.
// 寫在一起,輸入了一個回車,則所有的 nextxxx() 都結束了!
scanner.close(); /** 要注意關閉流o 不然占用程式資源... */
/** currentTimeMillis */
long timeStamp = System.currentTimeMillis(); //回傳當前時間,時間戳;
//時間戳: 值當前日期距離,格林威治時間(GMT)1970-01-01 的毫秒數~
//使用:
// 通常可以,用于生產一個時間戳, 時間唯一的一個ID, 用作在資料庫/檔案名...表示資料唯一~
System.out.println(timeStamp);
/** getProperty(): 獲取系統的引數資訊!*/
String javaVersion = System.getProperty("java.version");
System.out.println("java的環境版本:" + javaVersion);
String javaHome = System.getProperty("java.home");
System.out.println("java的安裝路徑:" + javaHome);
String osName = System.getProperty("os.name");
System.out.println("作業系統的名稱:" + osName);
String osVersion = System.getProperty("os.version");
System.out.println("作業系統的版本:" + osVersion);
String userName = System.getProperty("user.name");
System.out.println("計算機用戶賬戶名:" + userName);
String userHome = System.getProperty("user.home");
System.out.println("用戶的主目錄:" + userHome);
String userDir = System.getProperty("user.dir");
System.out.println("用戶當前作業目錄:" + userDir);
}
}

Math Java數學類:
Java 的 Math 包含了用于執行基本數學運算的屬性和方法,如初等指數、對數、平方根和三角函式
Math 的方法都被定義為 static 形式,通過 Math 類可以在主函式中直接呼叫 不用new 可以直接呼叫!
常用方法:
| 方法 | 描述 |
|---|---|
| 算術計算 | |
| Math.sqrt() | 計算平方根 |
| Math.cbrt() | 計算立方根 |
| Math.pow(a, b) | 計算a的b次方 |
| Math.max( , ) | 計算最大值 |
| Math.min( , ) | 計算最小值 |
| Math.abs() | 取絕對值 就是正數!1 -1 絕對值都是 1 |
| 進位 | |
| Math.ceil() | 逢余進一 有小數就+1 |
| Math.floor() | 逢余舍一 舍去小數! |
| Math.rint() | 四舍五入,回傳double值,注意.5的時候會取偶數 |
| Math.round() | 四舍五入,float時回傳int值,double時回傳long值 |
| 亂數 | |
| Math.random() | 取得一個 [0~1] 范圍內的亂數 通常可以用該 方法+演算法 獲取:1-10 1-100.. 亂數! |
| 更多待擴展… |
MathDemo
MathDemo.Java
public static void main(String[] args) {
/** 算術計算 */
System.out.println("--------算術計算-----------");
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求絕對值: 就是把一個數變成 + 正數!
*/
System.out.println(Math.abs(-10.4)); // 10.4
System.out.println(Math.abs(10.1)); // 10.1
/** 進位 */
System.out.println("--------進位-----------");
/**
* ceil天花板的意思,就是逢余進一
* 正數+1
* 小數+1, 小數+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的時候會取偶數 例外的尷尬=,=
*/
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時回傳int值,double時回傳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以內的亂數!
@Test
/** 獲取100以內的亂數! */
public void randomHundred(){
// Math.random() 獲取0-1 的亂數! 包含0!
System.out.println("隨機0-1");
System.out.println(Math.random());
System.out.println("隨機0-100");
System.out.println((int)(Math.random()*100)+1);
/**
* (int)(Math.random()*100)+1
* 因為: Math.random() 獲取0-1 的亂數! 包含0!
* *100 獲取亂數進兩位小數,強制轉換(int) 會截取小數點..
* 因為包含0 所以+1 就不會出現呢0 的情況了!!!
*/
}
BigInteger 與 BigDecimal 類:
BigInteger
Java.math包
Interger類作為int的包裝類,能存盤的最大整型值為2^{31-1}
Long類也是有限的, 最大為2^{63-1}
- 如果要表示再大的整數,不管是基本資料型別還是他們的包裝類都無能為力,更不用說進行運算了
- BigInteger 提供所有 Java 的基本整數運算子的對應物
并提供 Java.lang.Math 的所有相關方法 - BigInteger 還提供以下運算:
模算術、GCD 計算、質數測驗、素數生成、 位操作以及一些其他操作
構造器
- BigInteger(String val):根據字串構建BigInteger物件
常用方法:
BigInteger abs() 回傳大整數的絕對值
BigInteger add(BigInteger val) 回傳兩個大整數的和
BigInteger and(BigInteger val) 回傳兩個大整數的按位與的結果
BigInteger andNot(BigInteger val) 回傳兩個大整數與非的結果
BigInteger divide(BigInteger val) 回傳兩個大整數的商
double doubleValue() 回傳大整數的double型別的值
float floatValue() 回傳大整數的float型別的值
BigInteger gcd(BigInteger val) 回傳大整數的最大公約數
int intValue() 回傳大整數的整型值
long longValue() 回傳大整數的long型值
BigInteger max(BigInteger val) 回傳兩個大整數的最大者
BigInteger min(BigInteger val) 回傳兩個大整數的最小者
BigInteger mod(BigInteger val) 用當前大整數對val求模
BigInteger multiply(BigInteger val) 回傳兩個大整數的積
BigInteger negate() 回傳當前大整數的相反數
BigInteger not() 回傳當前大整數的非
BigInteger or(BigInteger val) 回傳兩個大整數的按位或
BigInteger pow(int exponent) 回傳當前大整數的exponent次方
BigInteger remainder(BigInteger val)回傳當前大整數除以val的余數
BigInteger leftShift(int n) 將當前大整數左移n位后回傳
BigInteger rightShift(int n) 將當前大整數右移n位后回傳
BigInteger subtract(BigInteger val) 回傳兩個大整數相減的結果
byte[] toByteArray(BigInteger val) 將大整數轉換成二進制反碼保存在byte陣列中
String toString() 將當前大整數轉換成十進制的字串形式
BigInteger xor(BigInteger val) 回傳兩個大整數的異或
BigDecimal
Decimal:[中:小數]
一般的Float類和Double類可以用來做科學計算或工程計算
但在商業計算中, 要求數字精度比較高,故用到 Java.math.BigDecimal類
BigDecimal類支持不可變的、任意精度的有符號十進制定點數
構造器
- public BigDecimal(double val)
- public BigDecimal(String val)
常用方法
add(BigDecimal) BigDecimal物件中的值相加,然后回傳這個物件,
subtract(BigDecimal) BigDecimal物件中的值相減,然后回傳這個物件,
multiply(BigDecimal) BigDecimal物件中的值相乘,然后回傳這個物件,
divide(BigDecimal) BigDecimal物件中的值相除,然后回傳這個物件,
toString() 將BigDecimal物件的數值轉換成字串,
doubleValue() 將BigDecimal物件中的值以雙精度數回傳,
floatValue() 將BigDecimal物件中的值以單精度數回傳,
longValue() 將BigDecimal物件中的值以長整數回傳,
intValue() 將BigDecimal物件中的值以整數回傳
Java的 flot double 計算有問題:
查看下面的代碼:
@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);
}

因為不論是float 還是double都是浮點數,而計算機是二進制的,浮點數會失去一定的精確度
- 根本原因是:十進制值通常沒有完全相同的二進制表示形式
- 十進制數的二進制表示形式可能不精確,只能無限接近于那個值
但:
- 在專案中,我們不可能讓這種情況出現,特別是金融專案
- 如果你的支付寶賬戶余額顯示193.99999999999998,那是一種怎么樣的體驗?
😁
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/303301.html
標籤:java
