Java String類的學習
阿新 • • 發佈:2021-01-30
String類物件例項化
- 有直接賦值和構造方法例項化兩種
public static void main(String args[]) {
String str1="str1";
System.out.println(str1);
String str2=new String("str2");
System.out.println(str2);
}
字串的比較
- Java中提供的
==
可以進行數值的比較,判斷基本資料型別。 - String類物件如果使用==比較比較不是內容,而是字串的堆記憶體地址。
public static void main(String args[]) {
String str1="str";
String str2=new String("str");
String str3=str2;
System.out.println(str1==str2);
System.out.println(str2==str3);
System.out.println(str1==str3);
}
false
true
false
- 字串內容相等判斷
public boolean equals
public static void main(String args[]) { String str1="str"; String str2=new String("str"); System.out.println(str1.equals(str2)); }
true
字串常量
- 在程式中常量是不可被改變內容的統稱,字串常量就是String類的匿名物件。
public static void main(String args[]) {
String str1="str";
System.out.println("str".equals(str1));
}
兩種例項化方式比較
- 直接賦值的物件例項化,通過直接賦值的方式為String類物件例項化開闢一塊堆記憶體空間,而且對同一字串的直接賦值還可以實現對堆記憶體空間的重用,就是在內容相同的情況下不會開闢新的堆記憶體空間,而是直接指向已有的堆記憶體空間。
public static void main(String args[]) {
String str1="str";
String str2="str";
String str3="string";
System.out.println(str1==str2);
System.out.println(str1==str3);
}
true
false
- 構造方法例項化,每當使用關鍵字new就表示要開闢新的堆空間記憶體。
public static void main(String args[]) {
String str1="str";
String str2="str";
String str3=new String("str");
System.out.println(str1==str2);
System.out.println(str1==str3);
}
true
false
- 字串物件池,在JVM的底層存在一個物件池,物件池本質就是共享設計模式的一種應用,當代碼使用直接賦值的方式定義了一個String類物件時,會將此字串物件所使用的匿名物件入池儲存,當還有其他String類物件也採用了直接賦值的方式,並且設定了同樣的內容,那麼將不會開闢新的堆記憶體空間,而是使用已有的物件進行引用的分配。
- 開闢的新記憶體資料可以
public String intern()
進行入池。
public static void main(String args[]) {
String str1="str";
String str2="str";
String str3=new String("str").intern();
System.out.println(str1==str2);
System.out.println(str1==str3);
}
true
true
字串常量池
- 靜態常量池:程式在載入時候會自動將此程式中儲存的字串、普通常量、類和方法等資訊,全部進行分配。
public static void main(String args[]) {
String str1="hi,Yang";
String str2="hi,"+"Yang";
System.out.println(str1==str2);
}
true
- 執行時常量池:當程式載入之後,有一些字串內容時通過String物件的形式儲存後在實現字串連線處理,String物件的內容可以改變。
public static void main(String args[]) {
String str="Yang";
String str1="hi,Yang";
String str2="hi,"+str;
System.out.println(str1==str2);
}
false
字串修改
- String類對於資料的儲存時基於陣列實現的,陣列屬於定長的資料型別,這樣表明String物件的內容一旦宣告將不可直接改變,而所有的字串物件內容的修改都是通過引用變化來實現的。
public static void main(String args[]) {
String str="hi";
str+=",";
str=str+"Yang";
System.out.println(str);
}
hi,Yang
對於字串物件內容的修改,其實質是改變了引用關係,同時會產生垃圾空間,影響執行效率。
String類常用方法
- 字串與字元
方法名稱 | 型別 | 描述 |
---|---|---|
public String(char[] value) | 構造 | 將傳入的全部字元陣列變為字串 |
public String(char[] value,int offset,int count) | 構造 | 將部分字元陣列變為字串 |
public char charAt(int index) | 普通 | 獲取指定索引位置的字元 |
public char[] toCharArray() | 普通 | 將字串中的資料以字元陣列的形式返回 |
public static void main(String args[]) {
String str="hi,Yang";
char c=str.charAt(3);
System.out.println(c);
}
Y
public static void main(String args[]) {
String str="hi,Yang";
char[] c=str.toCharArray();
System.out.println(c);
System.out.println(new String(c,0,4));
}
hi,Yang
hi,Y
- 字串與位元組
方法名稱 | 型別 | 描述 |
---|---|---|
public String(byte[] bytes) | 構造 | 將全部位元組陣列變為字串 |
public String(byte[] bytes,int offset,int length) | 構造 | 將部分位元組陣列變為字串 |
public byte[] getBytes() | 普通 | 將字串轉為位元組陣列 |
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException | 普通 | 編碼轉換 |
- 字串比較
方法名稱 | 型別 | 描述 |
---|---|---|
public boolean equals(String anObject) | 普通 | 區分大小寫的相等判斷 |
public boolean equalsIgnoreCase(String anotherString) | 普通 | 不區分大小寫比較 |
public int compareTo(String anotherString) | 普通 | 判斷兩個字串的大小 |
public int compareToIgnoreCase(String str) | 普通 | 不區分大小寫進行字串大小的比較 |
- 字串查詢
方法名稱 | 型別 | 描述 |
---|---|---|
public public boolean contains(String s) | 普通 | 判斷子字串是否存在 |
public int indexOf(String str) | 普通 | 從頭查詢指定字串的位置 |
public int indexOf(String str,int fromIndex) | 普通 | 從指定位置查詢指定字串的位置 |
public int lastIndexOf(String str) | 普通 | 從後往前查詢指定字串的位置 |
public int lastIndexOf(String str ,int fromIndex) | 普通 | 從指定位置從後往前查詢指定字串的位置 |
public boolean startsWith(String prefix) | 普通 | 判斷是否以指定的字串開頭 |
public boolean startsWith(String perfix,int toffset) | 普通 | 由指定位置判斷是否以指定的字串開頭 |
public boolean endsWith(String suffix) | 普通 | 判斷是否以指定的字串結尾 |
- 字串替換
方法名稱 | 型別 | 描述 |
---|---|---|
public String replaceAll(String regex,String replacement) | 普通 | 全部替換 |
public String replaceFirst(String regex,String replacement) | 普通 | 替換首個 |
- 字串拆分
方法名稱 | 型別 | 描述 |
---|---|---|
public String[] split(String regex) | 普通 | 按照指定的字串進行全部拆分 |
public String[] split(String regex,int limit) | 普通 | 按照指定的字串進行部分拆分 |
- 字串擷取
方法名稱 | 型別 | 描述 |
---|---|---|
public String substring(int beginIndex) | 普通 | 從指定索引擷取到結尾 |
public String substring(int beginIndex,int endIndex) | 普通 | 擷取指定索引範圍中的子字串 |