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

Java String對象使用方法詳解

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

Java String對象使用方法詳解

先來看一個例子,代碼如下:

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個輸出結果直接判斷出來,下面的分析就不用看了。但是我想還是有很多人對這個String對象這個問題只是表面的理解,下面就來分析一下Java語言String類和對象及其運行機制的問題。 

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

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

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

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

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

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

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

String str2 = new String("abc"); 

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

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

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

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

    那么本例中String池存在”abc”,則調用intern()方法時返回的是池中”abc”對象引用,那么和str/str1都是等同的,和str2就不同了,因為str2指向的是堆內存。 

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

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()); 
  } 
} 

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

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

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

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

相關文章

  • Mybatis?Plus?逆向工程介紹

    Mybatis?Plus?逆向工程介紹

    這篇文章主要介紹了Mybatis?Plus?逆向工程,文章通過Mybatis?Plus?逆向工程相關資料及示例代碼詳細介紹,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考一下
    2022-01-01
  • 如何使用JWT的SpringSecurity實現(xiàn)前后端分離

    如何使用JWT的SpringSecurity實現(xiàn)前后端分離

    這篇文章主要介紹了使用JWT的SpringSecurity實現(xiàn)前后端分離,登錄成功需要返回json數(shù)據登錄失敗需要返回json數(shù)據權限不足時返回json數(shù)據未登錄訪問資源返回json數(shù)據,需要的朋友可以參考下
    2024-08-08
  • java編程實現(xiàn)楊輝三角兩種輸出結果實例代碼

    java編程實現(xiàn)楊輝三角兩種輸出結果實例代碼

    這篇文章主要介紹了java編程實現(xiàn)楊輝三角兩種輸出結果實例代碼,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • java實現(xiàn)錄音播放功能

    java實現(xiàn)錄音播放功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)錄音播放功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • SpringBoot中創(chuàng)建bean的7種方式總結

    SpringBoot中創(chuàng)建bean的7種方式總結

    Spring是一款廣泛應用于企業(yè)級應用程序開發(fā)的Java框架,其 IOC 和 DI 特性可以有效地管理應用程序中的對象,提高了應用程序的可維護性和可擴展性,那你知道spring有哪些方式將bean放入容器嘛,今天就給大家總結一下
    2023-07-07
  • 解決idea2020.1 用gitee push推送被拒絕的原因(親測有效)

    解決idea2020.1 用gitee push推送被拒絕的原因(親測有效)

    這篇文章主要介紹了解決idea2020.1 用gitee push推送被拒絕的原因(親測有效),本文給大家分享解決方案,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • @Transactional注解不起作用的原因分析及解決

    @Transactional注解不起作用的原因分析及解決

    這篇文章主要介紹了@Transactional注解不起作用的原因分析及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • IntelliJ IDEA中如何構建Spring Boot的項目

    IntelliJ IDEA中如何構建Spring Boot的項目

    這篇文章主要介紹了IntelliJ IDEA中如何構建Spring Boot的項目問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 詳解Java設計模式編程中的依賴倒置原則

    詳解Java設計模式編程中的依賴倒置原則

    這篇文章主要介紹了詳解Java設計模式中的依賴倒置原則,針對面對對象編程中的抽象的運用,需要的朋友可以參考下
    2016-02-02
  • SpringCloud?Feign超詳細講解

    SpringCloud?Feign超詳細講解

    Feign是Netflix公司開發(fā)的一個聲明式的REST調用客戶端;?Ribbon負載均衡、?Hystrⅸ服務熔斷是我們Spring?Cloud中進行微服務開發(fā)非常基礎的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時出現(xiàn)的,而且配置也都非常相似
    2022-10-10

最新評論