Java 常用類庫及String類詳解
技術標籤:Java核心類庫Java字串javaintellij idea
Java常用類庫不要求有很多思想上的東西,要求對其有很熟練的使用能力。常用類庫就好比在生活中手藝人手中的工具,作為一個Java程式設計師我們也必須熟練掌握這些工具。
導航
- 一、java.util.Objects
- 二、java.lang.Math
- 三、java.util.Arrays
- 四、java.math.BigDecimal
- 五、java.util.Date
- 六、java.text.DateFormat
- 七、java.util.Calendar
- 八、java.lang.System
- 九、java.lang.String(絕對重點)
一、java.util.Objects
在JDK7
版本新增的一個工具類。Objects此類包含static
實用程式方法,用於操作物件或在操作前檢查某些條件。 這些實用程式包括null
或null
方法,用於計算物件的雜湊程式碼,返回物件的字串,比較兩個物件,以及檢查索引或子範圍值是否超出範圍。
常用的方法:
變數和型別 | 方法 | 描述 |
---|---|---|
static int | checkIndex(int index, int length) | 檢查 index是否在 0 (含)到 length (不包括)範圍內。 |
static <T> int | compare(T a, T b, Comparator<? super T> c) | 如果引數相同則返回0,否則返回 c.compare(a, b) 。 |
static boolean | equals(Object a, Object b) | 返回 true如果引數相等,彼此 false其他。 |
static int | hash(Object… values) | 為一系列輸入值生成雜湊碼。 |
static int | hashCode(Object o) | 返回非的雜湊碼 null引數,0為 null的論點。 |
static boolean | isNull(Object obj) | 返回 true如果提供的參考是 null ,否則返回 false 。 |
static boolean | nonNull(Object obj) | 返回 true如果提供的參考是非 null否則返回 false 。 |
static <T> T | requireNonNull(T obj) | 檢查指定的物件引用是否不是 null 。 |
static <T> T | requireNonNull(T obj, String message) | 檢查指定的物件引用是否為null ,如果是,則丟擲自定義的NullPointerException 。 |
static String | toString(Object o) | 返回呼叫的結果 toString對於非 null引數, "null"為 null的說法。 |
static String | toString(Object o, String nullDefault) | 如果第一個引數不是 null ,則返回在第一個引數上呼叫 toString的結果,否則返回第二個引數。 |
/**
* Objects工具類
*/
public class Demo1Objects {
public static void main(String[] args) {
Person p1 = null;
Person p2 = new Person();
// 發生空指標異常,null不能呼叫方法
//Syem.out.println(p1.equals(p2));
// 使用Objects工具類不會發生異常
System.out.println(Objects.equals(p1, p2));
// 判斷引數是否是空,為空返回true
System.out.println(Objects.isNull(p1));
// 判斷引數是否是空,為空則返回空指標異常類
System.out.println(Objects.requireNonNull(p1));
}
}
執行結果:
false
true
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:221)
at Demo1Objects.main(Demo1Objects.java:19)
二、java.lang.Math
類Math包含用於執行基本數字運算的方法,例如基本指數,對數,平方根和三角函式。
常用的方法:
變數和型別 | 方法 | 描述 |
---|---|---|
static double | abs(double a) | 返回 double值的絕對值。 |
static float | abs(float a) | 返回 float值的絕對值。 |
static int | abs(int a) | 返回 int值的絕對值。 |
static long | abs(long a) | 返回 long值的絕對值。 |
static int | addExact(int x, int y) | 返回其引數的總和,如果結果溢位 int則丟擲異常。 |
static double | ceil(double a) | 返回大於或等於引數且等於數學整數的最小值(最接近負無窮大) double 。 |
static double | floor(double a) | 返回小於或等於引數且等於數學整數的最大值(最接近正無窮大) double 。 |
static double | max(double a, double b) | 返回兩個 double值中較大的 double 。 |
static float | max(float a, float b) | 返回兩個 float值中較大的 float 。 |
static int | max(int a, int b) | 返回兩個 int值中較大的 int。 |
static long | max(long a, long b) | 返回兩個 long值中較大的 long 。 |
static double | min(double a, double b) | 返回兩個 double值中較小的 double 。 |
static float | min(float a, float b) | 返回兩個 float值中較小的 float 。 |
static int | min(int a, int b) | 返回兩個 int值中較小的 int。 |
static long | min(long a, long b) | 返回兩個 long 值中較小的 long。 |
static double | random() | 返回帶有正號的 double值,大於或等於 0.0且小於 1.0 。 |
static long | round(double a) | 返回與引數最接近的 long ,並將關係四捨五入為正無窮大。 |
static int | round(float a) | 返回與引數最接近的 int ,並將關係四捨五入為正無窮大。 |
/**
* Math
*/
public class Demo2Math {
public static void main(String[] args) {
// 求絕對值
System.out.println("-100求絕對值:"+Math.abs(-100));
// 求兩數之間較小的值
System.out.println("100,200求兩數之間較小的值:"+Math.min(100,200));
// 求兩數之間較大的值
System.out.println("100,200求兩數之間較大的值:"+Math.max(100,200));
// 四捨五入
System.out.println("5.5四捨五入正數:"+Math.round(5.5));
System.out.println("-5.5四捨五入負數:"+Math.round(-5.5)); // 四捨五入變成-5
System.out.println("-5.51四捨五入負數:"+Math.round(-5.51)); // 四捨五入變成-6
// 返回小於等於引數的最大整數(地板)
System.out.println("3.5取地板正數:"+Math.floor(3.5));
System.out.println("-3.5取地板負數:"+Math.floor(-3.5));
// 返回大於等於引數的最小整數(天花板)
System.out.println("3.5取天花板正數:"+Math.ceil(3.5));
System.out.println("-3.5取天花板負數:"+Math.ceil(-3.5));
}
執行結果:
-100求絕對值:100
100,200求兩數之間較小的值:100
100,200求兩數之間較大的值:200
5.5四捨五入正數:6
-5.5四捨五入負數:-5
-5.51四捨五入負數:-6
3.5取地板正數:3.0
-3.5取地板負數:-4.0
3.5取天花板正數:4.0
-3.5取天花板負數:-3.0
三、java.util.Arrays
該類包含用於運算元組的各種方法(例如排序和搜尋)。 此類還包含一個靜態工廠,允許將陣列視為列表。
如果指定的陣列引用為null
,則此類中的方法都丟擲NullPointerException
,除非另有說明。
常用的方法:
變數和型別 | 方法 | 描述 |
---|---|---|
static <T> List | asList(T… a) | 返回由指定陣列支援的固定大小的列表。 |
static int | binarySearch(Object[] a, Object key) | 使用二進位制搜尋演算法在指定的陣列中搜索指定的物件。 |
static int | binarySearch(Object[] a, int fromIndex, int toIndex, Object key) | 使用二進位制搜尋演算法搜尋指定物件的指定陣列範圍。 |
static <T> int | binarySearch(T[] a, T key, Comparator<? super T> c) | 使用二進位制搜尋演算法在指定的陣列中搜索指定的物件。 |
static <T> int | binarySearch(T[] a, int fromIndex, int toIndex, T key, Comparator<? super T> c) | 使用二進位制搜尋演算法搜尋指定物件的指定陣列範圍。 |
static <T> T[] | copyOf(T[] original, int newLength) | 使用空值複製指定的陣列,截斷或填充(如有必要),以使副本具有指定的長度。 |
static <T,U>T[] | copyOf(U[] original, int newLength, 類<? extends T[]> newType) | 使用空值複製指定的陣列,截斷或填充(如有必要),以使副本具有指定的長度。 |
static boolean | equals(int[] a, int[] a2) | 如果兩個指定的int陣列彼此 相等 ,則返回 true 。 |
static void | fill(Object[] a, Object val) | 將指定的Object引用分配給指定的Objects陣列的每個元素。 |
static int | hashCode(Object[] a) | 根據指定陣列的內容返回雜湊碼。 |
static int | mismatch(Object[] a, Object[] b) | 查詢並返回兩個 Object陣列之間第一個不匹配的索引,否則如果未找到不匹配則返回-1。 |
static int | mismatch(Object[] a, int aFromIndex, int aToIndex, Object[] b, int bFromIndex, int bToIndex) | 查詢並返回指定範圍內兩個 Object陣列之間第一個不匹配的相對索引,否則如果未找到不匹配則返回-1。 |
static void | sort(Object[] a) | 根據元素的自然排序 ,將指定的物件陣列按升序排序。 |
static void | sort(Object[] a, int fromIndex, int toIndex) | 根據元素的自然排序 ,將指定物件陣列的指定範圍按升序排序。 |
static String | toString(Object[] a) | 返回指定陣列內容的字串表示形式。 |
/**
* Arrays工具類
*/
public class Demo3Arrays {
public static void main(String[] args) {
int[] arr = {8,9,1,3,4,2,5,6,7};
// 列印陣列的記憶體地址
System.out.println("陣列的記憶體地址:"+arr);
// 輸出陣列的內容 [1, 2, 3]
System.out.println("排序前");
System.out.println(Arrays.toString(arr));
// 陣列排序(正序,從小到大)
Arrays.sort(arr);
System.out.println("排序後");
System.out.println(Arrays.toString(arr));
// 二分查詢指定引數的下標(沒有返回-1)
System.out.println("二分查詢指定引數的下標4");
System.out.println(Arrays.binarySearch(arr,4));
// 陣列擴容(輸入陣列,新的長度)
System.out.println("原本的長度");
System.out.println(arr.length); // 原本的長度
arr = Arrays.copyOf(arr, 15);
System.out.println("擴容後的長度");
System.out.println(arr.length); // 擴容後的長度
}
}
執行結果:
陣列的記憶體地址:[I@6cd8737
排序前
[8, 9, 1, 3, 4, 2, 5, 6, 7]
排序後
[1, 2, 3, 4, 5, 6, 7, 8, 9]
二分查詢指定引數的下標4
3
原本的長度
9
擴容後的長度
15
四、java.math.BigDecimal
BigDecimal
類提供算術,比如操作,舍入,比較,雜湊和格式轉換的操作。 該toString()
方法提供的規範表示BigDecimal
。
常用構造方法:
構造器 | 描述 |
---|---|
BigDecimal(String val) | 將 BigDecimal的字串表示 BigDecimal轉換為 BigDecimal 。 |
BigDecimal(String val, MathContext mc) | 將 BigDecimal的字串表示 BigDecimal轉換為 BigDecimal ,接受與 BigDecimal(String)建構函式相同的字串,並根據上下文設定進行舍入。 |
BigDecimal(int val) | 將 int翻譯成 BigDecimal 。 |
BigDecimal(int val, MathContext mc) | 將 int轉換為 BigDecimal ,並根據上下文設定進行舍入。 |
常用的方法:
變數和型別 | 方法 | 描述 |
---|---|---|
BigDecimal | abs() | 返回 BigDecimal其值是此的絕對值 BigDecimal ,其標為 this.scale() 。 |
BigDecimal | add(BigDecimal augend) | 返回 BigDecimal其值為 (this + augend) ,其比例為 max(this.scale(), augend.scale()) 。 |
BigDecimal | divide(BigDecimal divisor) | 返回BigDecimal其值為(this / divisor) ,其首選比例為(this.scale() - divisor.scale()) ; 如果無法表示準確的商(因為它具有非終止的十進位制擴充套件),則丟擲ArithmeticException 。 |
double | doubleValue() | 將 BigDecimal轉換為 double 。 |
int | intValue() | 將 BigDecimal轉換為 int。 |
long | longValue() | 將 BigDecimal轉換為 long。 |
float | float() | 將 BigDecimal轉換為 float。 |
BigDecimal | multiply(BigDecimal multiplicand) | 返回 BigDecimal其值為 (this × multiplicand) ,其比例為 (this.scale() + multiplicand.scale()) 。 |
BigDecimal | subtract(BigDecimal subtrahend) | 返回 BigDecimal其值為 (this - subtrahend) ,其比例為 max(this.scale(), subtrahend.scale()) 。 |
/**
* BigDecimal
*/
public class Demo4BigDecimal {
public static void main(String[] args) {
// double型別和float型別運算會失去精度
System.out.println(0.1+0.2);
BigDecimal b1 = new BigDecimal("0.1"); // 傳入的是String型別
BigDecimal b2 = new BigDecimal("0.2");
// b1,b2本身沒有任何改變,等同於 b1+b2
BigDecimal b3 = b1.add(b2); // 加法運算
System.out.println(b1.subtract(b2)); // 減法運算
System.out.println(b1.multiply(b2)); // 乘法運算
System.out.println(b1.divide(b2)); // 除法運算
double d = b3.doubleValue(); // 變成double型別
int i = b3.intValue(); // 變成int型別
}
}
執行結果:
0.30000000000000004
-0.1
0.02
0.5
五、java.util.Date
Date
類表示特定的時刻,精度為毫秒。 (1秒=1000毫秒)
常用構造方法:
構造器 | 描述 |
---|---|
Date() | 分配 Date物件並對其進行初始化,使其表示分配時間,測量 Date到毫秒。 |
Date(long date) | 分配 Date物件並初始化它以表示自標準基準時間(稱為“紀元”)以來的指定毫秒數,即1970年1月1日00:00:00 GMT。 |
常用的方法:
變數和型別 | 方法 | 描述 |
---|---|---|
boolean | after(Date when) | 測試此日期是否在指定日期之後。 |
boolean | before(Date when) | 測試此日期是否在指定日期之前。 |
Object | clone() | 返回此物件的副本。 |
int | compareTo(Date anotherDate) | 用於兩個相同資料型別的比較,兩個不同型別的資料不能用此方法來比較。 |
boolean | equals(Object obj) | 比較兩個相等的日期。 |
static Date | from(Instant instant) | 從 Instant物件獲得 Date的例項。 |
int | hashCode() | 返回此物件的雜湊碼值。 |
long | getTime() | 返回自此 Date物件表示的1970年1月1日00:00:00 GMT以來的毫秒數。 |
void | setTime(long time) | 將此 Date物件設定為表示格林尼治標準時間1970年1月1日00:00:00之後的 time毫秒的時間點。 |
Instant | toInstant() | 將此 Date物件轉換為 Instant 。 |
String | toString() | 將此 Date物件轉換為以下形式的 String 。 |
/**
* Date類表示特定的時刻,精度為毫秒。
*/
public class Demo5Date {
public static void main(String[] args) {
// 建立一個當前時間的Date
Date date = new Date();
// 列印Date類的toString方法
System.out.println("當前日期:"+date);
// 計算當前日期減一天
long time = date.getTime()-(24*60*60*1000);
Date date2 = new Date(time);
System.out.println("當前日期減一天:"+date2);
}
}
執行結果:
當前日期:Sun Dec 27 15:00:47 CST 2020
當前日期減一天:Sat Dec 26 15:00:47 CST 2020
六、java.text.DateFormat
DateFormat
是日期/時間格式化子類的抽象類,它以與語言無關的方式格式化和分析日期或時間。 日期/時間格式化子類(例如SimpleDateFormat
)允許格式化(即,日期→文字),解析(文字“日期”)和規範化。 日期表示為Date物件或自1970年1月1日00:00:00 GMT以來的毫秒數。
java.text.SimpleDateFormat
DateFormat
是一個抽象類不能直接使用,想要使用需要使用它的子類SimpleDateFormat
。
SimpleDateFormat
是一個用於以區域設定敏感的方式格式化和解析日期的具體類。 它允許格式化(日期→文字),解析(文字→日期)和規範化。
常用構造方法:
構造器 | 描述 |
---|---|
SimpleDateFormat() | 構造一個 SimpleDateFormat使用預設模式和日期格式符號預設 FORMAT區域設定。 |
SimpleDateFormat(String pattern) | 構造一個 SimpleDateFormat使用給定的模式和預設的預設日期格式符號 FORMAT區域設定。 |
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols) | 使用給定的模式和日期格式符號構造 SimpleDateFormat 。 |
SimpleDateFormat(String pattern, Locale locale) | 使用給定模式和給定語言環境的預設日期格式符號構造 SimpleDateFormat 。 |
常用的方法:
變數和型別 | 方法 | 描述 |
---|---|---|
boolean | equals(Object obj) | 比較給定物件與此 SimpleDateFormat是否相等。 |
StringBuffer | format(Date date, StringBuffer toAppendTo, FieldPosition pos) | 將給定的 Date為日期/時間字串,並將結果附加到給定的 StringBuffer 。 |
Date | parse(String text, ParsePosition pos) | 解析字串中的文字以生成 Date 。 |
String | toPattern() | 返回描述此日期格式的模式字串。 |
/**
* DateFormat
*/
public class Demo6DateFormat {
public static void main(String[] args) throws ParseException {
/**
* y:年
* M:月
* d:日
* H:時
* m:分
* s:秒
*/
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// format:將Date物件轉換成字串("yyyy年MM月dd日 HH:mm:ss")
String text = format.format(new Date());
System.out.println(text);
// parse:將("yyyy年MM月dd日 HH:mm:ss")日期字串,轉換為date物件
Date parse = format.parse("2022年11月11日 16:45:36");
// 今天離2022年11月11日還有幾天
System.out.println((parse.getTime()-new Date().getTime())/1000/60/60/24);
}
}
執行結果:
2020年12月27日 16:40:02
684
七、java.util.Calendar
Calendar
類是一個抽象類,可以為在某一特定時刻和一組之間的轉換的方法calendar fields如YEAR
, MONTH
, DAY_OF_MONTH
, HOUR
,等等,以及用於操縱該日曆欄位,如獲取的日期下個星期。 瞬間可以用毫秒值表示,該值是1970年1月1日格林威治標準時間1970年1月1日00:00:00,000(格里高利)的Epoch的偏移量。
Calendar
提供了一個類方法getInstance
,用於獲取此型別的通用物件。 Calendar
的getInstance
方法返回一個Calendar
物件,其日曆欄位已使用當前日期和時間初始化:
Calendar rightNow = Calendar.getInstance();
常用的欄位彙總:
變數和型別 | 欄位 | 描述 |
---|---|---|
static int | AM | AM_PM欄位的值,表示從午夜到正午之前的一天的時段。 |
static int | AM_PM | get和 set欄位編號表示 HOUR是在中午之前還是之後。 |
static int | DATE | get和 set欄位編號表示當月的日期。 |
static int | DAY_OF_MONTH | get和 set欄位編號表示當月的日期。 |
static int | DAY_OF_WEEK | 欄位編號為 get和 set表示星期幾。 |
static int | DAY_OF_WEEK_IN_MONTH | get和 set欄位編號,表示當前月份中某一天的序號。 |
static int | DAY_OF_YEAR | get和 set欄位編號表示當年的日期編號。 |
static int | FRIDAY | DAY_OF_WEEK欄位的值表示星期五。 |
static int | HOUR | get和 set欄位編號表示上午或下午的小時。 |
static int | HOUR_OF_DAY | get和 set欄位編號表示當天的小時。 |
static int | MILLISECOND | get和 set欄位編號表示秒內的毫秒數。 |
static int | MINUTE | get和 set欄位編號表示小時內的分鐘。 |
static int | MONTH | get和 set欄位編號表示月份。 |
protected long | time | 此日曆的當前設定時間,以1970年1月1日格林威治標準時間0:00:00之後的毫秒數表示。 |
static int | WEEK_OF_MONTH | get和 set欄位編號, get set的週數。 |
static int | WEEK_OF_YEAR | get和 set欄位編號表示當前年份的週數。 |
static int | YEAR | 欄位編號為 get和 set表示年份。 |
常用的方法:
變數和型別 | 方法 | 描述 |
---|---|---|
abstract void | add(int field, int amount) | AM_PM欄位的值,表示從午夜到正午之前的一天的時段。 |
boolean | after(Object when) | 返回此 Calendar是否表示指定的 Object表示的時間之後的時間。 |
boolean | before(Object when) | 返回此 Calendar是否表示指定的 Object代表的時間之前的時間。 |
int | get(int field) | 返回給定日曆欄位的值。 |
int | getActualMaximum(int field) | 給定此 Calendar的時間值,返回指定日曆欄位可能具有的 Calendar 。 |
int | getActualMinimum(int field) | 給定此 Calendar的時間值,返回指定日曆欄位可能具有的 Calendar 。 |
int | getFirstDayOfWeek() | 得到一週的第一天是什麼; 例如, SUNDAY在美國, MONDAY在法國。 |
static Calendar | getInstance() | 使用預設時區和區域設定獲取日曆。 |
Date | getTime() | 返回一個 Date物件,表示此 Calendar的時間值(距離 Epoch的毫秒偏移量)。 |
long | getTimeInMillis() | 以毫秒為單位返回此Calendar的時間值。 |
TimeZone | getTimeZone() | 獲取時區。 |
void | set(int field, int value) | 將給定的日曆欄位設定為給定值。 |
void | setTime(Date date) | 使用給定的 Date設定此日曆的時間。 |
String | toString() | 返回此日曆的字串表示形式。 |
/**
* Calendar日曆類
*/
public class Demo7Calendar {
// get
// set
// add
// getTime:獲取日曆時間,表示的Date物件
// getActualMaxmum:獲取某欄位的最大值
public static void main(String[] args) {
// Calender是一個抽象類不能直接new,使用getInstance()會幫你返回一個已經實現好的一個子類物件,基於不同地區所編寫的
Calendar cl = Calendar.getInstance();
// 獲取日曆裡的年份
int year = cl.get(Calendar.YEAR);
System.out.println("日曆裡的年份:"+year);
// 獲取日曆裡的天數
int day = cl.get(Calendar.DAY_OF_YEAR); // 根據年
System.out.println("日曆裡的天數:"+day);
System.out.println("獲取今天是當前月份的第幾天:"+cl.get(Calendar.DAY_OF_MONTH)); // 根據月份
System.out.println("根據星期:"+cl.get(Calendar.DAY_OF_WEEK)); // 根據星期
System.out.println("根據周和月:"+cl.get(Calendar.DAY_OF_WEEK_IN_MONTH)); // 根據周和月
// 設定日曆中的年份為2022年
cl.set(Calendar.YEAR,2022);
System.out.println("日曆中的年份為2022年:"+cl.get(Calendar.YEAR));
// 獲取日曆裡的星期數
System.out.println("根據年獲取日曆裡的星期數:"+cl.get(Calendar.WEEK_OF_YEAR)); // 根據年
// 年份加1,減法就是加負數
cl.add(Calendar.YEAR,1);
System.out.println("年份加1:"+cl.get(Calendar.YEAR));
// 在計算機中月份是 0-11
// 月份減5
cl.add(Calendar.MONTH,-5);
System.out.println("月份減5:"+cl.get(Calendar.MONTH));
// 獲取日曆時間,表示的Date物件
Date time = cl.getTime();
// 獲取當前年的最大月份
int m = cl.getActualMaximum(Calendar.MONTH);
System.out.println("獲取當前年的最大月份:"+m);
// 獲取當前年的最大天數
int d = cl.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println("當前年的最大天數:"+d);
// 獲取指定月份的天數
cl.set(Calendar.MONTH,1);
System.out.println("獲取2月份的天數:"+cl.getActualMaximum(Calendar.DAY_OF_MONTH));
// 獲取一年中有多少周
System.out.println("獲取一年中有多少周:"+cl.getActualMaximum(Calendar.WEEK_OF_YEAR));
}
}
執行結果:
日曆裡的年份:2020
日曆裡的天數:362
獲取今天是當前月份的第幾天:27
根據星期:1
根據周和月:4
日曆中的年份為2022年:2022
根據年獲取日曆裡的星期數:53
年份加1:2023
月份減5:6
獲取當前年的最大月份:11
當前年的最大天數:365
獲取2月份的天數:28
獲取一年中有多少周:52
八、java.lang.System
System
類包含幾個有用的類欄位和方法。 它無法例項化。 System
類提供的設施包括標準輸入,標準輸出和錯誤輸出流; 訪問外部定義的屬性和環境變數; 載入檔案和庫的方法; 以及用於快速複製陣列的一部分的實用方法。
常用的欄位彙總:
System類的欄位是一定要清楚的
變數和型別 | 欄位 | 描述 |
---|---|---|
static PrintStream | err | “標準”錯誤輸出流。 |
static InputStream | in | “標準”輸入流。 |
static PrintStream | out | “標準”輸出流。 |
常用的方法:
變數和型別 | 方法 | 描述 |
---|---|---|
static void | arraycopy(Object src, int srcPos, Object dest, int destPos, int length) | 將指定源陣列中的陣列從指定位置開始複製到目標陣列的指定位置。 |
static long | currentTimeMillis() | 以毫秒為單位返回當前時間。 |
static Console | console() | 返回與當前Java虛擬機器關聯的唯一Console物件(如果有)。 |
static void | exit(int status) | 終止當前執行的Java虛擬機器。 |
static void | gc() | 執行垃圾收集器。 |
static Properties | getProperties() | 確定當前系統屬性。 |
static String | getProperty(String key) | 獲取指定鍵指示的系統屬性。 |
九、java.lang.String(絕對重點)
寫Java程式碼那麼久,可以發現,使用String
可以表示出一個字串,但是使用此類的時候也會發現有一點問題。
從String
命名風格可以發現,String
是一個類,但是此類在使用的時候卻發現可以不用構造方法而直接賦值,很多人初學者剛開始認為String
是一個基本資料型別,這是一個誤區。那麼String
類這樣的操作有哪些特點呢?
1. String類介紹
String
類表示字串(在 Java 中字串屬於物件)。 Java程式中的所有字串文字(例如"abc" )都實現為此類的例項。
字串是不變的; 它們的值在建立後無法更改。 字串緩衝區支援可變字串。 因為 String
物件是不可變的,所以可以共享它們。 例如:
String str = "abc";
相當於:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
2. String類常用構造方法
構造器 | 描述 |
---|---|
String() | 初始化新建立的 String物件,使其表示空字元序列。 |
String(byte[] bytes) | 通過使用平臺的預設字符集解碼指定的位元組陣列構造新的 String 。 |
String(byte[] bytes, String charsetName) | 構造一個新的String由指定用指定的位元組的陣列解碼charset 。 |
String(char[] value) | 分配新的 String ,使其表示當前包含在字元陣列引數中的字元序列。 |
String(String original) | 初始化新建立的String物件,使其表示與引數相同的字元序列; 換句話說,新建立的字串是引數字串的副本。 |
String(StringBuffer buffer) | 分配一個新字串,其中包含當前包含在字串緩衝區引數中的字元序列。 |
String(StringBuilder builder) | 分配一個新字串,其中包含當前包含在字串構建器引數中的字元序列。 |
3. String類常用方法
記錄了在Java開發時使用String
類可能用得到的方法
變數和型別 | 方法 | 描述 |
---|---|---|
char | charAt(int index) | 返回指定索引處的 char值。 |
int | codePointAt(int index) | 返回指定索引處的字元(Unicode程式碼點)。 |
int | codePointBefore(int index) | 返回指定索引之前的字元(Unicode程式碼點)。 |
int | codePointCount(int beginIndex, int endIndex) | 返回此 String的指定文字範圍內的Unicode程式碼點數。 |
int | compareTo(String anotherString) | 按字典順序比較兩個字串。 |
boolean | contains(CharSequence s) | 當且僅當此字串包含指定的char值序列時,才返回true。 |
static String | copyValueOf(char[] data) | 相當於 valueOf(char[]) 。 |
boolean | startsWith(String prefix) | 測試此字串是否以指定的字首開頭。 |
boolean | endsWith(String suffix) | 測試此字串是否以指定的字尾結尾。 |
boolean | equals(Object anObject) | 將此字串與指定的物件進行比較。 |
boolean | equalsIgnoreCase(String anotherString) | 將此 String與另一個 String比較,忽略了大小寫。 |
int | hashCode() | 返回此字串的雜湊碼。 |
int | indexOf(String str) | 返回指定子字串第一次出現的字串中的索引。 |
int | indexOf(String str, int fromIndex) | 從指定的索引處開始,返回指定子字串第一次出現的字串中的索引。 |
int | lastIndexOf(String str) | 返回指定子字串最後一次出現的字串中的索引。 |
int | lastIndexOf(String str, int fromIndex) | 返回指定子字串最後一次出現的字串中的索引,從指定索引開始向後搜尋。 |
String | intern() | 返回字串物件的規範表示。 |
boolean | isEmpty() | 返回 true ,當且僅當, length()是 0 。 |
int | length() | 返回此字串的長度。 |
String | replace(char oldChar, char newChar) | 返回從替換所有出現的導致一個字串 oldChar在此字串 newChar 。 |
String | replaceAll(String regex, String replacement) | 將給定替換的給定 正則表示式匹配的此字串的每個子字串替換。 |
String | replaceFirst(String regex, String replacement) | 將給定替換的給定 正則表示式匹配的此字串的第一個子字串替換。 |
String[] | split(String regex) | 將此字串拆分為給定 正則表示式的匹配 項 。 |
boolean | matches(String regex) | 判斷此字串是否與給定的 正則表示式匹配。 |
String | substring(int beginIndex) | 返回一個字串,該字串是此字串的子字串。 |
String | substring(int beginIndex, int endIndex) | 返回一個字串,該字串是此字串的子字串。 |
char[] | toCharArray() | 將此字串轉換為新的字元陣列。 |
String | toLowerCase() | 使用預設語言環境的規則將此 String所有字元轉換為小寫。 |
String | toUpperCase() | 使用預設語言環境的規則將此 String所有字元轉換為大寫。 |
String | trim() | 返回一個字串,其值為此字串,刪除了所有前導和尾隨空格,其中space被定義為其程式碼點小於或等於 ‘U+0020’ (空格字元)的任何字元。 |
static String | valueOf(Object obj) | 返回 Object引數的字串表示形式。 |
以下是一些如何使用字串的示例:
/**
1. String
2. 字串是不變的
3. 它們的值在建立後無法更改。
4. 字串緩衝區支援可變字串。
5. 因為String物件是不可變的,所以可以共享它們
*/
public class DemoString {
public static void main(String[] args) {
String text1 = "123"; // String直接建立
String text2 = "123"; // String直接建立
// new表示新開闢的空間(不會被快取起來),記憶體地址絕對不可能相同,哪怕內容一樣
String text3 = new String("123"); // String物件建立
System.out.println(text1 == text2);
System.out.println(text1 == text3);
// substring下標包含開始不包含結尾
System.out.println("123456".substring(2, 5));
// 字串拼接,有幾個加號就產生幾個記憶體垃圾(能避免儘量避免)
// 如果使用字串拼接,不應該使用String
// 應該使用StringBuffer,StringBuilder(可變字元序列,更節省記憶體)
text1 = text1 + text2 + text3;
System.out.println(text1);
// StringBuilder 執行緒不安全的實現
// StringBuffer 執行緒安全的實現
StringBuilder sb = new StringBuilder("hahaha");
sb.append("666");
System.out.println(sb.toString());
}
}
執行結果:
true
false
345
123123123
hahaha666
解析:
- 由於
String
字串的不可變性,常量池中一定不存在兩個相同的字串。所以text1 == text2
是true
。 new String("123");
時,new表示新開闢的空間(不會被快取起來),記憶體地址絕對不可能相同,哪怕內容一樣。- 使用"+"進行字串拼接,有幾個加號就產生幾個記憶體垃圾(能避免儘量避免)。如果想要字串拼接,不應該使用
String
應該使用StringBuffer
,StringBuilder
(可變字元序列,更節省記憶體)。
4. StringBuffer、StringBuilder和String的主要區別
String
是不可變字元序列,StringBuilder
和StringBuffer
是可變字元序列。- 執行速度
StringBuilder
>StringBuffer
>String
。 StringBuilder
是非執行緒安全的,StringBuffer
是執行緒安全的。
5. String類小測試
String類是我們在開發中使用頻率最高的類之一,也是在面試時極有可能會被問到的,下面是一道測試題:
public class TestString {
public static void main(String[] args) {
String s1 = "1234"; // 雙引號直接創建出來的String物件會直接儲存在字串常量池中
String s2 = new String("1234"); // String物件建立
System.out.println(s1 == s2); // new是新建立的物件,不在字串常量池中,所以是false
String s3 = "12" + "34";
// 字串的+操作其本質是建立了StringBuilder物件進行append操作
// 然後將拼接後的StringBuilder物件用toString方法處理成String物件,所以是true
System.out.println(s1 == s3);
String s4 = "12";
String s5 = "34";
String s6 = s4 + s5;
System.out.println(s1 == s6); // s6不在字串常量池中,所以是false
// String物件的intern方法會得到字串物件在常量池中對應的引用
// 如果常量池中沒有對應的字串,則該字串將被新增到常量池中,然後返回常量池中字串的引用
System.out.println(s1 == s6.intern()); // s6被新增到常量池中了,所以是true
System.out.println(s2 == s2.intern()); // s2在堆中,s2.intern()在常量池中,所以是false
}
}
執行結果:
false
true
false
true
false
在解析前必須要知道的點:
- 雙引號直接創建出來的String物件會直接儲存在堆記憶體中的字串常量池中,
new String()
表示新開闢的空間,不會放在常量池中,而是放在儲存在堆記憶體中。 - 字串的"+"操作其本質是建立了
StringBuilder
物件進行append()
操作,然後將拼接後的StringBuilder
物件用toString()
方法處理成String物件。 - String物件的
intern()
方法會得到字串物件在常量池中對應的引用,如果常量池中沒有對應的字串,則該字串將被新增到常量池中,然後返回常量池中字串的引用。
解析:
String s1 = "1234";
是直接在字串常量池中建立了"1234"字串,String s2 = new String("1234");
是在堆記憶體中建立了String
物件,它們的引用不相同,所以s1 == s2
為false
。String s3 = "12" + "34";
它們相加必然是"1234"字串,與String s1 = "1234";
的內容是一樣的,因此無需再在常量池中建立"1234"字串,而是直接把"1234"字串的引用地址賦予s3
,所以s1 == s3
是true
。String s6 = s4 + s5;
這裡是物件的相加,雖然s6
的值是"1234",但是因為是物件的相加,所以s6
儲存在堆記憶體中並且是新開闢的空間,所以s1 == s6
為false
。s6.intern()
因為s6
是儲存在堆記憶體空間中,不在常量池內,因此執行intern()
會把s6
新增到字串常量池中,又因為s6
的內容為"1234"與String s1 = "1234";
相同,所以會直接把"1234"字串的引用地址賦予s6
,所以s1 == s6.intern()
是true
。s2 == s2.intern()
,s2
儲存在堆記憶體中,s2.intern()
會被新增到字串常量池中,因此這句話也等同於s2 == s1
,所以s2 == s2.intern()
為false
。