String類
一、String類的理解和創建物件
-
結構剖析
-
String 物件用于保存字串,也就是一組字符序列;
-
字串常量物件是用雙引號括起來的字符序列,例如:jack"字串常量;
-
字串的字符使用Unicode字符編碼,一個字符(無論漢字還是字母)占兩個位元組;
-
String類 有很多構造器,構造器的多載
常用的有:
String s1 = new String();
String s2 = new String(String original);
String s3 = new String(char[] a);
String s4 = new String(char[] a,int startIndex,int count);
String s5 = new String(byte[] b); -
String類 實作了介面 Serializable【String 可串行化:可以在網路傳輸】
String類 實作了介面 Comparable【String類物件可以比較大小】
-
String 是 final類,不能被其他類繼承;
-
String類 有屬性 private final char value[]; 用于存放字串內容,即String本質是字符陣列;
-
一定要注意:value 是一個 final型別,不可以修改:即value陣列物件不可以指向新的地址,但是單個字符內容是可以變化的;
-
-
創建剖析
創建String物件的兩種方式:
方式一:直接賦值 String s = "hspedu";
方式二:呼叫構造器 String s = new String("hspedu");
- 方式一:先從常量池查看是否有 "hsp" 資料空間,如果有直接指向;如果沒有則重新創建,然后指向,s 最終指向的是常量池的空間地址,
- 方式二:先在堆中創建空間,里面維護了value屬性,指向常量池的 "hsp" 空間;如果常量池沒有"hsp",重新創建,如果有,直接通過value指向,最終指向的是堆中的空間地址,
![jvm的記憶體:String的記憶體布局]

二、字串的特性
-
String 是一個final類,代表不可改變的字符序列,
-
字串是不可變的,一個字串物件一旦被分配,其內容是不可變的,
//以下陳述句創建了幾個物件 String s1 = "hello"; s1 = "haha"; //創建了2個物件 -
編譯器會判斷創建的常量池物件,是否有參考指向,
//以下陳述句創建了幾個物件 String a = "hello" + "abc"; //只有一個物件 //String a = "hello" + "abc"; => //優化,等價于 String a = "helloabc"; //1. 編譯器不傻,做一個優化,判斷創建的常量池物件,是否有參考指向, //2. String a = "hello" + "abc"; => String a = "helloabc"; -
String c = a + b; 變數相加,創建程序;
public class StringExercise { public static void main(String[] args) { //判斷創建了幾個物件 String a = "hello"; String b = "abc"; // c 的創建程序: //1. 先創建了一個StringBuilder sb = StringBuilder(); //2. 執行 sb.append("hello"); //3. sb.append("abc"); //4. String c = sb.toString(); //這里的toString()方法原始碼: /* public String toString() { return new String(value, 0, count);//這里new了一個String物件 } */ //最后其實是 c 指向堆中物件(String)value[] -> 池中 "helloabc" String c = a + b; String d = "helloabc"; System.out.println(c == d); } }底層是StringBuilder sb = StringBuilder();
sb.append("hello");
sb.append("abc");
sb是在堆中,并且append是在原來字串的基礎上追加的,
重要規則:String c1 = "ab" + "cd"; 常量相加,看的是池,
String c1 = a + b; 變數相加,是在堆中,
三、 String類的常用方法
-
intern()方法:
如果池中已經包含一個等于此String物件的字串(用equals(Object)方法確定),則回傳池中的字串,否則將此 String物件添加到池中,并回傳此String物件的參考,intern()方法最侄訓傳的是常量池的地址(物件),
-
equals()方法: 比較內容是否相同,區分大小寫;
-
equalsIgnoreCase()方法: 忽略大小寫判斷內容是否相等;
-
length()方法: 獲取字符的個數,字串的長度;
-
indexOf()方法: 獲取字符/子串在字串物件中第一次出現的索引;
-
lastIndexOf()方法: 獲取字符/子串在字串物件中最后一次出現的索引;
-
substring()方法: 截取指定范圍內的子串;
public class StringMethod01 {
public static void main(String[] args) {
//1. equals 比較內容是否相同,區分大小寫
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.equals(str2));//false
//2. equalsIgnoreCase 忽略大小寫判斷內容是否相等
String username = "johN";
if("john".equalsIgnoreCase(username)){
System.out.println("Success!");
}else{
System.out.println("Failure!");
}
//3. length 獲取字符的個數,字串的長度
System.out.println("韓順平".length());
//4. indexOf 獲取字符/子串在字串物件中第一次出現的索引
String s1 = "wer@terwe@g";
int index = s1.indexOf('@');
int index2 = s1.indexOf("we");
System.out.println(index);//3
System.out.println(index2);//0
//5. lastIndexOf 獲取字符/子串在字串物件中最后一次出現的索引
s1 = "wer@terwe@g@";
index = s1.lastIndexOf('@');
index2 = s1.lastIndexOf("we");
System.out.println(index);//11
System.out.println(index2);//7
//6. substring 截取指定范圍內的子串
String name = "hello,張三";
//下面name.substring(6) 從索引6開始截取后面所有的內容
System.out.println(name.substring(6));//截取后面的字符
//name.substring(0,5) 表示從索引0開始截取,截取到索引5但不包括索引5,[0,5)
System.out.println(name.substring(2,5));//ll0
}
}
- toUpperCase()方法: 轉換成大寫;
- toLowerCase()方法: 轉換成小寫;
- concat()方法: 拼接字串;
- replace()方法: 替換字串中的字符;
- split()方法: 分割字串,對于某些分割字符我們需要轉義比如 | , \ 等等;
- toCharArray()方法: 轉換成字符陣列;
- compareTo()方法: 比較兩個字串的大小;
- format()方法: 格式字串;
public class StringMethod02 {
public static void main(String[] args) {
//1. toUpperCase 轉換成大寫
String s = "heLLo";
System.out.println(s.toUpperCase());
//2. toLowerCase 轉換成小寫
System.out.println(s.toLowerCase());
//3. concat 拼接字串
String s1 = "寶玉";
s1 = s1.concat("林黛玉").concat("薛寶釵").concat("together");
System.out.println(s1);
//4. replace 替換字串中的字符
//s1.replace() 方法執行后回傳的結果,才是替換后的
//注意對 s1 即原來的字串無任何影響
String s2 = s1.replace("林黛玉","jack");
System.out.println(s2);
System.out.println(s1);
//5. split 分割字串,對于某些分割字符我們需要轉義比如 |, \\ 等等
String poem = "鋤禾日當午,汗滴禾下土,誰知盤中餐,粒粒皆辛苦";
//以 "," 為標準對 poem 進行分割回傳一個陣列
String[] split = poem.split(",");
System.out.println("======分割后內容======");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}
poem = "E:\\aaa\\bbb";
String[] split2 = poem.split("\\\\");
System.out.println("======分割后內容======");
for (int i = 0; i < split2.length; i++) {
System.out.println(split2[i]);
}
//6. toCharArray 轉換成字符陣列
s = "happy";
char[] chs = s.toCharArray();
for (int i = 0; i < chs.length; i++) {
System.out.println(chs[i]);
}
//7. compareTo 比較兩個字串的大小
//如果前者大,回傳正數,后者大,則回傳負數,如果相等,回傳0
//原始碼:
/*
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
*/
//(1) 如果 長度相同,并且每個字符也相同,就回傳0
//(2) 如果長度相同或不同,但是在進行比較時,字符有不同,可以區分大小就回傳字符間的差值
//(3) 如果長度不同,前面部分相同,就回傳 str1.len - str2.len;
String a = "jcck";
String b = "jack";
System.out.println(a.compareTo(b));//回傳值是 'c' - 'a'
//8. format 格式字串
/*
占位符有:
%S 字串 %c 字符 %d 整型 %.2f 浮點型
*/
String name = "john";
int age = 10;
double score = 98.3 / 3;
char gender = '男';
//將所有的資訊都拼接在一個字串
String info = "我的名字是" + name + "年齡是" + age +
"成績是" + score + "性別是" + gender;
System.out.println(info);
//1. %s %c %d %.2f 稱為占位符
//2. 這些占位符由后面的變數來替換
//3. %s 表示后面由字串來替換
//4. %d 是整數來替換
//5. %.2f 表示使用小數來替換,替換后,只會保留小數點兩位
//6. %c 使用char 型別來替換
String formatStr = "我的名字是%s,年齡是%d,成績是%.2f,性別是%c";
String info2 = String.format(formatStr,name,age,score,gender);
System.out.println(info2);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541552.html
標籤:其他
