Java學(xué)習(xí)總結(jié)之核心API

概述

Java 的核心 API 是非常龐大的,這給開(kāi)發(fā)者來(lái)說(shuō)帶來(lái)了很大的方便横缔。所謂的 API 就是一些已經(jīng)寫(xiě)好、可直接調(diào)用的類庫(kù)衫哥。Java 里有非常龐大的 API茎刚,其中有一些類庫(kù)是我們必須得掌握的,只有熟練掌握了 Java 一些核心的 API撤逢,我們才能更好的使用 Java膛锭。


general.png

參考資料:實(shí)驗(yàn)樓JDK 核心 API
下面我們以包為單位對(duì)開(kāi)發(fā)中常用的核心API進(jìn)行總結(jié)。

java.lang包

在程序中蚊荣,java.lang 包并不需要像其他包一樣需要import關(guān)鍵字進(jìn)行引入初狰。系統(tǒng)會(huì)自動(dòng)加載,所以我們可以直接取用其中的所有類互例。下面我們就來(lái)詳細(xì)地學(xué)習(xí)一下 java.lang 包吧奢入。

包裝類

Java 是一種面向?qū)ο笳Z(yǔ)言,Java 中的類把方法與數(shù)據(jù)連接在一起媳叨,構(gòu)成了自包含式的處理單元腥光。但在 Java 中不能定義基本數(shù)據(jù)類型(primitive type)對(duì)象,這樣存在一個(gè)問(wèn)題:即基本數(shù)據(jù)類型不具備對(duì)象特性糊秆,就不能進(jìn)行對(duì)象化交互武福。為了能將基本類型視為對(duì)象進(jìn)行處理,并能連接相關(guān)的方法痘番,Java 為每個(gè)基本類型都提供了包裝類捉片。如 int 型數(shù)值的包裝類 Integer,boolean 型數(shù)值的包裝
類 Boolean 等汞舱,這樣便可以把這些基本類型轉(zhuǎn)換為對(duì)象來(lái)處理了伍纫。下面將介紹Java 中提供的各種包裝類。

包裝類.png

在這八個(gè)類名中兵拢,除了Integer類Character類翻斟,其它六個(gè)類的類名和基本數(shù)據(jù)類型一致,只是類名的首字母大寫(xiě)说铃,這八種包裝類都是被final關(guān)鍵字修飾的,沒(méi)有無(wú)參的構(gòu)造方法嘹履,且是不可變的腻扇。其實(shí)還有兩個(gè)包裝類,但它們沒(méi)有對(duì)應(yīng)的基本數(shù)據(jù)類型砾嫉,即java.math包中的BigInteger類和BigDecimal類幼苛,主要應(yīng)用于高精度的運(yùn)算,BigInteger 支持任意精度的整數(shù)焕刮,BigDecimal 支持任意精度帶小數(shù)點(diǎn)的運(yùn)算舶沿,它們沒(méi)有被final關(guān)鍵字修飾墙杯。關(guān)于這兩個(gè)類我們將在java.math包中進(jìn)行詳細(xì)介紹。

基本類型與包裝類型的異同:

1括荡、在 Java 中高镐,一切皆對(duì)象,但八大基本類型卻不是對(duì)象畸冲。
2嫉髓、聲明方式的不同,基本類型無(wú)需通過(guò) new 關(guān)鍵字來(lái)創(chuàng)建邑闲,而包裝類型需 new 關(guān)鍵字算行。
3、存儲(chǔ)方式及位置的不同苫耸,基本類型是直接存儲(chǔ)變量的值保存在棧中能高效的存取州邢,包裝類型需要通過(guò)引用指向?qū)嵗唧w的實(shí)例保存在堆中褪子。
4偷霉、初始值的不同,包裝類型的初始值為 null褐筛,基本類型的的初始值視具體的類型而定类少,比如 int 類型的初始值為 0,boolean 類型為 false渔扎。
5硫狞、使用方式的不同,比如與集合類合作使用時(shí)只能使用包裝類型晃痴。

Number類

在八種包裝類中残吩,數(shù)值包裝類(除了Character和Boolean,它們的直接父類是Object)以及之后會(huì)介紹的java.math包中的BigInteger類BigDecimal類都有一個(gè)共同的抽象父類倘核,即Number類泣侮。在學(xué)習(xí)包裝類之前,我們先來(lái)學(xué)習(xí)Number類紧唱。
抽象類 Number 是父類,Number 的子類必須提供將表示的數(shù)值轉(zhuǎn)換成 byte / double / float / long / int / short 的方法活尊。Number 類的方法被 Number 的各子類所實(shí)現(xiàn),常用方法如下:

Number類.png

Integer類

1、構(gòu)造方法有兩種:
a) 以 int 型變量作為參數(shù)創(chuàng)建 Integer 對(duì)象,實(shí)例代碼如下:

Integer number=new Integer(7);

b) 以 String 型變量作為參數(shù)創(chuàng)建 Integer 對(duì)象,實(shí)例代碼如下:

Integer number=new Integer(“7”);

2漏益、常用方法:


Integer類.png

需要注意的是Integer也存在除了intValue()之外的其他xxxValue()方法蛹锰,可以把Integer類型的對(duì)象轉(zhuǎn)換為任意基本數(shù)值類型,這是從Number類繼承的方法绰疤。還有铜犬,parseInt()方法有多個(gè)重載方法,可以把字符串轉(zhuǎn)換為不同進(jìn)制的基本數(shù)據(jù)類型。

3癣猾、常用的常量:
a) MAX_VALUE: 表示 int 型可取的最大值
b) MIN_VALUE: 表示 int 型可取的最小值
c) SIZE:表示以二進(jìn)制補(bǔ)碼形式表示 int 值的位數(shù)
d) TYPE: 表示基本類型 Class 實(shí)例

4敛劝、基本數(shù)據(jù)類型、包裝類纷宇、字符串三者之間的轉(zhuǎn)換:
a)基本數(shù)據(jù)類型和包裝類之間的轉(zhuǎn)換
我們先來(lái)認(rèn)識(shí)兩個(gè)概念:裝箱與拆箱夸盟。
裝箱:把基本數(shù)據(jù)類型轉(zhuǎn)換成包裝類,分為自動(dòng)裝箱和手動(dòng)裝箱呐粘。
拆箱:把包裝類轉(zhuǎn)換成基本數(shù)據(jù)類型满俗,分為自動(dòng)拆箱和手動(dòng)拆箱。
下面通過(guò)代碼來(lái)演示:

        //裝箱:把基本數(shù)據(jù)類型轉(zhuǎn)換成包裝類
        
        //自動(dòng)裝箱
        int t1 = 2;
        Integer t2 = t1;
        
        //手動(dòng)裝箱
        //1作岖、構(gòu)造方法
        Integer t3 = new Integer(t1);
        //2唆垃、包裝類的valueOf()
        Integer t4 = Integer.valueOf(t1);
        
        //拆箱:把包裝類轉(zhuǎn)換成基本數(shù)據(jù)類型
        
        //自動(dòng)拆箱
        int t4 = t2;
        
        //手動(dòng)拆箱
        int t5 = t2.intValue();

b)基本數(shù)據(jù)類型和字符串之間的轉(zhuǎn)換
直接看代碼:

        //基本數(shù)據(jù)類型轉(zhuǎn)換為字符串
        int t1=2;
        String t2=Integer.toString(t1);
        //也可直接用'+'進(jìn)行字符串連接,會(huì)自動(dòng)調(diào)用toString()
        
        //字符串轉(zhuǎn)換為基本數(shù)據(jù)類型
        //1痘儡、包裝類的parseInt
        int t3=Integer.parseInt(t2);
        /*2辕万、包裝類的valueOf()先將字符串轉(zhuǎn)換為包裝類,
        再通過(guò)自動(dòng)拆箱完成基本類型轉(zhuǎn)換*/
        int t4=Integer.valueOf(t2);

c)包裝類和字符串之間的轉(zhuǎn)換

     //包裝類轉(zhuǎn)換為字符串
     Integer t1 = 10;
     String t2 = t1.toString();
     
     //字符串轉(zhuǎn)換為包裝類  
     //1沉删、構(gòu)造方法  
     Integer t3 = new Integer("10");
     //2渐尿、包裝類的valueOf()
     Integer t4 = Integer.valueOf("10");

5、包裝類對(duì)象間的比較
我們先來(lái)看下面的代碼:

package wrap;

public class WrapperTest {

    public static void main(String[] args) {
        Integer one=new Integer(100);
        Integer two=new Integer(100);
        System.out.println("one==two的結(jié)果:"+(one==two));//1 false
        
        Integer three=100;//自動(dòng)裝箱
        //自動(dòng)裝箱時(shí)隱式調(diào)用Integer three=Integer.valueOf(100);
        System.out.println("one==three的結(jié)果"+(one==three));//2 false
        System.out.println("three==100的結(jié)果:"+(three==100));//3 自動(dòng)拆箱 true
        //Integer four=100;
        Integer four=Integer.valueOf(100);
        System.out.println("three==four的結(jié)果:"+(three==four));//4 true
        
        Integer five=200;
        System.out.println("five==200的結(jié)果:"+(five==200));//5 true
        
        Integer six=200;
        System.out.println("five==six的結(jié)果:"+(five==six));//6 false
        
        Double d1=Double.valueOf(100);
        System.out.println("d1==100的結(jié)果:"+(d1==100));//7 true
        
        Double d2=Double.valueOf(100);
        System.out.println("d1==d2的結(jié)果:"+(d1==d2));//8 false
    }

}

我們先來(lái)引入一個(gè)對(duì)象池的概念矾瑰,Java的內(nèi)存空間主要分為棧砖茸、堆、常量池(對(duì)象池)殴穴,對(duì)象池可以認(rèn)為是Java提供的緩存技術(shù)凉夯。當(dāng)我們調(diào)用Integer的valueOf()方法且傳入的參數(shù)在-128~127之間時(shí)(注意自動(dòng)裝箱的原理實(shí)際上就是編譯器隱式調(diào)用了這個(gè)方法),會(huì)首先在常量池中查找是否存在該對(duì)象采幌,如果不存在劲够,就在常量池中創(chuàng)建該對(duì)象,并讓存在于棧中的Integer引用變量指向它;如果常量池中已經(jīng)存在這個(gè)對(duì)象就直接讓棧中的Integer引用變量指向它休傍。

對(duì)象池.png

我們來(lái)逐一解釋輸出的結(jié)果:
1處結(jié)果為false征绎,因?yàn)槊看问褂胣ew關(guān)鍵字,會(huì)在堆上新開(kāi)辟一塊內(nèi)存空間磨取,所以用==判斷結(jié)果一定為false人柿。
2處結(jié)果為false,因?yàn)閛ne指向的是堆上開(kāi)辟的空間寝衫,而three自動(dòng)裝箱顷扩,會(huì)在對(duì)象池里創(chuàng)建對(duì)象,并指向?qū)ο蟪氐膶?duì)應(yīng)空間慰毅,所以==判斷結(jié)果為false。
3處結(jié)果為true扎阶,因?yàn)楫?dāng)包裝類和基本數(shù)據(jù)類型進(jìn)行比較時(shí)會(huì)自動(dòng)拆箱汹胃,相當(dāng)于比較100==100,結(jié)果自然是true婶芭。
4處結(jié)果為true,因?yàn)榍懊鎡hree自動(dòng)裝箱已經(jīng)隱式調(diào)用valueOf方法并在對(duì)象池中創(chuàng)建過(guò)一個(gè)100的Integer對(duì)象(100在-128~127之間着饥,所以會(huì)在對(duì)象池中創(chuàng)建該對(duì)象)犀农,所以當(dāng)four再次調(diào)用valueOf方法時(shí)會(huì)在對(duì)象池中進(jìn)行尋找,找到該對(duì)象后four也指向該對(duì)象宰掉,所以three和four指向的是同一個(gè)對(duì)象呵哨,結(jié)果為true。
5處結(jié)果為true轨奄,原因同3,不贅述孟害。
6處結(jié)果為false,這是因?yàn)?00不在-128~127的范圍挪拟,不能使用對(duì)象池挨务。
7處結(jié)果為true,自動(dòng)拆箱玉组,即比較100.0==100谎柄,結(jié)果為true。
8處結(jié)果為false惯雳,因?yàn)樵诎b類中朝巫,Double和Float不存在對(duì)象池。

其他包裝類對(duì)應(yīng)的對(duì)象池如下:

  • Boolean:true and false
  • Byte:-128 ~ 127
  • Short:-128 ~ 127
  • Integer:-128 ~127
  • Long:-128 ~127
  • Character:\u0000 ~ \u007F
  • Double和Float不存在對(duì)象池
    在使用這些基本類型對(duì)應(yīng)的包裝類型時(shí)石景,就可以直接使用緩沖池中的對(duì)象劈猿。

最后提醒:比較包裝類的值不要使用==,此時(shí)并不會(huì)對(duì)兩個(gè)包裝類進(jìn)行自動(dòng)拆箱鸵钝,而是和其他類型對(duì)象比較一樣比較其地址糙臼,所以比較值還是使用equals或compareTo方法!6魃獭变逃!

Boolean類

Boolean 類將基本類型為 boolean 的值包裝在一個(gè)對(duì)象中。一個(gè) Boolean類型的對(duì)象只包含一個(gè)類型為 boolean 的字段怠堪。此外,此類還為 boolean 和String 的相互轉(zhuǎn)換提供了許多方法,并提供了處理 boolean 時(shí)非常有用的其他一些常量和方法揽乱。
1、構(gòu)造方法:
a) 創(chuàng)建一個(gè)表示 value 參數(shù)的 boolean 對(duì)象,實(shí)例如下:

Boolean b = new Boolean(true);

b)以 String 變量作為參數(shù),創(chuàng)建 boolean 對(duì)象粟矿。此時(shí),如果傳入的字符串不為 null,且忽略大小寫(xiě)后的內(nèi)容等于”true”,則生成 Boolean 對(duì)象值為 true,反之為 false凰棉。

Boolean b1 = new Boolean("ok"); 
System.out.println(b1); //輸出false
Boolean b2=new Boolean("TRUE");
System.out.println(b2); //輸出true

2、常用方法:

Boolean類.png

3陌粹、常用的常量:
a) TRUE:對(duì)應(yīng)基值 true 的 Boolean 對(duì)象;
b) FALSE:對(duì)應(yīng)基值 false 的 Boolean 對(duì)象;
c) TYPE:表示基本類型 Class 實(shí)例

Byte類

Byte 類將基本類型為 byte 的值包裝在一個(gè)對(duì)象中,一個(gè) byte 類型的對(duì)象只包含一個(gè)類型為 byte 的對(duì)象撒犀。此外,該類還為 byte 和 String 之間相互轉(zhuǎn)換提供方法,并提供了一些處理 byte 時(shí)非常有用的常量。
1、構(gòu)造方法
Byte 類提供了兩種構(gòu)造方法的重載形式來(lái)創(chuàng)建 BYTE 類對(duì)象:
a) Byte (byte value) 通過(guò)這種方法創(chuàng)建的 byte 對(duì)象,可表示指定的 byte值或舞。如:

Byte b = new Byte(45);

b) Byte(String str) 通過(guò)這種方法創(chuàng)建的 byte 對(duì)象,可表示 String 參數(shù)指定的 byte 值荆姆,例:

Byte mybyte = new Byte("12");

2、常用方法

Byte類.png

3映凳、常用的常量
a) MIN_VALUE: 最小值
b) MAX_VALUE: 最大值
c) SIZE: 二進(jìn)制
d) TYPE: 表示基本類型 byte 的 class 實(shí)例

Character類

Character 類在對(duì)象中包裝一個(gè)基本類型為 char 的值胆筒。一個(gè) Character 對(duì)象包含類型為 char 的單個(gè)字段。
1诈豌、構(gòu)造方法
Character 類的構(gòu)造方法的語(yǔ)法如下:

Character(char value)  

2仆救、常用方法

Double1.png

Double2.png

還有isDigit(ch)、isLetter(ch)矫渔、isLetterOrDigit(ch)等方法分別返回一個(gè)布爾值表示ch是否是數(shù)字字符彤蔽、ch是否是字母、ch是否是字母或者數(shù)字蚌斩。

Double類

Double 和 Float 包裝類是對(duì) double铆惑、float 基本類型的封裝,他們都是 Number 類的子類,又都是對(duì)小數(shù)進(jìn)行操作,所以常用基本方法相同,Double 類在對(duì)象中包裝一個(gè)基本類型為 double 的值,每個(gè) double 類都包含一個(gè) double 類型的字段。
1、 構(gòu)造方法
Double 類提供了兩種構(gòu)造方法來(lái)獲得 Double 類對(duì)象
a) Double(double value): 基于 double 參數(shù)創(chuàng)建 Double 類對(duì)象;
b) Double(String str): 構(gòu)造一個(gè)新分配的 Double 對(duì)象,表示用字符串表示的 Double 類型的浮點(diǎn)值
2、常用方法

Math類

我們?cè)诰幊痰倪^(guò)程中乌叶,經(jīng)常需要對(duì)一些數(shù)字進(jìn)行數(shù)學(xué)操作,如初等指數(shù)撕阎、對(duì)數(shù)、平方根和三角函數(shù)碌补,其實(shí) java.lang 里的 Math 類包含了用于執(zhí)行基本數(shù)學(xué)運(yùn)算的方法虏束。我們就來(lái)學(xué)習(xí)一下吧!
1厦章、構(gòu)造方法
Math類的構(gòu)造方法是private的镇匀,這樣設(shè)計(jì)的意圖是不讓使用者創(chuàng)建Math類的對(duì)象,也就是說(shuō)袜啃,Math類的所有方法都是靜態(tài)方法汗侵。另外Math類是final的,設(shè)計(jì)為不能被繼承群发。
2晰韵、常用方法

Math類.png

String類

1、構(gòu)造方法

String構(gòu)造1.png

String構(gòu)造2.png

2熟妓、常用方法(方法很多雪猪,勤查API)

String1.png

String2.png
String3.png
String4.png
String5.png
String6.png

特別關(guān)注:
1)字符串的替換和分隔
replace、replaceFirst起愈、replaceAll只恨、split等方法译仗。
2)依照模式匹配、替換和分隔(正則表達(dá)式)
matches方法配合正則表達(dá)式坤次。更多拓展還應(yīng)學(xué)習(xí)java.util.regex 包里的Pattern類和Matcher類古劲。
3)字符串與字符數(shù)組之間的轉(zhuǎn)換
字符串轉(zhuǎn)字符數(shù)組使用toCharArray()方法斥赋,字符數(shù)組轉(zhuǎn)字符串使用字符串的構(gòu)造方法String(char[])或valueOf(char[])缰猴。
4)字符串與字符和數(shù)值之間的轉(zhuǎn)換
字符串轉(zhuǎn)字符和數(shù)值使用包裝類的parseXXX()方法或valueOf(String)方法,字符和數(shù)值轉(zhuǎn)字符串可以使用'+'直接連接疤剑,也可以使用String類的valueOf方法滑绒。
5)格式化字符串
使用String類的靜態(tài)format方法,可以格式化字符串隘膘。

3疑故、等于運(yùn)算符與equals方法的區(qū)別
equals比較的是String對(duì)象的內(nèi)容,==比較的是String對(duì)象的引用弯菊。值得注意的是纵势,String類型變量看似存儲(chǔ)了一個(gè)字符串,但它仍然屬于引用類型變量管钳,所以String類型變量存在于棧中钦铁,而實(shí)際的字符串對(duì)象存在于堆中或常量池中。String類型變量存儲(chǔ)的是String對(duì)象的引用才漆,String對(duì)象存儲(chǔ)的才是字符串值牛曹。
4、String對(duì)象的存儲(chǔ)
我們首先來(lái)看看Java中的內(nèi)存分布醇滥。


字符串常量池(String Poll)保存著所有字符串字面量(literal strings)黎比,這些字面量在編譯時(shí)期就確定。不僅如此鸳玩,還可以使用 String 的intern()方法在運(yùn)行過(guò)程中將字符串添加到String Poll中阅虫。
如果我們用String str = "Hello world"的形式創(chuàng)建字符串,會(huì)首先在常量池尋找是否存在這樣的字符串常量不跟,如果沒(méi)有颓帝,就創(chuàng)建并讓字符串變量指向它;如果有躬拢,就直接讓字符串變量指向它躲履。而如果使用String str = new str("Hello world")的形式,就在堆上重新開(kāi)辟一塊內(nèi)存空間并讓字符串變量指向它聊闯。

示意圖如下:


當(dāng)一個(gè)字符串調(diào)用 intern() 方法時(shí)工猜,如果String Poll中已經(jīng)存在一個(gè)字符串和該字符串值相等(使用 equals() 方法進(jìn)行確定),那么就會(huì)返回 String Poll中字符串的引用菱蔬;否則篷帅,就會(huì)在String Poll中添加一個(gè)新的字符串史侣,并返回這個(gè)新字符串的引用。

下面示例中魏身,s1 和 s2 采用 new String() 的方式新建了兩個(gè)不同字符串惊橱,而 s3 和 s4 是通過(guò) s1.intern() 方法取得一個(gè)字符串引用。intern() 首先把 s1 引用的字符串放到 String Pool 中箭昵,然后返回這個(gè)字符串引用税朴。因此 s3 和 s4 引用的是同一個(gè)字符串。

String s1 = new String("aaa");
String s2 = new String("aaa");
System.out.println(s1 == s2);           // false
String s3 = s1.intern();
String s4 = s1.intern();
System.out.println(s3 == s4);           // true

如果是采用 "bbb" 這種字面量的形式創(chuàng)建字符串家制,會(huì)自動(dòng)地將字符串放入 String Pool 中正林。

String s5 = "bbb";
String s6 = "bbb";
System.out.println(s4 == s5);  // true

在 Java 7 之前,String Poll 被放在運(yùn)行時(shí)常量池中颤殴,它屬于永久代觅廓。而在 Java 7,String Poll 被移到中涵但。這是因?yàn)橛谰么目臻g有限杈绸,在大量使用字符串的場(chǎng)景下會(huì)導(dǎo)致 OutOfMemoryError 錯(cuò)誤。

5矮瘟、String類的不可變性
String 被聲明為 final瞳脓,因此它不可被繼承。
內(nèi)部使用 char 數(shù)組存儲(chǔ)數(shù)據(jù)芥永,該數(shù)組被聲明為 final篡殷,這意味著 value 數(shù)組初始化之后就不能再引用其它數(shù)組。并且 String 內(nèi)部沒(méi)有改變 value 數(shù)組的方法埋涧,因此可以保證 String是不可變類板辽,即String對(duì)象一旦被創(chuàng)建,其內(nèi)容是不可變的棘催。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

下面是String不可變的例子:

package com.imooc.string;

public class StringDemo6 {

    public static void main(String[] args) {
        //String的不可變性
        //String對(duì)象一旦被創(chuàng)建劲弦,則不能修改,是不可變的
        //所謂的修改其實(shí)是創(chuàng)建了新的對(duì)象醇坝,所指向的內(nèi)存空間不變
        String s1="imooc";
        String s2="hello,"+s1;
        //s2指向"hello,imooc"
        s1="hello,"+s1;
        //s1不再指向imooc所在的內(nèi)存空間邑跪,而是指向了"hello,imooc"
        System.out.println("s1="+s1);//s1=hello,imooc
        System.out.println("s2="+s2); //s2=hello,imooc
    }
}
change.png
change2.png

不可變的好處

1. 可以緩存 hash 值
因?yàn)?String 的 hash 值經(jīng)常被使用,例如 String 用做 HashMap 的 key呼猪。不可變的特性可以使得 hash 值也不可變画畅,因此只需要進(jìn)行一次計(jì)算。
2. String Pool的需要
如果一個(gè) String 對(duì)象已經(jīng)被創(chuàng)建過(guò)了宋距,那么就會(huì)從 String Pool 中取得引用轴踱。只有 String 是不可變的,才可能使用 String Pool谚赎。


3. 安全性
String 經(jīng)常作為參數(shù)淫僻,String 不可變性可以保證參數(shù)不可變诱篷。例如在作為網(wǎng)絡(luò)連接參數(shù)的情況下如果 String 是可變的,那么在網(wǎng)絡(luò)連接過(guò)程中雳灵,String 被改變棕所,改變 String 對(duì)象的那一方以為現(xiàn)在連接的是其它主機(jī),而實(shí)際情況卻不一定是悯辙。
4. 線程安全
String 不可變性天生具備線程安全琳省,可以在多個(gè)線程中安全地使用。

StringBuilder類 & StringBuffer類

由于String類的不可變性笑撞,String在操作字符串時(shí)可能會(huì)產(chǎn)生很多冗余的中間字符串變量岛啸。所以,當(dāng)需要頻繁操作字符串時(shí)茴肥,建議使用StringBuilder類或StringBuffer類,這兩個(gè)類是可變類荡灾。
StringBuilder類和StirngBuffer類的區(qū)別
StringBuilder不是線程安全的瓤狐。StringBuffer是線程安全的,內(nèi)部使用synchronized進(jìn)行同步批幌,其他用法基本相同础锐。由于StringBuffer類是多線程安全的,所以在單線程程序中StringBuilder性能略高荧缘。所以建議在單線程情況下使用StringBuilder皆警,多線程情況下使用StringBuffer。

由于兩者的構(gòu)造方法和常見(jiàn)方法基本相同截粗,所以我們以StringBuffer為例進(jìn)行介紹:
1信姓、構(gòu)造方法

StringBuffer1.png

2、常見(jiàn)方法

StringBuffer2.png

String绸罗、StringBuilder意推、StringBuffer運(yùn)行速度比較
結(jié)論:運(yùn)行速度快慢:StringBuilder > StringBuffer > String
原因:String為字符串常量,對(duì)String對(duì)象進(jìn)行的操作實(shí)際上是一個(gè)不斷創(chuàng)建新的對(duì)象并且將舊的對(duì)象回收的一個(gè)過(guò)程珊蟀,所以執(zhí)行速度很慢菊值。
而StringBuilder和StringBuffer均為字符串變量,對(duì)變量進(jìn)行操作就是直接對(duì)該對(duì)象進(jìn)行更改育灸,而不進(jìn)行創(chuàng)建和回收的操作腻窒,所以速度要比String快很多。

Class類

詳見(jiàn)Java學(xué)習(xí)總結(jié)之反射

Object類

掌握Object類的九個(gè)方法:

public final native Class<?> getClass()

public native int hashCode()

public boolean equals(Object obj)

protected native Object clone() throws CloneNotSupportedException

public String toString()

public final native void notify()

public final native void notifyAll()

public final native void wait(long timeout) throws InterruptedException

public final void wait(long timeout, int nanos) throws InterruptedException

public final void wait() throws InterruptedException

protected void finalize() throws Throwable {}

詳見(jiàn) Java學(xué)習(xí)總結(jié)之繼承和多態(tài)Java多線程學(xué)習(xí)之線程間通信

System類

詳見(jiàn)Java學(xué)習(xí)總結(jié)之Java IO系統(tǒng)

Enum類

詳見(jiàn)Java學(xué)習(xí)總結(jié)之Java基本程序設(shè)計(jì)結(jié)構(gòu)

Thread類

詳見(jiàn)Java多線程學(xué)習(xí)之并發(fā)基礎(chǔ)

java.math包

java.math包主要包含BigInteger類和BigDecimal類磅崭,主要應(yīng)用于高精度的運(yùn)算儿子,BigInteger 支持任意精度的整數(shù),BigDecimal 支持任意精度帶小數(shù)點(diǎn)的運(yùn)算绽诚。不要混淆java.math包和java.lang包中的Math類典徊。

BigInteger類

1杭煎、構(gòu)造方法


BigInteger構(gòu)造方法.png

2、常見(jiàn)方法

BigInteger方法1.png

BigInteger方法2.png
BigInteger方法3.png
BigInteger方法4.png

3卒落、常量

BigInteger常量.png

BigDecimal類

1羡铲、構(gòu)造方法

BigDecimal構(gòu)造方法1.png

BigDecimal構(gòu)造方法2.png

2、常見(jiàn)方法

BigDecimal方法1.png

BigDecimal方法2.png
BigDecimal方法3.png
BigDecimal方法4.png
BigDecimal方法5.png

3儡毕、常量

BigDecimal常量.png

java.util包

general2.png

Date類

Date 類表示日期和時(shí)間也切,里面封裝了操作日期和時(shí)間的方法。Date 類經(jīng)常用來(lái)獲取系統(tǒng)當(dāng)前時(shí)間腰湾。
1.構(gòu)造方法

Date構(gòu)造方法.png

2.常用方法

Date方法1.png

Date方法2.png
1.獲取當(dāng)前日期時(shí)間

Java中獲取當(dāng)前日期和時(shí)間很簡(jiǎn)單雷恃,使用 Date 對(duì)象的 toString() 方法來(lái)打印當(dāng)前日期和時(shí)間,如下所示:

import java.util.Date;
  
public class DateDemo {
   public static void main(String args[]) {
       // 初始化 Date 對(duì)象
       Date date = new Date();
        
       // 使用 toString() 函數(shù)顯示日期時(shí)間
       System.out.println(date.toString());
   }
}
2.日期比較

Java使用以下三種方法來(lái)比較兩個(gè)日期:

  • 使用 getTime() 方法獲取兩個(gè)日期(自1970年1月1日經(jīng)歷的毫秒數(shù)值)费坊,然后比較這兩個(gè)值倒槐。
  • 使用方法 before(),after() 和 equals()附井。
  • 使用 compareTo() 方法讨越,它是由 Comparable 接口定義的,Date 類實(shí)現(xiàn)了這個(gè)接口永毅。
3.使用 SimpleDateFormat 格式化日期

SimpleDateFormat 是一個(gè)以語(yǔ)言環(huán)境敏感的方式來(lái)格式化和分析日期的類把跨。SimpleDateFormat 允許你選擇任何用戶自定義日期時(shí)間格式來(lái)運(yùn)行。例如:

import java.util.*;
import java.text.*;
 
public class DateDemo {
   public static void main(String args[]) {
 
      Date dNow = new Date( );
      SimpleDateFormat ft = 
      new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
      /*這一行代碼確立了轉(zhuǎn)換的格式沼死,其中 yyyy 是完整的公元年着逐,
      MM 是月份,dd 是日期意蛀,HH:mm:ss 是時(shí)耸别、分、秒浸间。*/
 
      System.out.println("Current Date: " + ft.format(dNow));
   }
}

注意:有的格式大寫(xiě)太雨,有的格式小寫(xiě),例如 MM 是月份魁蒜,mm 是分囊扳;HH 是 24 小時(shí)制,而 hh 是 12 小時(shí)制兜看。
運(yùn)行結(jié)果如下:
Current Date: Wed 2016.11.09 at 08:23:19 AM UTC

日期和時(shí)間的格式化編碼
時(shí)間模式字符串用來(lái)指定時(shí)間格式锥咸。在此模式中,所有的 ASCII 字母被保留為模式字母细移,定義如下:

SimpleDateFormat1.png

SimpleDateFormat2.png
4.使用printf格式化日期

見(jiàn)博文 Java學(xué)習(xí)總結(jié)之Java基本程序設(shè)計(jì)結(jié)構(gòu) 的printf部分

5.解析字符串為時(shí)間

SimpleDateFormat 類有一些附加的方法搏予,特別是parse(),它試圖按照給定的SimpleDateFormat 對(duì)象的格式化存儲(chǔ)來(lái)解析字符串弧轧。例如:

import java.util.*;
import java.text.*;
  
public class DateDemo {
 
   public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); 
 
      String input = args.length == 0 ? "1818-11-11" : args[0]; 
 
      System.out.print(input + " Parses as "); 
 
      Date t; 
 
      try { 
          t = ft.parse(input); 
          System.out.println(t); 
      } catch (ParseException e) { 
          System.out.println("Unparseable using " + ft); 
      }
   }
}

以上實(shí)例編譯運(yùn)行結(jié)果如下:
java DateDemo
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
java DateDemo 2007-12-01
2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007

6.Calendar類

我們現(xiàn)在已經(jīng)能夠格式化并創(chuàng)建一個(gè)日期對(duì)象了雪侥,但是我們?nèi)绾尾拍?strong>設(shè)置和獲取日期數(shù)據(jù)的特定部分呢碗殷,比如說(shuō)小時(shí),日速缨,或者分鐘? 我們又如何在日期的這些部分加上或者減去值呢?
答案是使用 Calendar 類锌妻。
Calendar類的功能要比Date類強(qiáng)大很多,而且在實(shí)現(xiàn)方式上也比Date類要復(fù)雜一些旬牲。
Calendar類是一個(gè)抽象類仿粹,在實(shí)際使用時(shí)實(shí)現(xiàn)特定的子類的對(duì)象,創(chuàng)建對(duì)象的過(guò)程對(duì)程序員來(lái)說(shuō)是透明的原茅,只需要使用getInstance方法創(chuàng)建即可吭历。
1) 構(gòu)造方法
創(chuàng)建一個(gè)代表系統(tǒng)當(dāng)前日期的Calendar對(duì)象

Calendar c = Calendar.getInstance();/*默認(rèn)是當(dāng)前日期,
返回一個(gè)默認(rèn)用當(dāng)前的語(yǔ)言環(huán)境和時(shí)區(qū)初始化的
GregorianCalendar對(duì)象*/  

創(chuàng)建一個(gè)指定日期的Calendar對(duì)象
使用Calendar類代表特定的時(shí)間,需要首先創(chuàng)建一個(gè)Calendar的對(duì)象擂橘,然后再設(shè)定該對(duì)象中的年月日參數(shù)來(lái)完成晌区。

//創(chuàng)建一個(gè)代表2009年6月12日的Calendar對(duì)象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);

Calendar類對(duì)象字段類型
Calendar類中用以下這些常量表示不同的意義,jdk內(nèi)的很多類其實(shí)都是采用的這種思想

Calendar類常量.png

Calendar類對(duì)象信息的設(shè)置
Set設(shè)置
如:

Calendar c1 = Calendar.getInstance();

調(diào)用:

public final void set(int year,int month,int date)
c1.set(2009, 6 - 1, 12);
/*把Calendar對(duì)象c1的年月日分別設(shè)這為:2009贝室、6契讲、12,
注意月份是從0開(kāi)始的!*/

利用字段類型設(shè)置
如果只設(shè)定某個(gè)字段滑频,例如日期的值,則可以使用如下set方法:

public void set(int field,int value)

把 c1對(duì)象代表的日期設(shè)置為10號(hào)唤冈,其它所有的數(shù)值會(huì)被重新計(jì)算

c1.set(Calendar.DATE,10);  

把c1對(duì)象代表的年份設(shè)置為2008年峡迷,其他的所有數(shù)值會(huì)被重新計(jì)算

c1.set(Calendar.YEAR,2008);

其他字段屬性set的意義以此類推

Add設(shè)置

Calendar c1 = Calendar.getInstance();

把c1對(duì)象的日期加上10,也就是c1也就表示為10天后的日期你虹,其它所有的數(shù)值會(huì)被重新計(jì)算

c1.add(Calendar.DATE, 10);

把c1對(duì)象的日期減去10绘搞,也就是c1也就表示為10天前的日期,其它所有的數(shù)值會(huì)被重新計(jì)算

c1.add(Calendar.DATE, -10);

其他字段屬性的add的意義以此類推

Calendar類對(duì)象信息的獲得

Calendar c1 = Calendar.getInstance();
// 獲得年份
int year = c1.get(Calendar.YEAR);
// 獲得月份
int month = c1.get(Calendar.MONTH) + 1;
// 獲得日期
int date = c1.get(Calendar.DATE);
// 獲得小時(shí)
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 獲得分鐘
int minute = c1.get(Calendar.MINUTE);
// 獲得秒
int second = c1.get(Calendar.SECOND);
/* 獲得星期幾(注意(這個(gè)與Date類是不同的):
1代表星期日傅物、2代表星期1夯辖、3代表星期二,以此類推)*/
int day = c1.get(Calendar.DAY_OF_WEEK);
7.GregorianCalendar類

Calendar類實(shí)現(xiàn)了公歷日歷董饰,GregorianCalendar是Calendar類的一個(gè)具體實(shí)現(xiàn)蒿褂。
Calendar 的getInstance()方法返回一個(gè)默認(rèn)用當(dāng)前的語(yǔ)言環(huán)境和時(shí)區(qū)初始化的GregorianCalendar對(duì)象。GregorianCalendar定義了兩個(gè)字段:AD和BC卒暂。這是代表公歷定義的兩個(gè)時(shí)代啄栓。

下面列出GregorianCalendar對(duì)象的幾個(gè)構(gòu)造方法:

GregorianCalendar構(gòu)造方法.png

這里是 GregorianCalendar 類提供的一些有用的方法列表:


GregorianCalendar方法1.png
GregorianCalendar方法2.png
GregorianCalendar方法3.png

實(shí)例

import java.util.*;
  
public class GregorianCalendarDemo {
 
   public static void main(String args[]) {
      String months[] = {
      "Jan", "Feb", "Mar", "Apr",
      "May", "Jun", "Jul", "Aug",
      "Sep", "Oct", "Nov", "Dec"};
      
      int year;
      // 初始化 Gregorian 日歷
      // 使用當(dāng)前時(shí)間和日期
      // 默認(rèn)為本地時(shí)間和時(shí)區(qū)
      GregorianCalendar gcalendar = new GregorianCalendar();
      // 顯示當(dāng)前時(shí)間和日期的信息
      System.out.print("Date: ");
      System.out.print(months[gcalendar.get(Calendar.MONTH)]);
      System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
      System.out.println(year = gcalendar.get(Calendar.YEAR));
      System.out.print("Time: ");
      System.out.print(gcalendar.get(Calendar.HOUR) + ":");
      System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
      System.out.println(gcalendar.get(Calendar.SECOND));
      
      // 測(cè)試當(dāng)前年份是否為閏年
      if(gcalendar.isLeapYear(year)) {
         System.out.println("當(dāng)前年份是閏年");
      }
      else {
         System.out.println("當(dāng)前年份不是閏年");
      }
   }
}

運(yùn)行結(jié)果如下:
Date: Apr 22 2009
Time: 11:25:27
當(dāng)前年份不是閏年

Random類

Java 實(shí)用工具類庫(kù)中的類 java.util.Random 提供了產(chǎn)生各種類型隨機(jī)數(shù)的方法。它可以產(chǎn)生 int也祠、long昙楚、float、double 以及 Gaussian 等類型的隨機(jī)數(shù)诈嘿。這也是它與 java.lang.Math 中的方法 Random() 最大的不同之處堪旧,后者只產(chǎn)生 double 型的隨機(jī)數(shù)削葱。
1、構(gòu)造方法

Random構(gòu)造方法.png

2淳梦、常見(jiàn)方法

//該方法是設(shè)定基值seed
public synchronized void setSeed(long seed)

//該方法是產(chǎn)生一個(gè)整型隨機(jī)數(shù) 
public int nextInt()

//該方法是產(chǎn)生一個(gè)long型隨機(jī)數(shù)
public long nextLong()

//該方法是產(chǎn)生一個(gè)Float型隨機(jī)數(shù)
public float nextFloat()
 
//該方法是產(chǎn)生一個(gè)Double型隨機(jī)數(shù)
public double nextDouble()

//該方法是產(chǎn)生一個(gè)double型的Gaussian隨機(jī)數(shù)
public synchronized double nextGaussian()

/*synchronized 是 Java 語(yǔ)言的關(guān)鍵字析砸,當(dāng)它用來(lái)修飾
一個(gè)方法或者一個(gè)代碼塊的時(shí)候,能夠保證在同一時(shí)刻最
多只有一個(gè)線程執(zhí)行該段代碼*/

Scanner類

詳見(jiàn)Java學(xué)習(xí)總結(jié)之Java基本程序設(shè)計(jì)結(jié)構(gòu)

Arrays類

詳見(jiàn)Java學(xué)習(xí)總結(jié)之Java基本程序設(shè)計(jì)結(jié)構(gòu)

集合框架

詳見(jiàn)Java學(xué)習(xí)總結(jié)之集合

java.util.concurrent包

java.io包

詳見(jiàn)Java學(xué)習(xí)總結(jié)之Java IO系統(tǒng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谭跨,一起剝皮案震驚了整個(gè)濱河市干厚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌螃宙,老刑警劉巖蛮瞄,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谆扎,居然都是意外死亡挂捅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門堂湖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)闲先,“玉大人,你說(shuō)我怎么就攤上這事无蜂∷趴罚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵斥季,是天一觀的道長(zhǎng)训桶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)酣倾,這世上最難降的妖魔是什么舵揭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮躁锡,結(jié)果婚禮上午绳,老公的妹妹穿的比我還像新娘。我一直安慰自己映之,他們只是感情好耀销,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布击儡。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪禀苦。 梳的紋絲不亂的頭發(fā)上怎囚,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天事秀,我揣著相機(jī)與錄音读慎,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妓笙,可吹牛的內(nèi)容都是我干的若河。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寞宫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼萧福!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起辈赋,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鲫忍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后钥屈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體悟民,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年篷就,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了射亏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竭业,死狀恐怖智润,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情未辆,我是刑警寧澤窟绷,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站咐柜,受9級(jí)特大地震影響钾麸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炕桨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肯腕。 院中可真熱鬧献宫,春花似錦、人聲如沸实撒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)知态。三九已至捷兰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間负敏,已是汗流浹背贡茅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顶考。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓赁还,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驹沿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子艘策,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容