Java基礎-常見類之String類
阿新 • • 發佈:2018-11-23
一、String類是什麼
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L;
由第一段原始碼可知,String是一個final類,底層實現是final的字元陣列,一旦建立,無法改變。
字串是常量;他們的值在建立之後不能改變。字串緩衝區支援可變的字串。因為String物件是不可變的,所以可以共享。
二、如何建立
String s1 = "abc";//字串常量池中建立一次(如不存在)
String s2 = new String("abc");//字串常量池中和堆中各建立一次
// 更多的構造器,請參見API
關於一個比較經典的面試題:String s1 = new String("hello");建立了幾個物件的問題,可以參考原始碼中相關的構造器的原始碼,結合String的記憶體分析,便可以從深入進行理解了!
關於這個問題,詳見:http://www.cnblogs.com/dangzhenjiuhao/p/4585389.html
三、常用方法
第一部分:基本都是見名知意,詳細的介紹,請參見API
程式碼示例:
@Test public void test1() { String str = "HelloWorld"; // length()——字串的長度 System.out.println(str.length());// 10 // charAt(int)——指定索引處(索引從0開始)的char System.out.println(str.charAt(2));//1 // equals(Object)——比較字串的內容;equalsIgnoreCase不區分大小寫的比較 System.out.println("HelloWorld".equals(str));// true // indexOf()——索引操作(包含幾個過載方法);lastIndexOf()為映象操作,不再贅述 System.out.println(str.indexOf(2)); // -1(不存在2的字元) System.out.println(str.indexOf("llo")); // 2 // startsWith()——是否以指定字串開頭;endsWith()——為映象操作 System.out.println(str.startsWith("ello", 1));// true // regionMatches()——與指定字串的區域匹配,包含兩個過載方法,詳細介紹參見API System.out.println(str.regionMatches(2, "hello", 2, 2));// true }
第二部分
程式碼例項:
@Test public void test2() { String str = "more love"; // subString()——字串擷取,兩個過載方法都是左閉的(兩個引數的右開) System.out.println(str.substring(5, 8));// lov // replace()——進行替換操作;replaceAll是匹配正則表示式的,詳細請參見API System.out.println(str.replace('o', 'e'));// mere leve // trim()——去除前導空白和尾部空白 System.out.println(str.trim());// mere leve // concat()——連線字串 System.out.println(str.concat(" for you")); // more love for you // split()——根據正則表示式分割字串,拆分為String[] System.out.println("a,b,c,d,e".split(",").length);// 5 }
以下幾個練習題可以試試!
// 1.如何實現自己的trim // 通過charAt進行遍歷,從頭開始遍歷到到非空格,再從尾部做一遍,subString()取值即可(注意異常情況) // 2.反轉字串中的指定的部分 // 將字串分割成3份,一份前面的,一份需要反轉的,一份後面的,再將第2部分反轉,新增,再組合成新的字串 // 3.獲取一個字串在另外一個字串中出現的次數 // 通過indexOf(String)的迴圈判斷,不斷向後判斷,直到末尾 // 4.找出兩個字串中最大相同子串 // 將短的串依次遞減(第一位減掉,比較;最後一位減掉,比較,整數前兩位減掉,迴圈...)看長串是否包含
String類與基本資料型別的轉換:
@Test public void test3() { String str = "123"; // String轉基本資料型別,通過包裝類的parse系列方法 int i = Integer.parseInt(str); // 基本資料型別轉String,簡單的可以直接+"",通過方法是String.valueOF(),或者toString() String s = String.valueOf(i); // String與位元組陣列的轉換:str.getBytes()方法得到位元組陣列;再通過String構造器將位元組陣列轉為字串 byte[] bytes = str.getBytes(); String s1 = new String(bytes); //String與字元陣列的轉換:str.toCharArray()方法,char[]轉String同樣是可以通過構造器 char[] chars = str.toCharArray(); String s2 = new String(chars); }
四、可變字串StringBuffer與StringBuilder
其中,StringBuffer是執行緒安全的,而StringBuilder是執行緒不安全的,但它效率更高
基本構造器:
StringBuffer sb = new StringBuffer(); StringBuffer sb2 = new StringBuffer("abc");
// 當然它的底層還是字元陣列,但它有容量的概念,修改的時候是可以改變容量的
常用的方法:
@Test public void test4() { StringBuffer sb = new StringBuffer("abc"); // append()——追加 System.out.println(sb.append("def").toString());//"abcdef" // insert()——在指定位置插入 System.out.println(sb.insert(1, "bb"));//abbbcdef // reverse()——反轉 System.out.println(sb.reverse().toString());//fedcbbba // 其它和字串相類似的方法不再贅述 }
,