Java知識總結(jié)(二)

1.String類

1.1源碼:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence{
    /** The value is used for character storage. */    
    private final char value[];    
    /** Cache the hash code for the string */
    private int hash; // Default to 0
    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
    ....
}

通過源碼可以我們可以得到以下信息:

  • String類被final關(guān)鍵字修飾,說明此類不能被繼承

  • String類實現(xiàn)了Serializable接口,說明String類可以進行序列化和反序列化

  • String類實現(xiàn)了Comparable接口,Comparable<T>接口只有一個方法 public int compareTo(T o),實現(xiàn)了這個接口就意味著該類支持排序, 即可用 Collections.sort 或 Arrays.sort 等方法對該類的對象列表或數(shù)組進行排序。

  • String類內(nèi)部定義了一個私有的char型數(shù)組,并且使用了final進行修飾。這是String類對象不可變的真正原因。

1.2 創(chuàng)建String對象的方式

在日常開發(fā)中,創(chuàng)建String對象通常有兩種:

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

不過這兩種創(chuàng)建對象的方式,內(nèi)部實現(xiàn)還是有很大不同的


內(nèi)存模型.png

1.String s1 = new String("hh");這種方式創(chuàng)建的對象在編譯時期,“hh”被編譯到.class文件中的Constant pool(常量池)中;類加載時期,判斷字符串常量池是否存在“hh”,此時不存在,則從常量池取出“hh”存入字符串常量池。運行時期,在棧中創(chuàng)建s1引用,在堆中創(chuàng)建對象,對象內(nèi)容為“hh”,s1指向堆中的地址1。
2.String s3 = "hh";這種方式創(chuàng)建的對象在編譯時期,對象會被編譯到.class文件中的常量池中;類加載時期,判斷字符串常量池是否存在“hh”,此時存在,則不存入字符串常量池。運行時期,在棧中創(chuàng)建s3引用,s3指向字符串常量池中的“hh”。

由此我們可以看出,通過關(guān)鍵字new創(chuàng)建的對象,會把對象的地址放入堆中,對象的引用指向堆中的地址;而通過直接“賦值”的方式創(chuàng)建的String對象會直接放入常量池,對象的引用直接指向常量池,而下次通過相同的方式創(chuàng)建對象時,會判斷該對象是否已經(jīng)存在于常量池中,如果存在則直接指向常量池中對象的地址,如果沒有則新建,放入常量池中;

總結(jié):new String()與直接賦值都會在字符串放入常量池之前進行判斷,如果不存在則放入,如果存在則不放入。但是,new String()會在堆中多開辟一塊空間存儲字符串的值。因此,我們在賦值過程中應(yīng)多使用直接賦值。

1.3 intern方法

intern() 方法返回字符串對象的規(guī)范化表示形式。
這個方法會首先檢查字符串池中是否有這個字符串,如果存在則返回這個字符串的引用,否則就將這個字符串添加到字符串池中,然會返回這個字符串的引用。即不會在堆中創(chuàng)建對象。
它遵循以下規(guī)則:對于任意兩個字符串 a 和b,當且僅當 a.equals(b) 為 true 時,a.intern() == b.intern() 才為 true。

String a = new String("ab");
String b = new String("ab");
String c = "ab";
String d = "a" + "b";
String e = "b";
String f = "a" + e;

System.out.println(b.intern() == a);//false
System.out.println(b.intern() == c);//true
System.out.println(b.intern() == d);//true
System.out.println(b.intern() == f);//false
System.out.println(b.intern() == a.intern());//true

1.b.intern() == a;
b.intern()引用指向常量池中的引用,a引用指向堆中的引用,因此為false。
2.b.intern() == c;
b.intern()引用指向常量池中的引用,c引用指向常量池中的引用,因此為true。
3.b.intern() == d;
b.intern()引用指向常量池中的引用,d在編譯期間會將“a”+“b”編譯為“ab”,因此與d與c相同,因此為true。
4.b.intern() == f;
b.intern()引用指向常量池中的引用,f為帶有變量的操作,因此在編譯期間不能存入常量池中,f的引用不指向常量池,因此為false。
5.b.intern() == a.intern();
b.intern()引用指向常量池中的引用,a.intern()引用指向常量池中的引用,因此為true。

1.4常用方法

length() 返回字符串長度

isEmpty() 返回字符串是否為空

charAt(int index) 返回字符串中第(index+1)個字符

char[] toCharArray() 轉(zhuǎn)化成字符數(shù)組

trim() 去掉兩端空格

toUpperCase() 轉(zhuǎn)化為大寫

toLowerCase() 轉(zhuǎn)化為小寫

String concat(String str) //拼接字符串

String replace(char oldChar, char newChar) //將字符串中的oldChar字符換成newChar字符

//以上兩個方法都使用了String(char[] value, boolean share);

boolean matches(String regex) //判斷字符串是否匹配給定的regex正則表達式

boolean contains(CharSequence s) //判斷字符串是否包含字符序列s

String[] split(String regex, int limit) 按照字符regex將字符串分成limit份。

String[] split(String regex)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從網(wǎng)上復(fù)制的,看別人的比較全面,自己搬過來,方便以后查找。原鏈接:https://www.cnblogs.com/...
    lxtyp閱讀 1,436評論 0 9
  • 前言 RTFSC (Read the fucking source code )才是生活中最重要的。我們天天就是要...
    二毛_coder閱讀 524評論 1 1
  • 1.類加載子系統(tǒng)負責從文件系統(tǒng)或者網(wǎng)絡(luò)中加載class信息,加載的信息存放在一塊稱之為方法區(qū)的內(nèi)存空間。 2.方法...
    Y了個J閱讀 554評論 3 1
  • 注:都是在百度搜索整理的答案,如有侵權(quán)和錯誤,希告知更改。 一、哪些情況下的對象會被垃圾回收機制處理掉 ?當對象對...
    Jenchar閱讀 3,309評論 3 2
  • String類 先看一下源碼(jdk1.8.0_144)中的對于類的定義 首先可以看到String類是被final...
    efan閱讀 670評論 1 1

友情鏈接更多精彩內(nèi)容