国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

String 和常量池

vspiders / 3632人閱讀

摘要:方法就是擴(kuò)充常量池的一個(gè)方法當(dāng)一個(gè)實(shí)例調(diào)用方法時(shí),會查找當(dāng)前常量池中是否已有相同的字符串常量,如果有就返回其引用,如果沒有就在常量池中添加對應(yīng)的字符串,并返回對應(yīng)字符串常量的引用。

常量池:在編譯被確定,并保存在.class文件中的一些數(shù)據(jù)。jvm為每個(gè)類維護(hù)一個(gè)常量池,常量池就是該類型所用到的常量的一個(gè)有序集合。在程序執(zhí)行的時(shí)候,常量池存儲在方法區(qū)中。存在于.class文件中的常量池,在運(yùn)行期被jvm裝載,并且可以擴(kuò)充。

String.intern()方法就是擴(kuò)充常量池的一個(gè)方法
當(dāng)一個(gè)string實(shí)例調(diào)用intern方法時(shí),會查找當(dāng)前常量池中是否已有相同的字符串常量,如果有就返回其引用,如果沒有就在常量池中添加對應(yīng)的字符串,并返回對應(yīng)字符串常量的引用。

    String str0 = "hello world!";
    String str1 = new String("hello world!");
    String str2 = "hello" + " world!";    //可確定字符串常量池中有3個(gè)string字符串常量 "hello" "world!" "hello world!"
    Stirng str3 = "hello" + new String("world!"); //常量池1(hello) + 堆2(world + hello world),這是由于String的不可變性所致
    System.out.println(str0 == str1);    //false
    System.out.println(str0 == str2);    //true
    System.out.println(str0 == str3);    //false
    
    str1.intern();
    str11 = str1.intern();    //常量池中存在該常量,直接返回其引用
    System.out.println(str1 == str11);    //false str1在堆中,str11在常量池中
    System.out.println(str0 == str11);    //true

補(bǔ)充:String的不可變性

//String的實(shí)例一旦生成就不會再改變,比如
String str = "he" + "is" + "string";

其中有5個(gè)字符串常量:"he", "is", "string", "heis", "heisstring"
因?yàn)镾tirng 的不可變性產(chǎn)生了很多的臨時(shí)變量,所以這種情況一般使用StringBuffer或者StringBuider。

jvm優(yōu)化
jvm會對“+”號連接的字符串常量優(yōu)化為連接后的值

String str1 = "aaa";
String str2 = "bbb";
String str3 = "aaabbb";
String str4 = "aaa" + "bbb";
String str5 = "aaa" + str2;
System.out.println(str3 == str4);    //true
System.out.println(str3 == str5);    //false

對于str5,由于字符串的連接有引用存在,而引用的值在編譯期是無法確定的,只有在程序運(yùn)行的時(shí)候動(dòng)態(tài)分配并將其連接后的新引用返回,其實(shí),str3指向常量池,而str5指向堆,所以 str3 == str5 為false

String ab1 = "aaabbb";
final String b = "bbb";
String ab2 = "aaa" + b;
System.out.println(ab1 == ab2);    //true

final修飾string就可以確保此時(shí)b的值不能被改變,所以jvm也可以對其進(jìn)行優(yōu)化。所以歸納一句話為:當(dāng)String連接符兩邊是不能被改變的,那在編譯時(shí)jvm就可以進(jìn)行優(yōu)化。final使得b只能指向“bbb”,而“bbb”又是在常量區(qū)中(常量區(qū)中的常量不能被改變),所以b是不能被改變的,如果上例去掉final,那么b就可以指向其他的地方,表明b是可以被改變的,所以jvm在編譯時(shí)不進(jìn)行優(yōu)化。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64760.html

相關(guān)文章

  • 聊一聊讓我蒙蔽一晚上的各種常量

    摘要:注意運(yùn)行時(shí)常量池存在于方法區(qū)中。一個(gè)在堆中,一個(gè)在字符串常量池中。注意,是把這個(gè)對象添加到字符串常量池。內(nèi)存中有一個(gè)基本類型封裝類的常量池。需要注意的是,和這兩個(gè)類并沒有對應(yīng)的常量池。 在寫之前我們先來看幾個(gè)問題,假如你對這些問題已經(jīng)很懂了的話,那大可不用看這篇文章,如果不大懂的話,那么可以看看我的想法。 問題1: public static void main(String[] ar...

    Tamic 評論0 收藏0
  • String:字符串常量

    作為最基礎(chǔ)的引用數(shù)據(jù)類型,Java 設(shè)計(jì)者為 String 提供了字符串常量池以提高其性能,那么字符串常量池的具體原理是什么,我們帶著以下三個(gè)問題,去理解字符串常量池: 字符串常量池的設(shè)計(jì)意圖是什么? 字符串常量池在哪里? 如何操作字符串常量池? 字符串常量池的設(shè)計(jì)思想 字符串的分配,和其他的對象分配一樣,耗費(fèi)高昂的時(shí)間與空間代價(jià),作為最基礎(chǔ)的數(shù)據(jù)類型,大量頻繁的創(chuàng)建字符串,極大程度地影響程...

    lidashuang 評論0 收藏0
  • 方法區(qū)到底是個(gè)什么鬼

    摘要:那方法區(qū)里都存著什么呢先拋結(jié)論靜態(tài)變量常量類信息構(gòu)造方法接口定義運(yùn)行時(shí)常量池存在方法區(qū)中。動(dòng)態(tài)常量池運(yùn)行時(shí)常量池是方法區(qū)的一部分,是一塊內(nèi)存區(qū)域。文件常量池將在類加載后進(jìn)入方法區(qū)的運(yùn)行時(shí)常量池中存放。 一、方法區(qū)與永久代 這兩個(gè)是非常容易混淆的概念,永久代的對象放在方法區(qū)中,就會想當(dāng)然地認(rèn)為,方法區(qū)就等同于持久代的內(nèi)存區(qū)域。事實(shí)上兩者是這樣的關(guān)系: 《Java虛擬機(jī)規(guī)范》只是規(guī)定了有方...

    binaryTree 評論0 收藏0
  • 我終于搞清楚了String有關(guān)的那點(diǎn)事兒。

    摘要:為了減少在中創(chuàng)建的字符串的數(shù)量,字符串類維護(hù)了一個(gè)字符串常量池。但是當(dāng)執(zhí)行了方法后,將指向字符串常量池中的那個(gè)字符串常量。由于和都是字符串常量池中的字面量的引用,所以。究其原因,是因?yàn)槌A砍匾4娴氖且汛_定的字面量值。 String,是Java中除了基本數(shù)據(jù)類型以外,最為重要的一個(gè)類型了。很多人會認(rèn)為他比較簡單。但是和String有關(guān)的面試題有很多,下面我隨便找兩道面試題,看看你能不能...

    paulli3 評論0 收藏0
  • java 為什么需要常量

    摘要:常量池探秘每個(gè)文件編譯為文件后,都將產(chǎn)生當(dāng)前類獨(dú)有的常量池,我們稱之為靜態(tài)常量池。文件中的常量池包含兩部分字面值和符號引用。方法的調(diào)用成員變量的訪問最終都是通過運(yùn)行時(shí)常量池來查找具體地址的。其中,表示將一個(gè)常量加載到操作數(shù)棧。 java中講的常量池,通常指的是運(yùn)行時(shí)常量池,它是方法區(qū)的一部分,一個(gè)jvm實(shí)例只有一個(gè)運(yùn)行常量池,各線程間共享該運(yùn)行常量池。 java內(nèi)存模型中將內(nèi)存分為堆和...

    Yuanf 評論0 收藏0

發(fā)表評論

0條評論

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