成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java String類筆記

Vicky / 1349人閱讀

摘要:這兩個(gè)操作符都是編譯器默認(rèn)引入了類,最后都調(diào)用方法返回對(duì)象,臨時(shí)對(duì)象被回收,因此效率極為低下

Java String類筆記 聲明

文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處https://segmentfault.com/u/yzwall

String的不可變性 String的不可變性
// String declaration
public final class String
    implements java.io.Serializable, Comparable, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
    ...
}

public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}

String類字符串存儲(chǔ)方式:值使用final char value[]類型的字符數(shù)組存儲(chǔ),因此一旦賦值不可改變;

String類存儲(chǔ)字符串,使用Array.copyof方法value[]賦值,并開辟內(nèi)存空間;

String類不可繼承:使用final修飾符,表示String類不可繼承;

String類提供的所有方法中,有返回String的一律新建一個(gè)String對(duì)象,防止對(duì)原String對(duì)象進(jìn)行修改;

String對(duì)象創(chuàng)建

字符串常量池:位于常量池中,由String類私有維護(hù),池中元素都是String對(duì)象,每個(gè)String對(duì)象的字面值是唯一的,由GC回收;
String常量對(duì)象創(chuàng)建場(chǎng)合:當(dāng)String對(duì)象第一次常量賦值和調(diào)用String對(duì)象調(diào)用intern()方法時(shí),常量池中創(chuàng)建對(duì)應(yīng)String常量對(duì)象;

String str1 = "abc";
String str2 = "abc";
String str3 = str1;
String str4 = new String("abcd");
String str5 = new String("abc");

String對(duì)象創(chuàng)建,分為直接常量賦值與new運(yùn)算符創(chuàng)建,創(chuàng)建String新對(duì)象時(shí)創(chuàng)建1個(gè)或2個(gè)String對(duì)象;

直接字符串常量賦值

創(chuàng)建對(duì)象時(shí),在編譯階段,編譯器先去字符串常量池檢查是否有String常量對(duì)象擁有字面值"abc",

存在/str2:在棧中創(chuàng)建引用,指向常量池中的Strng常量對(duì)象(字面值為"abc");

不存在/str1:在常量池中創(chuàng)建匿名Strng對(duì)象(字面值為"abc"),在棧中創(chuàng)建引用,指向String常量對(duì)象;

使用new運(yùn)算符創(chuàng)建

創(chuàng)建對(duì)象時(shí),程序先去字符串常量池檢查是否有String對(duì)象擁有字面值"abc",

存在/str5:在棧中創(chuàng)建對(duì)象引用,在堆區(qū)為實(shí)例分配內(nèi)存,但是字符數(shù)組value字段保存常量對(duì)象(常量池中)的value字段的引用;

不存在/str4:在棧中創(chuàng)建對(duì)象引用,在堆區(qū)為實(shí)例分配內(nèi)存,在常量池中創(chuàng)建String常量對(duì)象,字符數(shù)組value字段保存常量對(duì)象(常量池中)的value字段的引用;

String類的intern()方法
String str6 = new String("abc");
String a = str6.intern();
String str7 = "xyz";
String b = str7.intern();

str.intern()首先檢查常量池中的String常量對(duì)象字面值是否有與str.value相等的,若有直接返回對(duì)應(yīng)String常量對(duì)象的引用,否則在常量池中創(chuàng)建字面值為str.value的String常量對(duì)象并返回引用;

String類判等:equals方法和等號(hào)運(yùn)算符:
String str1 = "abc";
String str2 = str1;
String str3 = new String("abc");
String str4 = str3;
String str5 = new String("abc");

// String equals只用于判斷字面值是否相同,以下結(jié)果均為true
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
System.out.println(str3.equals(str4));
System.out.println(str3.equals(str5));

// false,str1與str3引用不同對(duì)象
System.out.println(str1 == str3);
// false,str3與str5引用不同對(duì)象
System.out.println(str3 == str5;

equals()方法檢測(cè)兩個(gè)字符串變量/常量是否相等;

==運(yùn)算符判斷兩個(gè)String對(duì)象的引用地址是否相同,即判斷引用變量引用指向同一個(gè)對(duì)象;

String:空串與null

空串""是長(zhǎng)度為0的字符串,用if(str.length() == 0)if(str.equals(""))判斷;

null表示String對(duì)象為空,用if(str == null)判斷;

String、StringBuilder,StringBuffer辨析 三者可變性與線程安全辨析

String類由于對(duì)象不可變,線程安全 【異】

StringBuilder與StringBuffer都繼承AbstractStringBuilder類,字面值char[] value均可變【同】;

StringBuffer中主要方法用synchronized加了同步鎖,因此線程安全【異】;

StringBuilder方法沒有加同步鎖,因此線程不安全,但在非多線程場(chǎng)景下,效率高于StringBuilder【異】;

三者適用場(chǎng)景【異】:

使用String類:適用于字符串不頻繁變化的場(chǎng)景,比如常量生命,少量變量運(yùn)算;

使用StringBuilder類:適用于單線程環(huán)境下字符串頻繁變化的場(chǎng)景;

使用StringBuffer類:適用于多線程環(huán)境下字符串頻繁變化的場(chǎng)景;

String類重寫了equals()方法和hashCode()方法,StringBuilder和StrngBuffer沒有,因此將后兩者對(duì)象存儲(chǔ)Java集合類中會(huì)出現(xiàn)問題;

String對(duì)象"+/+="本質(zhì)

在進(jìn)行連接操作(“+”和 “+=”)時(shí),String每次返回一個(gè)新的String實(shí)例,而StringBuffer/StringBuilder的append()直接返回this;

String類“+”和 “+=”操作符是Java中唯一重載的兩個(gè)操作符。這兩個(gè)操作符都是編譯器默認(rèn)引入了StringBuilder類,最后都調(diào)用toString()方法返回String對(duì)象,StringBuilder臨時(shí)對(duì)象被GC回收,因此效率極為低下;

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66995.html

相關(guān)文章

  • Java learn 03 常用 & 容器 (待補(bǔ)充筆記)

    摘要:容器的類圖如下圖所示接口定義了存取一組對(duì)象的方法其子接口和分別定義了存儲(chǔ)方式。中的數(shù)據(jù)對(duì)象沒有順序且不可以重復(fù)。注意相等的對(duì)象應(yīng)該具有相等的 Chap 6 常用類 focus on : 字符串相關(guān)類 (String, StringBuffer) 基本數(shù)據(jù)類型包裝類 Math類 File類 枚舉類 6.1 字符串相關(guān)類 String 類 -- java.lang.String 類...

    bladefury 評(píng)論0 收藏0
  • Java學(xué)習(xí)筆記3-Number,String,StringBuilder

    摘要:創(chuàng)建字符串教程字符串長(zhǎng)度用于獲取有關(guān)對(duì)象的信息的方法稱為訪問器方法。類在中被提出,它和之間的最大不同在于的方法不是線程安全的不能同步訪問。然而在應(yīng)用程序要求線程安全的情況下,則必須使用類。 一般地,當(dāng)需要使用數(shù)字的時(shí)候,我們通常使用內(nèi)置數(shù)據(jù)類型,如:byte、int、long、double 等。 在實(shí)際開發(fā)過程中,我們經(jīng)常會(huì)遇到需要使用對(duì)象,而不是內(nèi)置數(shù)據(jù)類型的情形。為了解決這個(gè)問題,...

    pkhope 評(píng)論0 收藏0
  • Java筆記-Java反射(二)

    摘要:構(gòu)造器創(chuàng)建實(shí)例構(gòu)造器和方法的反射類不同點(diǎn)在于,可以創(chuàng)建實(shí)例,代碼如下所示。 上一篇文章介紹了反射的基本概念以及獲取類相關(guān)信息的反射API,這一章節(jié)主要記錄如何對(duì)類的成員進(jìn)行操作的相關(guān)反射API。 操作類成員的類 反射API中提供了如下接口,用于對(duì)類的成員進(jìn)行操作。 java.lang.reflect.Member 該接口主要有以下三個(gè)實(shí)現(xiàn)類,用于對(duì)類成員中的字段,方法和構(gòu)造器進(jìn)行操作...

    luckyw 評(píng)論0 收藏0
  • java學(xué)習(xí)筆記

    static語句塊 static{}(即static塊),會(huì)在類被加載的時(shí)候執(zhí)行且僅會(huì)被執(zhí)行一次,一般用來初始化靜態(tài)變量和調(diào)用靜態(tài)方法. 在程序的執(zhí)行過程中,static{}語句塊中的內(nèi)容只被執(zhí)行一次 執(zhí)行時(shí)機(jī) static{}會(huì)在類被加載的時(shí)候執(zhí)行, 具體一點(diǎn)來說: 用Class.forName()加載的時(shí)候 實(shí)例化一個(gè)類的時(shí)候 調(diào)用類的靜態(tài)方法的時(shí)候 調(diào)用類的靜態(tài)變量的時(shí)候 注意一是調(diào)用類...

    or0fun 評(píng)論0 收藏0
  • 反射機(jī)制與原理筆記

    反射機(jī)制與原理筆記 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處https://segmentfault.com/u/yzwall 反射機(jī)制 反射:當(dāng)程序無法獲知對(duì)象類型時(shí),在運(yùn)行期間動(dòng)態(tài)獲取類的所有屬性和方法,這種動(dòng)態(tài)獲取類信息和動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為反射機(jī)制;反射機(jī)制實(shí)現(xiàn):Class類與java.lang.reflect類庫一起實(shí)現(xiàn)機(jī)制,java.lang.reflect類庫包含F(xiàn)ield...

    fobnn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<