最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

String兩種實(shí)例化方式

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

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

第一種方法:

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

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

第二種方法:

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

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

String實(shí)例化的時(shí)機(jī)

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

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

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

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

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

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

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

static final修飾的字符串好嗎?

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

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

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

  最后看static修飾符:

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

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

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

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

代碼測(cè)試

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
  }

}

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

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

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

相關(guān)文章

  • 關(guān)于MapStruct的使用教程

    關(guān)于MapStruct的使用教程

    MapStruct 是一個(gè)用于 Java Bean 映射的代碼生成器,通過(guò)注解處理器自動(dòng)生成映射代碼,以下是 MapStruct 的基本使用方法:添加依賴、定義映射接口、使用映射方法、定義自定義映射方法、處理復(fù)雜映射、集成 Spring 等
    2025-02-02
  • java中設(shè)計(jì)模式(多例)的實(shí)例詳解

    java中設(shè)計(jì)模式(多例)的實(shí)例詳解

    這篇文章主要介紹了java中設(shè)計(jì)模式(多例)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java中數(shù)組的多種定義方式總結(jié)

    Java中數(shù)組的多種定義方式總結(jié)

    在?Java?編程語(yǔ)言中,數(shù)組是一種核心且基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)具有相同類型的多個(gè)元素,本文將深入探討?Java?中數(shù)組定義的多種方式,希望對(duì)大家有所幫助
    2024-11-11
  • Java通用Mapper UUID簡(jiǎn)單示例

    Java通用Mapper UUID簡(jiǎn)單示例

    今天小編就為大家分享一篇關(guān)于Java通用Mapper UUID簡(jiǎn)單示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • springmvc之獲取參數(shù)的方法(必看)

    springmvc之獲取參數(shù)的方法(必看)

    下面小編就為大家?guī)?lái)一篇springmvc之獲取參數(shù)的方法(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Spring加載properties文件的方法

    Spring加載properties文件的方法

    這篇文章主要為大家詳細(xì)介紹了Spring加載properties文件的兩種方法,一是通過(guò)xml方式,另一種方式是通過(guò)注解方式,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 關(guān)于mybatis3中@SelectProvider的使用問(wèn)題

    關(guān)于mybatis3中@SelectProvider的使用問(wèn)題

    這篇文章主要介紹了mybatis3中@SelectProvider的使用技巧,@SelectProvide指定一個(gè)Class及其方法,并且通過(guò)調(diào)用Class上的這個(gè)方法來(lái)獲得sql語(yǔ)句,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-12-12
  • Java 二分查找的實(shí)現(xiàn)及圖例解析

    Java 二分查找的實(shí)現(xiàn)及圖例解析

    這篇文章主要介紹了Java 二分查找的實(shí)現(xiàn),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • Spring Cloud Alibaba 本地調(diào)試介紹及方案設(shè)計(jì)

    Spring Cloud Alibaba 本地調(diào)試介紹及方案設(shè)計(jì)

    為了解決 本地調(diào)試 的問(wèn)題,本文實(shí)現(xiàn)了一種簡(jiǎn)單實(shí)用的策略,可以通過(guò) Nacos 動(dòng)態(tài)配置服務(wù)路由,還可以基于用戶,部門,組織等級(jí)別配置服務(wù)路由,實(shí)現(xiàn) 本地調(diào)試 的同時(shí),實(shí)際上也實(shí)現(xiàn) 灰度發(fā)布,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • 深入理解Java IO的flush

    深入理解Java IO的flush

    本篇文章是小編總結(jié)的關(guān)于Java IO的flush的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友可以跟著學(xué)習(xí)下。
    2018-06-06

最新評(píng)論

黔东| 广水市| 通州区| 砚山县| 武陟县| 东乌| 新沂市| 抚顺市| 孟连| 和林格尔县| 扎兰屯市| 绥中县| 阿拉善盟| 银川市| 延吉市| 微山县| 莱阳市| 呼玛县| 思茅市| 芜湖县| 兴和县| 大宁县| 德格县| 怀柔区| 南乐县| 威信县| 龙州县| 山阴县| 竹山县| 延川县| 沅陵县| 沁源县| 昌乐县| 内江市| 周至县| 新野县| 舞钢市| 宜兰市| 南昌县| 墨竹工卡县| 连州市|