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

Java String對象使用方法詳解

 更新時(shí)間:2017年04月26日 14:26:00   投稿:lqh  
這篇文章主要介紹了Java String對象使用方法詳解的相關(guān)資料,需要的朋友可以參考下

Java String對象使用方法詳解

先來看一個(gè)例子,代碼如下:

public class Test { 
  public static void main(String[] args) { 
    String str = "abc"; 
    String str1 = "abc"; 
    String str2 = new String("abc"); 
    System.out.println(str == str1); 
    System.out.println(str1 == "abc"); 
    System.out.println(str2 == "abc"); 
    System.out.println(str1 == str2); 
    System.out.println(str1.equals(str2)); 
    System.out.println(str1 == str2.intern()); 
    System.out.println(str2 == str2.intern()); 
    System.out.println(str1.hashCode() == str2.hashCode()); 
  } 
} 

    如果您能對這8個(gè)輸出結(jié)果直接判斷出來,下面的分析就不用看了。但是我想還是有很多人對這個(gè)String對象這個(gè)問題只是表面的理解,下面就來分析一下Java語言String類和對象及其運(yùn)行機(jī)制的問題。 

   做個(gè)基礎(chǔ)的說明,堆(heap)內(nèi)存和棧(Stack)內(nèi)存的問題。堆和棧的數(shù)據(jù)結(jié)構(gòu)這里就不解釋了。Java語言使用內(nèi)存的時(shí)候,棧內(nèi)存主要保存以下內(nèi)容:基本數(shù)據(jù)類型和對象的引用,而堆內(nèi)存存儲對象,棧內(nèi)存的速度要快于堆內(nèi)存??偨Y(jié)成一句話就是:引用在棧而對象在堆。 

    Java中的比較有兩種,是==和equals()方法,equals()是Object類的方法,定義在Object類中的equals()方法是如下實(shí)現(xiàn)的:

  public boolean equals(Object obj){ 
    return (this==obj); 
} 

     String類重寫了equals()方法,改變了這些類型對象相等的原則,即判斷對象是否相等依據(jù)的原則為判斷二者的內(nèi)容是否相等。 

    了解以上內(nèi)容后我們來說說String,String類的本質(zhì)是字符數(shù)組char[],其次String類是final的,是不可被繼承的,這點(diǎn)可能被大多數(shù)人忽略,再次String是特殊的封裝類型,使用String時(shí)可以直接賦值,也可以用new來創(chuàng)建對象,但是這二者的實(shí)現(xiàn)機(jī)制是不同的。還有一個(gè)String池的概念,Java運(yùn)行時(shí)維護(hù)一個(gè)String池,池中的String對象不可重復(fù),沒有創(chuàng)建,有則作罷。String池不屬于堆和棧,而是屬于常量池。下面分析上方代碼的真正含義

String str = "abc"; 
String str1= "abc"; 

    第一句的真正含義是在String池中創(chuàng)建一個(gè)對象”abc”,然后引用時(shí)str指向池中的對象”abc”。第二句執(zhí)行時(shí),因?yàn)椤盿bc”已經(jīng)存在于String池了,所以不再創(chuàng)建,則str==str1返回true就明白了。str1==”abc”肯定正確了,在String池中只有一個(gè)”abc”,而str和str1都指向池中的”abc”,就是這個(gè)道理。

String str2 = new String("abc"); 

    這個(gè)是Java SE的熱點(diǎn)問題,眾所周知,單獨(dú)這句話創(chuàng)建了2個(gè)String對象,而基于上面兩句,只在棧內(nèi)存創(chuàng)建str2引用,在堆內(nèi)存上創(chuàng)建一個(gè)String對象,內(nèi)容是”abc”,而str2指向堆內(nèi)存對象的首地址。 

    下面就是str2==”abc”的問題了,顯然不對,”abc”是位于String池中的對象,而str2指向的是堆內(nèi)存的String對象,==判斷的是地址,肯定不等了。 

    str1.equals(str2),這個(gè)是對的,前面說過,String類的equals重寫了Object類的equals()方法,實(shí)際就是判斷內(nèi)容是否相同了。 

    下面說下intern()方法,在JavaDoc文檔中,這樣描述了intern()方法:返回字符串對象的規(guī)范化表示形式。怎么理解這句話?實(shí)際上過程是這樣進(jìn)行的:該方法現(xiàn)在String池中查找是否存在一個(gè)對象,存在了就返回String池中對象的引用。 

    那么本例中String池存在”abc”,則調(diào)用intern()方法時(shí)返回的是池中”abc”對象引用,那么和str/str1都是等同的,和str2就不同了,因?yàn)閟tr2指向的是堆內(nèi)存。 

    hashCode()方法是返回字符串內(nèi)容的哈希碼,既然內(nèi)容相同,哈希碼必然相同,那他們就相等了,這個(gè)容易理解。
再看下面的例子:

public class Test { 
  private static String str = "abc"; 
  public static void main(String[] args) { 
    String str1 = "a"; 
    String str2 = "bc"; 
    String combo = str1 + str2; 
    System.out.println(str == combo); 
    System.out.println(str == combo.intern()); 
  } 
} 

    這個(gè)例子用來說明用+連接字符串時(shí),實(shí)際上是在堆內(nèi)容創(chuàng)建對象,那么combo指向的是堆內(nèi)存存儲”abc”字符串的空間首地址,顯然str==combo是錯(cuò)誤的,而str==combo.intern()是正確的,在String池中也存在”abc”,那就直接返回了,而str也是指向String池中的”abc”對象的。此例說明任何重新修改String都是重新分配內(nèi)存空間,這就使得String對象之間互不干擾。也就是String中的內(nèi)容一旦生成不可改變,直至生成新的對象。 

    同時(shí)問題也來了,使用+連接字符串每次都生成新的對象,而且是在堆內(nèi)存上進(jìn)行,而堆內(nèi)存速度比較慢(相對而言),那么再大量連接字符串時(shí)直接+是不可取的,當(dāng)然需要一種效率高的方法。Java提供的StringBuffer和StringBuilder就是解決這個(gè)問題的。區(qū)別是前者是線程安全的而后者是非線程安全的,StringBuilder在JDK1.5之后才有。不保證安全的StringBuilder有比StringBuffer更高的效率。 

    自JDK1.5之后,Java虛擬機(jī)執(zhí)行字符串的+操作時(shí),內(nèi)部實(shí)現(xiàn)也是StringBuilder,之前采用StringBuffer實(shí)現(xiàn)。 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • JAVA線上常見問題排查手段匯總

    JAVA線上常見問題排查手段匯總

    這篇文章主要介紹了JAVA線上常見問題排查手段匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 帶你快速搞定java多線程(4)

    帶你快速搞定java多線程(4)

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下
    2021-07-07
  • java通過實(shí)例了解值傳遞和引用傳遞

    java通過實(shí)例了解值傳遞和引用傳遞

    這篇文章主要介紹了java通過實(shí)例了解值傳遞和引用傳遞,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Spring Boot 驗(yàn)證碼的生成和驗(yàn)證詳解

    Spring Boot 驗(yàn)證碼的生成和驗(yàn)證詳解

    我們在做用戶登錄的時(shí)候,為了安全性考慮,會(huì)增加驗(yàn)證碼的功能,下面這篇文章主要給大家介紹了關(guān)于Spring Boot中驗(yàn)證碼的生成和驗(yàn)證的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。
    2017-06-06
  • MyBatis中一級緩存和二級緩存的區(qū)別

    MyBatis中一級緩存和二級緩存的區(qū)別

    MyBatis提供了兩級緩存機(jī)制,一級緩存和二級緩存,本文主要介紹了MyBatis中一級緩存和二級緩存的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • Java?SpringBoot核心源碼詳解

    Java?SpringBoot核心源碼詳解

    這篇文章主要為大家介紹了Java?SpringBoot核心源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 解決IDEA光標(biāo)變成白色粗條的問題

    解決IDEA光標(biāo)變成白色粗條的問題

    這篇文章主要介紹了解決IDEA光標(biāo)變成白色粗條的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java?Lambda表達(dá)式語法及用法示例

    Java?Lambda表達(dá)式語法及用法示例

    這篇文章主要給大家介紹了關(guān)于Java?Lambda表達(dá)式語法及用法的相關(guān)資料,lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡單的"函數(shù)式編程",文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 詳解Java并發(fā)編程中的優(yōu)先級隊(duì)列PriorityBlockingQueue

    詳解Java并發(fā)編程中的優(yōu)先級隊(duì)列PriorityBlockingQueue

    PriorityBlockingQueue是Java中實(shí)現(xiàn)了堆數(shù)據(jù)結(jié)構(gòu)的線程安全的有界阻塞隊(duì)列。本文將會(huì)深入解讀PriorityBlockingQueue的源碼實(shí)現(xiàn),感興趣的可以了解一下
    2023-05-05
  • Springboot使用thymeleaf動(dòng)態(tài)模板實(shí)現(xiàn)刷新

    Springboot使用thymeleaf動(dòng)態(tài)模板實(shí)現(xiàn)刷新

    這篇文章主要介紹了Springboot使用thymeleaf動(dòng)態(tài)模板實(shí)現(xiàn)刷新,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評論

丁青县| 阿拉善盟| 大化| 泸西县| 类乌齐县| 博客| 新晃| 临夏市| 治多县| 嵩明县| 马尔康县| 南平市| 哈巴河县| 巢湖市| 台南县| 马边| 崇州市| 玛曲县| SHOW| 互助| 泸西县| 张掖市| 凤翔县| 临江市| 伊金霍洛旗| 元谋县| 乐平市| 岳阳县| 邵阳市| 蕲春县| 内黄县| 赤城县| 耒阳市| 泸定县| 方山县| 吐鲁番市| 汾阳市| 若尔盖县| 尼勒克县| 冷水江市| 亳州市|