欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

String實例化及static final修飾符實現(xiàn)方法解析

 更新時間:2020年09月29日 14:44:28   作者:賈樹丙  
這篇文章主要介紹了String實例化及static final修飾符實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

String兩種實例化方式

一種是通過雙引號直接賦值的方式,另外一種是使用標(biāo)準(zhǔn)的new調(diào)用構(gòu)造方法完成實例化。如下:

  String str = "abcd";
  String str = new String("1234);

第一種方法:

  使用直接賦值后,只要是以后聲明的字符串內(nèi)容相同,則不會再開辟新的內(nèi)存空間。對于String的以上操作,在java中稱為共享設(shè)計。這種設(shè)計思路是,在java中形成一個字符串對象池,在這個字符串對象中保存多個字符串對象,新實例化的對象如果已經(jīng)在池中定義了,則不再重新定義,而從池中直接取出繼續(xù)使用。String就是因為采用了這樣的設(shè)計,所以當(dāng)內(nèi)容重復(fù)時,會將對象指向已存在的實例空間。

  一個雙引號包含字符串就是一個String類的匿名對象,但是這種方式使用String不一定創(chuàng)建新對象。在執(zhí)行到這個字符串的語句時,如String a = "123",JVM會先到常量池里查找,如果有的話返回常量池里的這個實例的引用,否則的話創(chuàng)建一個新實例并置入常量池里。

第二種方法:

  使用new關(guān)鍵字,不管如何都會再開辟一個新的空間。

  new創(chuàng)建字符串時首先查看池中是否有相同值的字符串,如果有,則拷貝一份到堆中,然后返回堆中的地址;如果池中沒有,則在堆中創(chuàng)建一份,然后返回堆中的地址(注意,此時不需要從堆中復(fù)制到池中,否則,將使得堆中的字符串永遠(yuǎn)是池中的子集,導(dǎo)致浪費池的空間)!

String實例化的時機

(1)單獨使用""引號創(chuàng)建的字符串都是常量,編譯期就已經(jīng)確定存儲到String Pool中;

(2)使用new String("")創(chuàng)建的對象會存儲到堆區(qū)(heap)中,是運行期新創(chuàng)建的;

(3)使用只包含常量的字符串連接符如"aa" + "aa"創(chuàng)建的也是常量,編譯期就能確定,已經(jīng)確定存儲到String Pool中;

(4)使用包含變量的字符串連接符如"aa" + s1創(chuàng)建的對象是運行期才創(chuàng)建的,存儲在堆區(qū)(heap)中;

  注意:上面第(3)句話,編譯后合并的字符串會保存在JVM的字符串池中,而不是再生成的class文件中把字符串合并。
  String s = "a" + "b" + "c"; 創(chuàng)建的是一個對象,而不是是四個對象,在字符串常量池中只生成一個字符串對象

字符串池的優(yōu)缺點

  字符串池的優(yōu)點就是避免了相同內(nèi)容的字符串的創(chuàng)建,節(jié)省了內(nèi)存,省去了創(chuàng)建相同字符串的時間,同時提升了性能;另一方面,字符串池的缺點就是犧牲了JVM在常量池中遍歷對象所需要的時間,不過其時間成本相比而言比較低。

static final修飾的字符串好嗎?

工作后發(fā)現(xiàn),大型的項目里,常常會見到定義字符串使用 private static final String = "abc" 的方式。這種方式有好處嗎?

  首先使用直接賦值的字串的方式,字符串會在編譯期生成在字符串池中。

  然后final標(biāo)記的變量(成員變量或局部變量)即成為常量,只能賦值一次。它應(yīng)該不影響內(nèi)存的分配。(查看資料多了,說法不一,在下對此也有點懷疑了,如果final影響內(nèi)存分配,煩請各位大俠告知)

  最后看static修飾符:

static修飾符能夠與屬性、方法和內(nèi)部類一起使用,表示靜態(tài)的。類中的靜態(tài)變量和靜態(tài)方法能夠與類名一起使用,不需要創(chuàng)建一個類的對象來訪問該類的靜態(tài)成員,所以,static修飾的變量又稱作“類變量”。

  “類變量”屬于類的成員,類的成員是被儲存在堆內(nèi)存里面的。一個類中,一個static變量只會有一個內(nèi)存空間,即使有多個類實例,但這些類實例中的這個static變量會共享同一個內(nèi)存空間。

  static修飾的String,會在堆內(nèi)存中復(fù)制一份常量池中的值。所以調(diào)用 static final String 變量,實際上是直接調(diào)用堆內(nèi)存的地址,不會遍歷字符串池中的對象,節(jié)省了遍歷時間。

所以使用static final修飾的字符串還是有好處的。

代碼測試

public class Test
{
  public static final String A="ab";
  public static final String B="cd";

  public static final String C;
  public static final String D;
  static{
    C = "ab";
    D = "cd";
  }
  public static void main(String[] args) {
    String t = "abcd";//指向池

    String s1 = "ab";//指向池
    String s2 = "cd";//指向池

    String s = s1+s2;//指向堆
    System.out.println(s==t);//false

    String ss = "ab"+s2;//指向堆
    System.out.println(ss==t);//false

    String sss = "ab"+"cd";//指向池
    System.out.println(sss==t);//true

    String ssss = A+B;//指向池
    System.out.println(ssss==t);//true

    System.out.println((C+D)==t);//false
  }

}

字符串對象可以存放在兩個地方,字符串池(pool)和堆,編譯期確定如何給一個引用變量賦值

  • String s="abc";這種形式?jīng)Q定將從pool中尋找內(nèi)容相同的字符串并返回地址給s,pool中沒有就會在pool中新建并返回地址給s
  • String s = new String("abc");這種形式?jīng)Q定運行期將在堆上新建字符串對象并返回給s,但這個對象不會加入到pool中
  • String s=s1+s2;s1和s2都是變量,這種形式?jīng)Q定將在堆上創(chuàng)建s1和s2(即便s1和s2指向的對象在池中已經(jīng)存在,也會將值拷貝到對象創(chuàng)建新對象),然后創(chuàng)建s1+s2并賦給s
  • String s = "ab"+"cd";同1),都是來自于池
  • String s = "ab"+s1;類似3)
  • String s = S1+S2;S1和S2是常量,常量只能賦值一次,S1,S2如果在聲明的地方就賦值,那么這個值在編譯期就是確定的,后面無法更改,S1+S2在執(zhí)行前可確定S1/S2已經(jīng)在池中存在,當(dāng)然在池中進(jìn)行,所以s指向pool;但是若S1,S2如果是實例常量在構(gòu)造器中賦值,或是類常量在靜態(tài)塊中賦值,S1+S2無法確定二者皆來自于池,于是在堆上進(jìn)行

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java調(diào)用IK分詞器進(jìn)行分詞方式,封裝工具類

    Java調(diào)用IK分詞器進(jìn)行分詞方式,封裝工具類

    這篇文章主要介紹了Java調(diào)用IK分詞器進(jìn)行分詞方式,封裝工具類,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Nacos作為配置中心注冊監(jiān)聽器方法

    Nacos作為配置中心注冊監(jiān)聽器方法

    本文主要討論Nacos作為配置中心時,其中配置內(nèi)容發(fā)生更改時,我們的應(yīng)用程序能夠做的事。一般使用監(jiān)聽器來實現(xiàn)這步操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • SpringBoot使用spring.config.import多種方式導(dǎo)入配置文件

    SpringBoot使用spring.config.import多種方式導(dǎo)入配置文件

    本文主要介紹了SpringBoot使用spring.config.import多種方式導(dǎo)入配置文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Java HashSet(散列集),HashMap(散列映射)的簡單介紹

    Java HashSet(散列集),HashMap(散列映射)的簡單介紹

    這篇文章主要介紹了Java HashSet(散列集),HashMap(散列映射)的簡單介紹,幫助大家更好的理解和學(xué)習(xí)Java集合框架的相關(guān)知識,感興趣的朋友可以了解下
    2021-01-01
  • Java使用FileReader讀取文件詳解

    Java使用FileReader讀取文件詳解

    本文將為大家介紹FileReader類的基本用法,包括如何創(chuàng)建FileReader對象,如何讀取文件,以及如何關(guān)閉流,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-09-09
  • Java Ehcache緩存框架入門級使用實例

    Java Ehcache緩存框架入門級使用實例

    這篇文章主要介紹了Java Ehcache緩存框架入門級使用實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • springboot接收http請求,解決參數(shù)中+號變成空格的問題

    springboot接收http請求,解決參數(shù)中+號變成空格的問題

    這篇文章主要介紹了springboot接收http請求,解決參數(shù)中+號變成空格的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解在Java程序中運用Redis緩存對象的方法

    詳解在Java程序中運用Redis緩存對象的方法

    這篇文章主要介紹了在Java程序中運用Redis緩存對象的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java面試題沖刺第四天--數(shù)據(jù)庫

    Java面試題沖刺第四天--數(shù)據(jù)庫

    這篇文章主要為大家分享了最有價值的三道數(shù)據(jù)庫面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 徹底搞懂Java多線程(三)

    徹底搞懂Java多線程(三)

    這篇文章主要給大家介紹了關(guān)于Java面試題之多線程和高并發(fā)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07

最新評論