JAVA實訓總結 :String


String是特殊的類,與其他基本類型並不相同,是被java封裝的類型
String底層組成對象為數組與字典(字符集編碼表)
String 類型的字符串是存儲在JVM特別開辟的 字符串常量池中
 
創建與修改字符串的本質
String s = "hello"並不等價於String s = new String("hello")
執行String s = "hello"代碼
java會先在字符串常量池中尋找是否有hello;如果有,新建一個子串引用,將引用扔到s里,如果沒有,便從字典里尋找,在字符串常量池中開辟空間新建數組,找到h放入下標為0的數組,再找到e放入下標為1的數組,依次類推,直到將hello完全存儲到數組,再建立一個子串引用,將引用扔給s
 
但在執行String s = new String("hello")時,可能會創建一個對象,也可能會創建兩個對象:
步驟:
1.String s定義一個名為s的String對象,並不創建對象
2.= 對 s初始化,將某對象賦值給他
3.“hello”通過雙引號在編譯期間創建對象,這個創建方法與String s = "hello"一樣,先在字符串常量池中尋找是否有hello,有則不添加,沒有則將hello添加到字符串常量池中
4.new String() :運行期 在堆中開辟空間,存儲hello
注意:
不管串池里有沒有"hello",它都會在堆中重新分配一塊內存,定義一個新的對象
此時s存放的是堆中hello的地址並非字符串常量池中的地址
(String的intern()方法就是擴充常量池的 一個方法;當一個String實例str調用intern()方法時,Java查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個Unicode等於str的字符串並返回它的引用)
例:
 1 String s0 = "abc";
 2 String s1 = "abcd";
 3 String s2 = new String("abc");
 4 System.out.println(s0 == s2);//flase
 5 System.out.println("***********************************");
 6 String s3 = s1+"d"; //拼接對象有new,會在堆中開辟空間
 7 String s4 = "abc"+"d"; //拼接對象無new,只在常量池中進行操作
 8 s2.intern(); //返回s2在常量池中的地址,常量池中若無s2則在常量池中添加s2,並返回它的地址
 9 System.out.println(s0 == s2);//flase
10 System.out.println("***********************************");
11 s2 = s2.intern();
12 System.out.println(s0 == s2);//true
13 System.out.println(s1 == s3);//flase
14 System.out.println(s1 == s4);//trun

 

 
字符串常量池中的字符串是不可以改變的
String word = "Hello, ";
word = word.trim(); //返回一個前后不含任何空格的調用字符串的副本
String s = word.concat("小魚兒!"); //在 “Hello,” 后面拼接 “小魚兒!”
這時在字符串常量池中,會存在三個字符串:1."Hello, " 2."Hello," 3.”Hello,小魚兒!“
word = word.trim(); //不會將已經建立的子串1改變,只是將新建子串2的地址賦值給了word
如果原來的那個 "Hello, "沒有任何對象去引用它,虛擬機的垃圾回收機制將接收它。
 
字符串的比較“==”與equals()
"==":比較兩個字符串的首地址,而equals()比較兩個字符串的內容是否相同
String s1 = new String("abc");
String s1 = new String("abc");
System.out.print(s1 == s2);//輸出flase,地址不同
System.out.print(s1.equals(s2));//輸出true,內容相同
 
String常用方法
1.public String concat(String)
A.concat(B) //B字符串將被連接到A字符串后面
 
2.public int indexOf(int ch):
返回指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
 
public int indexOf(int ch, int fromIndex):
返回從 fromIndex 位置開始查找指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
 
int indexOf(String str):
返回指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
 
int indexOf(String str, int fromIndex):
返回從 fromIndex 位置開始查找指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
 
3.public String substring(int index)
提取從位置索引開始的字符串部分
 
public String substring(int beginindex, int endindex)
提取beginindex和endindex之間的字符串部分, 注意:beginindex<=s<endindex
 
public String trim()
返回一個前后不含任何空格的調用字符串的副本(將字符串空格去掉)
 
4.public String[] split(String c)
將一個字符串根據c分割為若干子字符串,結果作為字符串數組返回,但會將分隔符去掉
String words = "長亭外,古道邊,芳草碧連天,晚風拂柳笛聲殘,夕陽山外山";
String[] printWord = new String[100];
System.out.println("\n拆分后:");
printWord = words.split(",");
for (int i =0;i<printWord.length;i++){
System.out.println(printWord[i]);
}
控制台輸出結果:
 
拆分后:
長亭外
古道邊
芳草碧連天
晚風拂柳笛聲殘
夕陽山外山
輸出后,作為分隔符的逗號消失
 
5.public bollean equalsIgnoreCase():
比較兩個字符串,但不會區分大小寫
 
6.toLowerCase():
將字符串中的所有大寫字符改為大寫字符
 
7.toUpperCase():
將字符串中所有小寫字符串改為大寫字符
 
將基本類型轉換為String類型的簡單方法:
1.最簡單的方法:基本類型變量+“ ”,所有變量與String類型拼接都會轉換為String類型
2. String s = String.valueOf(基本類型變量)
 
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM