1. 程式人生 > 其它 >Java 常用類庫及String類詳解

Java 常用類庫及String類詳解

技術標籤:Java核心類庫Java字串javaintellij idea

Java常用類庫不要求有很多思想上的東西,要求對其有很熟練的使用能力。常用類庫就好比在生活中手藝人手中的工具,作為一個Java程式設計師我們也必須熟練掌握這些工具。

導航


一、java.util.Objects

JDK7版本新增的一個工具類。Objects此類包含static實用程式方法,用於操作物件或在操作前檢查某些條件。 這些實用程式包括nullnull方法,用於計算物件的雜湊程式碼,返回物件的字串,比較兩個物件,以及檢查索引或子範圍值是否超出範圍。

常用的方法:

變數和型別方法描述
static intcheckIndex​(int index, int length)檢查 index是否在 0 (含)到 length (不包括)範圍內。
static <T> intcompare​(T a, T b, Comparator<? super T> c)如果引數相同則返回0,否則返回 c.compare(a, b) 。
static booleanequals​(Object a, Object b)返回 true如果引數相等,彼此 false其他。
static inthash​(Object… values)為一系列輸入值生成雜湊碼。
static inthashCode​(Object o)返回非的雜湊碼 null引數,0為 null的論點。
static boolean
isNull​(Object obj)返回 true如果提供的參考是 null ,否則返回 false 。
static booleannonNull​(Object obj)返回 true如果提供的參考是非 null否則返回 false 。
static <T> TrequireNonNull​(T obj)檢查指定的物件引用是否不是 null 。
static <T> TrequireNonNull​(T obj, String message)檢查指定的物件引用是否為null ,如果是,則丟擲自定義的NullPointerException 。
static StringtoString​(Object o)返回呼叫的結果 toString對於非 null引數, "null"為 null的說法。
static StringtoString​(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 doubleabs​(double a)返回 double值的絕對值。
static floatabs​(float a)返回 float值的絕對值。
static intabs​(int a)返回 int值的絕對值。
static longabs​(long a)返回 long值的絕對值。
static intaddExact​(int x, int y)返回其引數的總和,如果結果溢位 int則丟擲異常。
static doubleceil​(double a)返回大於或等於引數且等於數學整數的最小值(最接近負無窮大) double 。
static doublefloor​(double a)返回小於或等於引數且等於數學整數的最大值(最接近正無窮大) double 。
static doublemax​(double a, double b)返回兩個 double值中較大的 double 。
static floatmax​(float a, float b)返回兩個 float值中較大的 float 。
static intmax​(int a, int b)返回兩個 int值中較大的 int。
static longmax​(long a, long b)返回兩個 long值中較大的 long 。
static doublemin​(double a, double b)返回兩個 double值中較小的 double 。
static floatmin​(float a, float b)返回兩個 float值中較小的 float 。
static intmin​(int a, int b)返回兩個 int值中較小的 int。
static longmin​(long a, long b)返回兩個 long 值中較小的 long。
static doublerandom()返回帶有正號的 double值,大於或等於 0.0且小於 1.0 。
static longround​(double a)返回與引數最接近的 long ,並將關係四捨五入為正無窮大。
static intround​(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> ListasList​(T… a)返回由指定陣列支援的固定大小的列表。
static intbinarySearch​(Object[] a, Object key)使用二進位制搜尋演算法在指定的陣列中搜索指定的物件。
static intbinarySearch​(Object[] a, int fromIndex, int toIndex, Object key)使用二進位制搜尋演算法搜尋指定物件的指定陣列範圍。
static <T> intbinarySearch​(T[] a, T key, Comparator<? super T> c)使用二進位制搜尋演算法在指定的陣列中搜索指定的物件。
static <T> intbinarySearch​(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 booleanequals​(int[] a, int[] a2)如果兩個指定的int陣列彼此 相等 ,則返回 true 。
static voidfill​(Object[] a, Object val)將指定的Object引用分配給指定的Objects陣列的每個元素。
static inthashCode​(Object[] a)根據指定陣列的內容返回雜湊碼。
static intmismatch​(Object[] a, Object[] b)查詢並返回兩個 Object陣列之間第一個不匹配的索引,否則如果未找到不匹配則返回-1。
static intmismatch​(Object[] a, int aFromIndex, int aToIndex, Object[] b, int bFromIndex, int bToIndex)查詢並返回指定範圍內兩個 Object陣列之間第一個不匹配的相對索引,否則如果未找到不匹配則返回-1。
static voidsort​(Object[] a)根據元素的自然排序 ,將指定的物件陣列按升序排序。
static voidsort​(Object[] a, int fromIndex, int toIndex)根據元素的自然排序 ,將指定物件陣列的指定範圍按升序排序。
static StringtoString​(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 ,並根據上下文設定進行舍入。

常用的方法:

變數和型別方法描述
BigDecimalabs()返回 BigDecimal其值是此的絕對值 BigDecimal ,其標為 this.scale() 。
BigDecimaladd​(BigDecimal augend)返回 BigDecimal其值為 (this + augend) ,其比例為 max(this.scale(), augend.scale()) 。
BigDecimaldivide​(BigDecimal divisor)返回BigDecimal其值為(this / divisor) ,其首選比例為(this.scale() - divisor.scale()) ; 如果無法表示準確的商(因為它具有非終止的十進位制擴充套件),則丟擲ArithmeticException 。
doubledoubleValue()將 BigDecimal轉換為 double 。
intintValue()將 BigDecimal轉換為 int。
longlongValue()將 BigDecimal轉換為 long。
floatfloat()將 BigDecimal轉換為 float。
BigDecimalmultiply​(BigDecimal multiplicand)返回 BigDecimal其值為 (this × multiplicand) ,其比例為 (this.scale() + multiplicand.scale()) 。
BigDecimalsubtract​(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。

常用的方法:

變數和型別方法描述
booleanafter​(Date when)測試此日期是否在指定日期之後。
booleanbefore​(Date when)測試此日期是否在指定日期之前。
Objectclone()返回此物件的副本。
intcompareTo​(Date anotherDate)用於兩個相同資料型別的比較,兩個不同型別的資料不能用此方法來比較。
booleanequals​(Object obj)比較兩個相等的日期。
static Datefrom​(Instant instant)從 Instant物件獲得 Date的例項。
inthashCode()返回此物件的雜湊碼值。
longgetTime()返回自此 Date物件表示的1970年1月1日00:00:00 GMT以來的毫秒數。
voidsetTime​(long time)將此 Date物件設定為表示格林尼治標準時間1970年1月1日00:00:00之後的 time毫秒的時間點。
InstanttoInstant()將此 Date物件轉換為 Instant 。
StringtoString()將此 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 。

常用的方法:

變數和型別方法描述
booleanequals​(Object obj)比較給定物件與此 SimpleDateFormat是否相等。
StringBufferformat​(Date date, StringBuffer toAppendTo, FieldPosition pos)將給定的 Date為日期/時間字串,並將結果附加到給定的 StringBuffer 。
Dateparse​(String text, ParsePosition pos)解析字串中的文字以生成 Date 。
StringtoPattern()返回描述此日期格式的模式字串。
/**
 * 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);
    }
}

執行結果:

2020122716:40:02
684

七、java.util.Calendar

Calendar類是一個抽象類,可以為在某一特定時刻和一組之間的轉換的方法calendar fields如YEARMONTHDAY_OF_MONTHHOUR ,等等,以及用於操縱該日曆欄位,如獲取的日期下個星期。 瞬間可以用毫秒值表示,該值是1970年1月1日格林威治標準時間1970年1月1日00:00:00,000(格里高利)的Epoch的偏移量。
Calendar提供了一個類方法getInstance ,用於獲取此型別的通用物件。 CalendargetInstance方法返回一個Calendar物件,其日曆欄位已使用當前日期和時間初始化:

 Calendar rightNow = Calendar.getInstance();

常用的欄位彙總:

變數和型別欄位描述
static intAMAM_PM欄位的值,表示從午夜到正午之前的一天的時段。
static intAM_PMget和 set欄位編號表示 HOUR是在中午之前還是之後。
static intDATEget和 set欄位編號表示當月的日期。
static intDAY_OF_MONTHget和 set欄位編號表示當月的日期。
static intDAY_OF_WEEK欄位編號為 get和 set表示星期幾。
static intDAY_OF_WEEK_IN_MONTHget和 set欄位編號,表示當前月份中某一天的序號。
static intDAY_OF_YEARget和 set欄位編號表示當年的日期編號。
static intFRIDAYDAY_OF_WEEK欄位的值表示星期五。
static intHOURget和 set欄位編號表示上午或下午的小時。
static intHOUR_OF_DAYget和 set欄位編號表示當天的小時。
static intMILLISECONDget和 set欄位編號表示秒內的毫秒數。
static intMINUTEget和 set欄位編號表示小時內的分鐘。
static intMONTHget和 set欄位編號表示月份。
protected longtime此日曆的當前設定時間,以1970年1月1日格林威治標準時間0:00:00之後的毫秒數表示。
static intWEEK_OF_MONTHget和 set欄位編號, get set的週數。
static intWEEK_OF_YEARget和 set欄位編號表示當前年份的週數。
static intYEAR欄位編號為 get和 set表示年份。

常用的方法:

變數和型別方法描述
abstract voidadd​(int field, int amount)AM_PM欄位的值,表示從午夜到正午之前的一天的時段。
booleanafter​(Object when)返回此 Calendar是否表示指定的 Object表示的時間之後的時間。
booleanbefore​(Object when)返回此 Calendar是否表示指定的 Object代表的時間之前的時間。
intget​(int field)返回給定日曆欄位的值。
intgetActualMaximum​(int field)給定此 Calendar的時間值,返回指定日曆欄位可能具有的 Calendar 。
intgetActualMinimum​(int field)給定此 Calendar的時間值,返回指定日曆欄位可能具有的 Calendar 。
intgetFirstDayOfWeek()得到一週的第一天是什麼; 例如, SUNDAY在美國, MONDAY在法國。
static CalendargetInstance()使用預設時區和區域設定獲取日曆。
DategetTime()返回一個 Date物件,表示此 Calendar的時間值(距離 Epoch的毫秒偏移量)。
longgetTimeInMillis()以毫秒為單位返回此Calendar的時間值。
TimeZonegetTimeZone()獲取時區。
voidset​(int field, int value)將給定的日曆欄位設定為給定值。
voidsetTime​(Date date)使用給定的 Date設定此日曆的時間。
StringtoString()返回此日曆的字串表示形式。
/**
 * 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
年份加12023
月份減56
獲取當前年的最大月份:11
當前年的最大天數:365
獲取2月份的天數:28
獲取一年中有多少周:52

八、java.lang.System

System類包含幾個有用的類欄位和方法。 它無法例項化。 System類提供的設施包括標準輸入,標準輸出和錯誤輸出流; 訪問外部定義的屬性和環境變數; 載入檔案和庫的方法; 以及用於快速複製陣列的一部分的實用方法。

常用的欄位彙總:

System類的欄位是一定要清楚的

變數和型別欄位描述
static PrintStreamerr“標準”錯誤輸出流。
static InputStreamin“標準”輸入流。
static PrintStreamout“標準”輸出流。

常用的方法:

變數和型別方法描述
static voidarraycopy​(Object src, int srcPos, Object dest, int destPos, int length)將指定源陣列中的陣列從指定位置開始複製到目標陣列的指定位置。
static longcurrentTimeMillis()以毫秒為單位返回當前時間。
static Consoleconsole()返回與當前Java虛擬機器關聯的唯一Console物件(如果有)。
static voidexit​(int status)終止當前執行的Java虛擬機器。
static voidgc()執行垃圾收集器。
static PropertiesgetProperties()確定當前系統屬性。
static StringgetProperty​(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類可能用得到的方法

變數和型別方法描述
charcharAt​(int index)返回指定索引處的 char值。
intcodePointAt​(int index)返回指定索引處的字元(Unicode程式碼點)。
intcodePointBefore​(int index)返回指定索引之前的字元(Unicode程式碼點)。
intcodePointCount​(int beginIndex, int endIndex)返回此 String的指定文字範圍內的Unicode程式碼點數。
intcompareTo​(String anotherString)按字典順序比較兩個字串。
booleancontains​(CharSequence s)當且僅當此字串包含指定的char值序列時,才返回true。
static StringcopyValueOf​(char[] data)相當於 valueOf(char[]) 。
booleanstartsWith​(String prefix)測試此字串是否以指定的字首開頭。
booleanendsWith​(String suffix)測試此字串是否以指定的字尾結尾。
booleanequals​(Object anObject)將此字串與指定的物件進行比較。
booleanequalsIgnoreCase​(String anotherString)將此 String與另一個 String比較,忽略了大小寫。
inthashCode()返回此字串的雜湊碼。
intindexOf​(String str)返回指定子字串第一次出現的字串中的索引。
intindexOf​(String str, int fromIndex)從指定的索引處開始,返回指定子字串第一次出現的字串中的索引。
intlastIndexOf​(String str)返回指定子字串最後一次出現的字串中的索引。
intlastIndexOf​(String str, int fromIndex)返回指定子字串最後一次出現的字串中的索引,從指定索引開始向後搜尋。
Stringintern()返回字串物件的規範表示。
booleanisEmpty()返回 true ,當且僅當, length()是 0 。
intlength()返回此字串的長度。
Stringreplace​(char oldChar, char newChar)返回從替換所有出現的導致一個字串 oldChar在此字串 newChar 。
StringreplaceAll​(String regex, String replacement)將給定替換的給定 正則表示式匹配的此字串的每個子字串替換。
StringreplaceFirst​(String regex, String replacement)將給定替換的給定 正則表示式匹配的此字串的第一個子字串替換。
String[]split​(String regex)將此字串拆分為給定 正則表示式的匹配 項 。
booleanmatches​(String regex)判斷此字串是否與給定的 正則表示式匹配。
Stringsubstring​(int beginIndex)返回一個字串,該字串是此字串的子字串。
Stringsubstring​(int beginIndex, int endIndex)返回一個字串,該字串是此字串的子字串。
char[]toCharArray()將此字串轉換為新的字元陣列。
StringtoLowerCase()使用預設語言環境的規則將此 String所有字元轉換為小寫。
StringtoUpperCase()使用預設語言環境的規則將此 String所有字元轉換為大寫。
Stringtrim()返回一個字串,其值為此字串,刪除了所有前導和尾隨空格,其中space被定義為其程式碼點小於或等於 ‘U+0020’ (空格字元)的任何字元。
static StringvalueOf​(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

解析:

  1. 由於String字串的不可變性,常量池中一定不存在兩個相同的字串。所以text1 == text2true
  2. new String("123");時,new表示新開闢的空間(不會被快取起來),記憶體地址絕對不可能相同,哪怕內容一樣。
  3. 使用"+"進行字串拼接,有幾個加號就產生幾個記憶體垃圾(能避免儘量避免)。如果想要字串拼接,不應該使用String應該使用StringBuffer,StringBuilder(可變字元序列,更節省記憶體)。

4. StringBuffer、StringBuilder和String的主要區別

  1. String是不可變字元序列,StringBuilderStringBuffer是可變字元序列。
  2. 執行速度StringBuilder > StringBuffer > String
  3. 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

在解析前必須要知道的點:

  1. 雙引號直接創建出來的String物件會直接儲存在堆記憶體中的字串常量池中,new String()表示新開闢的空間,不會放在常量池中,而是放在儲存在堆記憶體中。
  2. 字串的"+"操作其本質是建立了StringBuilder物件進行append()操作,然後將拼接後的StringBuilder物件用toString()方法處理成String物件。
  3. String物件的intern()方法會得到字串物件在常量池中對應的引用,如果常量池中沒有對應的字串,則該字串將被新增到常量池中,然後返回常量池中字串的引用。

解析:

  1. String s1 = "1234";是直接在字串常量池中建立了"1234"字串,String s2 = new String("1234");是在堆記憶體中建立了String物件,它們的引用不相同,所以s1 == s2false
  2. String s3 = "12" + "34";它們相加必然是"1234"字串,與String s1 = "1234";的內容是一樣的,因此無需再在常量池中建立"1234"字串,而是直接把"1234"字串的引用地址賦予s3,所以s1 == s3true
  3. String s6 = s4 + s5;這裡是物件的相加,雖然s6的值是"1234",但是因為是物件的相加,所以s6儲存在堆記憶體中並且是新開闢的空間,所以s1 == s6false
  4. s6.intern()因為s6是儲存在堆記憶體空間中,不在常量池內,因此執行intern()會把s6新增到字串常量池中,又因為s6的內容為"1234"與String s1 = "1234";相同,所以會直接把"1234"字串的引用地址賦予s6,所以s1 == s6.intern()true
  5. s2 == s2.intern()s2儲存在堆記憶體中,s2.intern()會被新增到字串常量池中,因此這句話也等同於s2 == s1,所以s2 == s2.intern()false