(一)Java常用類之字符串String | 【奔跑吧!Java】
1、String的特性
(1)String代表字符串。Java程序中的所有字符串字面值(如 "abc" )都作為此類的實例實現。 (2)字符串是常量,用雙引號("")引起來表示。它們的值在創建之后不能更改。 (3)String類是一個final類,代表不可變的字符序列并且不可被繼承。 (4)String類實現了Serializable接口:表示字符串是支持序列化的。 (5)String類實現了Comparable接口:表示String可以比較大小 (6)String類內部定義了final char[] value用于存儲字符串數據。 (7)通過字面量的方式(區別于new給一個字符串賦值,此時的字符串值聲明在字符串常量池中)。 (8)字符串常量池中是不會存儲相同內容(使用String類的equals()比較,返回true)的字符串的。
2、String對象的創建方式
public class StringTest { public static void main(String[] args) { // 1、字面量方式創建 String s0 = "hello"; // 2、通過new的方式創建空字符串,本質上是this.value = new char[0]; String s1 = new String(); // 3、通過new的方式,根據其它字符串創建新字符串,本質上是this.value = original.value; String s2 = new String("hello"); // 4、通過字符數組的方式創建字符串,本質上是this.value = Arrays.copyOf(value, value.length); char[] c1 = {'h', 'e', 'l', 'l', 'o'}; String s3 = new String(c1); // 5、通過字符數組的方式根據開始索引和需要的長度創建字符串,本質上是this.value = Arrays.copyOf(value, value.length); String s4 = new String(c1, 0, 2); } }
說明:其它創建方式詳見JavaAPI文檔
3、String內存分配
String str1 = “abc”;與String str2 = new String(“abc”);的區別?
4、String特性舉例
public class StringTest { public static void main(String[] args) { String s1 = "Hello"; final String s11 = "Hello"; //s11:常量 String s2 = "World"; String s3 = "HelloWorld"; String s4 = "Hello" + "World"; String s5 = s1 + "World"; String s55 = s11 + "World"; String s6 = "Hello" + s2; String s7 = s1 + s2; System.out.println(s3 == s4);//true System.out.println(s3 == s5);//false System.out.println(s3 == s55);//true System.out.println(s3 == s6);//false System.out.println(s3 == s7);//false System.out.println(s5 == s6);//false System.out.println(s5 == s7);//false System.out.println(s6 == s7);//false // 返回值得到的s8使用的常量值中已經存在的“HelloWorld” String s8 = s6.intern(); System.out.println(s3 == s8);//true } }
5、String使用陷阱
String s1 = "a"; 說明:在字符串常量池中創建了一個字面量為"a"的字符串。 s1 = s1 + "b"; 說明:實際上原來的“a”字符串對象已經丟棄了,現在在堆空間中產生了一個字符串s1+"b"(也就是"ab")。如果多次執行這些改變串內容的操作,會導致大量副本字符串對象存留在內存中,降低效率。如果這樣的操作放到循環中,會極大影響程序的性能。 String s2 = "ab"; 說明:直接在字符串常量池中創建一個字面量為"ab"的字符串。 String s3 = "a" + "b"; 說明:s3指向字符串常量池中已經創建的"ab"的字符串。 String s4 = s1.intern(); 說明:堆空間的s1對象在調用intern()之后,會將常量池中已經存在的"ab"字符串賦值給s4。
6、String常用方法
6.1、字符串基本操作
public class StringTest { public static void main(String[] args) { //定義一個字符串 String str = " Hello World "; // 1、length():返回字符串的長度: return value.length int length = str.length(); System.out.println("字符串的長度為:" + length); // 2、charAt():返回某索引處的字符return value[index] char ch = str.charAt(4); System.out.println("字符串中的第5個字符為:" + ch); // 3、isEmpty():判斷是否是空字符串:return value.length == 0 System.out.println("字符串是否為空:" + str.isEmpty()); // 4、toLowerCase():使用默認語言環境,將 String 中的所字符轉換為小寫 System.out.println("字符串轉換為小寫:" + str.toLowerCase()); // 5、toUpperCase():使用默認語言環境,將 String 中的所字符轉換為大寫 System.out.println("字符串轉換為大寫:" + str.toUpperCase()); // 6、trim():返回字符串的副本,忽略前導空白和尾部空白 System.out.println("忽略前導空白和尾部空白:" + str.trim()); // 7、concat(String str):將指定字符串連接到此字符串的結尾。 等價于用“+” System.out.println("拼接字符串:" + str.concat("!!!")); } }
6.2、字符串比較
public class StringTest { public static void main(String[] args) { //定義兩個字符串 String str1 = "Hello World"; String str2 = "hello world"; // 1、compareTo(String anotherString):比較兩個字符串的大小 // 返回值大于0則str1大于str2,返回值等于0則str1等于str2,返回值小于0則str1小于str2 System.out.println("str1和str2比較結果:" + str1.compareTo(str2)); // 2、compareToIgnoreCase(String str):比較兩個字符串的大小,忽略大小寫 // 返回值大于0則str1大于str2,返回值等于0則str1等于str2,返回值小于0則str1小于str2 System.out.println("str1和str2忽略大小寫比較結果:" + str1.compareToIgnoreCase(str2)); // 3、equals(Object obj):比較字符串的內容是否相同 // 返回值等于true則str1等于str2,返回值等于false則str1不等于str2 System.out.println("str1和str2比較結果:" + str1.equals(str2)); // 4、equalsIgnoreCase(String anotherString):與equals方法類似,忽略大小寫 // 返回值等于true則str1等于str2,返回值等于false則str1不等于str2 System.out.println("str1和str2忽略大小寫比較結果:" + str1.equalsIgnoreCase(str2)); } }
6.3、字符串截取
public class StringTest { public static void main(String[] args) { String str = "hello world !!!"; // 1、substring(int beginIndex):返回一個新的字符串,它是此字符串的從beginIndex開始截取到最后的一個子字符串。 System.out.println(str.substring(6)); // 2、substring(int beginIndex, int endIndex) :返回一個新字符串,它是此字符串從beginIndex開始截取到endIndex(不包含)的一個子字符串。 System.out.println(str.substring(6, 11)); } }
6.4、字符串查找
public class StringTest { public static void main(String[] args) { String str = "hello hello world !!!"; // 1、indexOf(String str):返回指定子字符串在此字符串中第一次出現處的索引 System.out.println(str.indexOf("hello")); // 2、indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出現處的索引,從指定的索引開始 System.out.println(str.indexOf("hello", 5)); // 3、lastIndexOf(String str):返回指定子字符串在此字符串中最右邊出現處的索引 System.out.println(str.lastIndexOf("hello")); // 4、lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出現處的索引,從指定的索引開始反向搜索 System.out.println(str.lastIndexOf("hello", 5)); } }
6.5、字符串替換
public class StringTest { public static void main(String[] args) { String str = "hello world !!!"; // 1、replace(char oldChar, char newChar):返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所 oldChar 得到的。 System.out.println(str.replace('l', 'm')); // 2、replace(CharSequence target, CharSequence replacement):使用指定的字面值替換序列替換此字符串所匹配字面值目標序列的子字符串。 System.out.println(str.replace("world", "china")); // 3、replaceAll(String regex, String replacement):使用給定的 replacement 替換此字符串所匹配給定的正則表達式的子字符串。 String str1 = "www.baidu.com"; System.out.println("匹配成功返回值:" + str1.replaceAll("(.*)baidu(.*)", "taobao")); System.out.println("匹配失敗返回值:" + str1.replaceAll("(.*)jingdong(.*)", "taobao")); // 4、replaceFirst(String regex, String replacement):使用給定的 replacement 替換此字符串匹配給定的正則表達式的第一個子字符串。 String str2 = "hello world, I am from world。"; System.out.println("返回值:" + str2.replaceFirst("world", "china")); System.out.println("返回值:" + str2.replaceFirst("(.*)world(.*)", "china")); } }
6.6、字符串匹配
public class StringTest { public static void main(String[] args) { String str = "www.baidu.com"; // 1、matches(String regex):告知此字符串是否匹配給定的正則表達式。 System.out.println(str.matches("(.*)baidu(.*)")); // 2、endsWith(String suffix):測試此字符串是否以指定的后綴結束 System.out.println(str.endsWith(".com")); // 3、startsWith(String prefix):測試此字符串是否以指定的前綴開始 System.out.println(str.startsWith("www.")); // 4、startsWith(String prefix, int toffset):測試此字符串從指定索引開始的子字符串是否以指定前綴開始 System.out.println(str.startsWith("www.", 3)); // 5、contains(CharSequence s):當且僅當此字符串包含指定的 char 值序列時,返回 true System.out.println(str.contains("baidu")); }
6.7、字符串拆分
public class StringTest { public static void main(String[] args) { String str = "www.baidu.com"; // 1、split(String regex):根據給定正則表達式的匹配拆分此字符串。 String[] strs1 = str.split("\\."); System.out.print("拆分結果:"); for (int i = 0; i < strs1.length; i++) { System.out.print(strs1[i] + " "); } System.out.println(); // 2、split(String regex, int limit):根據匹配給定的正則表達式來拆分此字符串,最多不超過limit個,如果超過了,剩下的全部都放到最后一個元素中。 String[] strs2 = str.split("\\.", 2); System.out.print("拆分結果:"); for (int i = 0; i < strs2.length; i++) { System.out.print(strs2[i] + " "); } System.out.println(); } }
7、String與其它結構的轉換
7.1、與基本數據類型、包裝類之間的轉換
String --> 基本數據類型、包裝類:調用包裝類的靜態方法:parseXxx(str) 基本數據類型、包裝類 --> String:調用String重載的valueOf(xxx)
public class StringTest { public static void main(String[] args) { // 字符串轉基本數據類型 String str1 = "123"; int num = Integer.parseInt(str1); // 基本數據類型轉字符串 String str2 = String.valueOf(num); String str3 = num + ""; } }
7.2、與字符數組之間的轉換
String --> char[]:調用String的toCharArray() char[] --> String:調用String的構造器
public class StringTest { public static void main(String[] args) { String str1 = "abc123"; // 字符串轉字符數組 char[] charArray = str1.toCharArray(); for (int i = 0; i < charArray.length; i++) { System.out.println(charArray[i]); } // 字符數組轉字符串 char[] arr = new char[]{'h', 'e', 'l', 'l', 'o'}; String str2 = new String(arr); System.out.println(str2); } }
7.3、與字節數組之間的轉換
編碼:String --> byte[]:調用String的getBytes() 解碼:byte[] --> String:調用String的構造器 編碼:字符串 -->字節 (看得懂的數據 --> 看不懂的二進制數據) 解碼:編碼的逆過程,字節 --> 字符串 (看不懂的二進制數據 --> 看得懂的數據) 說明:解碼時,要求解碼使用的字符集必須與編碼時使用的字符集一致,否則會出現亂碼。
public class StringTest { public static void main(String[] args) throws UnsupportedEncodingException { String str1 = "abc123中國"; //使用默認的字符集,進行編碼。 byte[] bytes = str1.getBytes(); System.out.println(Arrays.toString(bytes)); //使用gbk字符集進行編碼。 byte[] gbks = str1.getBytes("gbk"); System.out.println(Arrays.toString(gbks)); //使用默認的字符集,進行解碼。 String str2 = new String(bytes); System.out.println(str2); String str3 = new String(gbks); //出現亂碼。原因:編碼集和解碼集不一致! System.out.println(str3); String str4 = new String(gbks, "gbk"); //沒出現亂碼。原因:編碼集和解碼集一致! System.out.println(str4); } }
7.4、與StringBuffer、StringBuilder之間的轉換
String --> StringBuffer、StringBuilder:調用StringBuffer、StringBuilder構造器 StringBuffer、StringBuilder --> String:調用String構造器;StringBuffer、StringBuilder的toString()
public class StringTest { public static void main(String[] args) { String str1 = "hello world"; // String轉StringBuffer、StringBuilder StringBuffer sb1 = new StringBuffer(str1); StringBuilder sb2 = new StringBuilder(str1); // 字符數組轉字符串 String str2 = sb1.toString(); String str3 = sb2.toString(); } }
8、JVM中字符串常量池存放位置說明
jdk 1.6 (jdk 6.0 ,java 6.0):字符串常量池存儲在方法區(永久區) jdk 1.7:字符串常量池存儲在堆空間 jdk 1.8:字符串常量池存儲在方法區(元空間)
【奔跑吧!JAVA】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/265241
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。