一、String
(一)String內存結構
(1)這兩行代碼,在JVM中創建了幾個對象?
public class StringTest01{
public static void main(String [] args){
String s1 = "abcdef";
String s2 ="abcdef"+"xy";
}
}
接下來,我們看內存圖。
所以,這兩行代碼在JVM中創建了3個字符串對象。
接下來我們再來看一個
String s3 = new String("xy");
它的內存結構是什麼樣的呢?
所以,我們就得出了凡是雙引號括起來的都是在字符串常量池中,凡是new出來的都會在堆內存中開闢空間。
所以我們之前學過的
User u1 = new User(123,"張三");
它的張三這個字符串是由堆內存指向了方法區的。
(2)分析一下輸出是否相等
packageString;
Public class StringTest01{
public static void main(String[]args){
Strings1="hello";
Strings2="hello";
System.out.println(s1.equals(s2));
}
}
答案是相等的。
我們來看一下它的內存圖
我們再來看一下的是否相等?
String s3 = new String("123");
String s4 = new String("123");
System.out.println(s3==s4);
System.out.println(s3.equals(s4));
因爲String已經重寫了equals方法,所以equals比較的是裏面的存儲的數據。
然後==對於引用來說,比較的是內存地址。
(二)String的構造方法
(1)String(byte[] bytes)參數可以傳入數組,並且解碼。
- String(byte[] bytes)
- 通過使用平臺的默認字符集解碼指定的字節數組來構造新的 String 。
packageString;
public class String Test02{
public static void main(String[]args){
byte[]b1={97,98,99};
String s1 = new String(b1);
System.out.println(s1);
}
}
(2)String在傳入數組的時候也可以同數組進行切割。
- String(byte[] bytes, int offset, int length)
- 通過使用平臺的默認字符集解碼指定的字節子陣列來構造新的 String 。
String s2 = new String(b1,1,2);
System.out.println(s2);
(3)String()也可以傳入char類型的數組
- String(char[] value, int offset, int count)
- 分配一個新的 String ,其中包含字符數組參數的子陣列中的字符。
char[]c1={'我','是','中','國','人'};
System.out.println(c1);
String charString= new String(c1);
System.out.println(charString);
String charString2= newString(c1,2,3);
System.out.println(charString2);
(三)String中的方法
(1)"中國人"這個本身就是String類型的所以可以直接調用charAt方法。
- char
- charAt(int index)
- 返回 char指定索引處的值。
packageString;
public class String Test03{
public static void main(String[]args){
char c="中國人".charAt(1);
System.out.println(c);
}
}
(2)
int result="abc".compareTo("abc");
System.out.println(result);
int result2="abcd".compareTo("adce");
System.out.println(result2);
int result3="abce".compareTo("abcd");
System.out.println(result3);
System.out.println("xyz".compareTo("yxz"));
拿着字符串第一個字母和後面字符串的第一個字母比較,能分勝負就不比較了。
(3)判斷前面的字符串中是否包含後面的子字符串
- boolean
- contains(CharSequence s)
- 當且僅當此字符串包含指定的char值序列時才返回true。
System.out.println("zhaoxiaodong".contains("zhao"));
System.out.println("langfangshifan".contains("tigaoban"));
(4)判斷此字符串是否以指定的後綴結尾。
System.out.println("zhaoxiaodong".endsWith("dong"));
System.out.println("langfangshi.fan".endsWith("fan"));
(5)判斷兩個字符串是否相等,並且忽略大小寫
System.out.println("ABc".equalsIgnoreCase("abC"));
(6)將字符串對象轉換成字節數組
- byte[]
- getBytes()
- 使用平臺的默認字符集將此 String編碼爲字節序列,將結果存儲到新的字節數組中。
byte [] bytes ="abcdef".getBytes();
for (int i =0;i<bytes.length;i++){
System.out.println(bytes[i]);
}
(7)判斷某個子字符串第一次出現的字符串內的索引。
System.out.println("abc".indexOf("a"));
(8) 判斷是否爲空
String s1 = "a";
System.out.println(s1.isEmpty());
(10)int length()
判斷數組長度和判斷字符串長度是不一樣的。判斷數組長度是length屬性,判斷字符串長度是Length()方法
Ststem.out.println("abc".length());
(11)判斷指定字符串最後一次出現的字符串中的索引
- int
- lastIndexOf(String str)
- 返回指定子字符串最後一次出現的字符串中的索引。
System.out.println("abc.java".lastIndexOf("java"));
(12)替換
String的父結構就是CharSequence
- replace(CharSequence target, CharSequence replacement)
- 將與字面目標序列匹配的字符串的每個子字符串替換爲指定的字面替換序列。
String newString ="http://www.baidu.com".replace("http","https");
System.out.println(newString);
(13) 拆分字符串
- String[]
- split(String regex)
- 將此字符串分割爲給定的 regular expression的匹配。
String[] ymd ="1998-9-3".split("-");
for (int i=0;i<ymd.length;i++){
System.out.println(ymd[i]);
}
(14)判斷某個字符串是否以某個子字符串開始
- boolean
- startsWith(String prefix)
- 測試此字符串是否以指定的前綴開頭。
System.out.println("abc.java".startsWith("abc"));
(15)截取字符串
System.out.println("http://www.baidu.com".substring(7));
(16)截取指定字符串
System.out.println("http://www.baidu.com".substring(7,10));
包含7但不包含10
(17)將字符串轉換爲char數組
- char[]
- toCharArray()
- 將此字符串轉換爲新的字符數組。
char [] chars ="我是中國人".toCharArray();
for(int i=0;i<chars.length;i++){
System.out.println(chars[i]);
}
(18)轉換爲小寫
- toLowerCase()
- 將所有在此字符 String使用默認語言環境的規則,以小寫。
System.out.println("ABC".toLowerCase());
(19)轉換爲大寫
- toUpperCase()
- 將所有在此字符 String使用默認語言環境的規則大寫。
(20)去除前後空白
(21) 將非字符串轉換爲字符串
String中只有一個方法是靜態的,不需要new對象。將非字符串轉換爲字符串
String str = String.valueOf(true);
System.out.println(str);
總結:String類在內存結構的時候,在方法區會有一個專用的字符串常量池,並且兩個字符串的內容一樣,不會再開闢內存空間,他們兩個變量指向的內存地址是一樣的。