1、String的特性
①String是一個final類,是不可變的字符序列(當對字符串進行操作時,需要重新定義一個區域的值,不能夠對原來的區域內容進行修改)
②內部定義了final類型的char型數組,用於存儲字符串數據
③String字面量的定義方式,聲明的字符串值存放在字符串常量池中
④字符串常量池是不會存儲相同內容的字符串
2、String實例化的方式
①通過字面量定義的方式:生成的變量指向字符串常量池中
②通過new+構造器的方式:生成的變量指向堆中
3、字符串生成結果位置
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = "hello" + "world";
String s5 = s1 + "world";
String s6 = "hello" + s2;
String s7 = s1 + s2;
String s8 = s5.intern();
String s9 = (s1 + s2).intern();
System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s5 == s7);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false
System.out.println(s3 == s8);//true
System.out.println(s3 == s9);//true
如果聲明等號右邊是有變量名存在的,那麼編譯就會在堆中進行,結果也就生成在堆中;
如果聲明等號右邊單純是字符串或字符串(常量)拼接,那麼編譯在常量池中及進行,結果就生成在常量池中;
如果聲明等號右邊變量使用了intern()方法,那麼結果也生成在常量池中
如果變量是final修飾的,那麼編譯會在方法區中,是兩個常量的拼接,那麼結果也就在常量池中
一旦String類型變量調用了intern方法,那麼就一定會返回在常量池的地址值
4、字符串常量池在JDK不同版本的位置
5、String的常用方法
int length()
:返回字符串的長度
char charAt(int index)
:返回字符串對應位置的char型字符 return value[index];
boolean isEmpty()
:判斷字符串是否爲空(長度是否爲0) return length == 0;
String trim()
:返回去除原先字符串首末位置空格的字符串
boolean equals(Object obj)
:判斷兩個字符串內容是否相同
boolean equalsIgnoreCase(String anotherString)
:忽略大小寫判斷字符串內容是否相同
String concat(String str)
:等價於“+”的作用,拼接字符串
int compareTo(String anotherString)
:判斷兩個字符串大小(將每一個字符進行相減運算,求出總和)
String subString(int beginIndex)
:返回一個新的字符串,從beginIndex開始截取
String subString(int beginIndex, int endIndex)
:返回一個新字符串,從beginIndex開始,endIndex-1結束
boolean contains(CharSequence s)
:判斷字符串中是否存在指定char值序列
int indexOf(String str)
:返回子字符串第一次在字符串中出現的索引位置
String replace(char oldChar, char newChar)
:返回一個替換了oldChar後的字符串
String replace(CharSequence target, CharSequence replacement)
:返回替換了原來字符串中所有非target字符串的新字符串
6、String的轉化
String與字符數組(char[])的轉化:
String轉化爲char[]:String調用toCharArray()方法
char[]轉化爲String:將char[]放入String創建對象的構造器中
String與字節數組(byte[])的轉化:
String轉化爲byte[]:String調用getBytes()方法
byte[]轉化爲String:將byte[]放入String創建對象的構造器中
7、StringBuilder和StringBuffer
StringBuffer:可變的字符序列;線程安全,效率
StringBuilder:可變的字符序列;線程不安全,效率高;JDK5.0後新增的
StringBuffer/StringBuilder的創建:按給出的字符串的長度加上16的大小創建char[]數組
StringBuffer/StringBuilder的擴容:先判斷原有的數組加上新添數組長度之和是否大於16,若大於,則擴容;默認情況下擴容爲原來長度2倍+2,同時將,原有的數據複製到新的數組中
常用方法
append(String str)
:用於加入字符串/字符/數字進行拼接
delete(int start, int end)
:刪除指定位置的字符/字符串(不包括end位置的)
replace(int start, int end, String str)
:替換指定位置的內容(不包括end位置的)
insert(int offset, String str)
:在指定位置插入內容
reverse()
:當前字符串逆轉
int indexOf(String str)
:返回str首次在字符串中出現的位置
8、String、StringBuffer、StringBuilder效率
StringBuillder > StringBuffer > String