摘要:這兩個操作符都是編譯器默認引入了類,最后都調用方法返回對象,臨時對象被回收,因此效率極為低下
Java String類筆記 聲明
文章均為本人技術筆記,轉載請注明出處https://segmentfault.com/u/yzwall
String的不可變性 String的不可變性// String declaration public final class String implements java.io.Serializable, Comparable, CharSequence { /** The value is used for character storage. */ private final char value[]; ... } public String(char value[]) { this.value = Arrays.copyOf(value, value.length); }
String類字符串存儲方式:值使用final char value[]類型的字符數組存儲,因此一旦賦值不可改變;
String類存儲字符串,使用Array.copyof方法value[]賦值,并開辟內存空間;
String類不可繼承:使用final修飾符,表示String類不可繼承;
String類提供的所有方法中,有返回String的一律新建一個String對象,防止對原String對象進行修改;
String對象創建字符串常量池:位于常量池中,由String類私有維護,池中元素都是String對象,每個String對象的字面值是唯一的,由GC回收;
String常量對象創建場合:當String對象第一次常量賦值和調用String對象調用intern()方法時,常量池中創建對應String常量對象;
String str1 = "abc"; String str2 = "abc"; String str3 = str1; String str4 = new String("abcd"); String str5 = new String("abc");
String對象創建,分為直接常量賦值與new運算符創建,創建String新對象時創建1個或2個String對象;
直接字符串常量賦值創建對象時,在編譯階段,編譯器先去字符串常量池檢查是否有String常量對象擁有字面值"abc",
存在/str2:在棧中創建引用,指向常量池中的Strng常量對象(字面值為"abc");
不存在/str1:在常量池中創建匿名Strng對象(字面值為"abc"),在棧中創建引用,指向String常量對象;
使用new運算符創建創建對象時,程序先去字符串常量池檢查是否有String對象擁有字面值"abc",
存在/str5:在棧中創建對象引用,在堆區為實例分配內存,但是字符數組value字段保存常量對象(常量池中)的value字段的引用;
不存在/str4:在棧中創建對象引用,在堆區為實例分配內存,在常量池中創建String常量對象,字符數組value字段保存常量對象(常量池中)的value字段的引用;
String類的intern()方法String str6 = new String("abc"); String a = str6.intern(); String str7 = "xyz"; String b = str7.intern();
str.intern()首先檢查常量池中的String常量對象字面值是否有與str.value相等的,若有直接返回對應String常量對象的引用,否則在常量池中創建字面值為str.value的String常量對象并返回引用;
String類判等:equals方法和等號運算符:String str1 = "abc"; String str2 = str1; String str3 = new String("abc"); String str4 = str3; String str5 = new String("abc"); // String equals只用于判斷字面值是否相同,以下結果均為true System.out.println(str1.equals(str2)); System.out.println(str1.equals(str3)); System.out.println(str3.equals(str4)); System.out.println(str3.equals(str5)); // false,str1與str3引用不同對象 System.out.println(str1 == str3); // false,str3與str5引用不同對象 System.out.println(str3 == str5;
equals()方法檢測兩個字符串變量/常量是否相等;
==運算符判斷兩個String對象的引用地址是否相同,即判斷引用變量引用指向同一個對象;
String:空串與null空串""是長度為0的字符串,用if(str.length() == 0)或if(str.equals(""))判斷;
null表示String對象為空,用if(str == null)判斷;
String、StringBuilder,StringBuffer辨析 三者可變性與線程安全辨析String類由于對象不可變,線程安全 【異】
StringBuilder與StringBuffer都繼承AbstractStringBuilder類,字面值char[] value均可變【同】;
StringBuffer中主要方法用synchronized加了同步鎖,因此線程安全【異】;
StringBuilder方法沒有加同步鎖,因此線程不安全,但在非多線程場景下,效率高于StringBuilder【異】;
三者適用場景【異】:使用String類:適用于字符串不頻繁變化的場景,比如常量生命,少量變量運算;
使用StringBuilder類:適用于單線程環境下字符串頻繁變化的場景;
使用StringBuffer類:適用于多線程環境下字符串頻繁變化的場景;
String類重寫了equals()方法和hashCode()方法,StringBuilder和StrngBuffer沒有,因此將后兩者對象存儲Java集合類中會出現問題;
String對象"+/+="本質在進行連接操作(“+”和 “+=”)時,String每次返回一個新的String實例,而StringBuffer/StringBuilder的append()直接返回this;
String類“+”和 “+=”操作符是Java中唯一重載的兩個操作符。這兩個操作符都是編譯器默認引入了StringBuilder類,最后都調用toString()方法返回String對象,StringBuilder臨時對象被GC回收,因此效率極為低下;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66995.html
摘要:容器的類圖如下圖所示接口定義了存取一組對象的方法其子接口和分別定義了存儲方式。中的數據對象沒有順序且不可以重復。注意相等的對象應該具有相等的 Chap 6 常用類 focus on : 字符串相關類 (String, StringBuffer) 基本數據類型包裝類 Math類 File類 枚舉類 6.1 字符串相關類 String 類 -- java.lang.String 類...
摘要:創建字符串教程字符串長度用于獲取有關對象的信息的方法稱為訪問器方法。類在中被提出,它和之間的最大不同在于的方法不是線程安全的不能同步訪問。然而在應用程序要求線程安全的情況下,則必須使用類。 一般地,當需要使用數字的時候,我們通常使用內置數據類型,如:byte、int、long、double 等。 在實際開發過程中,我們經常會遇到需要使用對象,而不是內置數據類型的情形。為了解決這個問題,...
摘要:構造器創建實例構造器和方法的反射類不同點在于,可以創建實例,代碼如下所示。 上一篇文章介紹了反射的基本概念以及獲取類相關信息的反射API,這一章節主要記錄如何對類的成員進行操作的相關反射API。 操作類成員的類 反射API中提供了如下接口,用于對類的成員進行操作。 java.lang.reflect.Member 該接口主要有以下三個實現類,用于對類成員中的字段,方法和構造器進行操作...
閱讀 2596·2023-04-25 15:07
閱讀 705·2021-11-24 10:21
閱讀 2298·2021-09-22 10:02
閱讀 3517·2019-08-30 15:43
閱讀 3222·2019-08-30 13:03
閱讀 2287·2019-08-29 17:18
閱讀 3586·2019-08-29 17:07
閱讀 1873·2019-08-29 12:27