表明字符串, java程序中的全部字符串字面值(如, "abc")都是此類的實例實現java
String是一個final類,表明不可變的字符序列面試
字符串是常量是用雙引號引發來的,他們的值再建立後不能夠修改正則表達式
String對象的字符內容是存儲再一個字符數組Value[]中的數組
表現:ide
String name = "hello"; String的值底層都是存儲再char [] 數組內 // 本質上this.value = new char[0]; string s1= new String() ; // this.value = ori.value String s2 = new String(String ori)
String常量: 建立是不帶new String name = "老王";oop
很是量: 建立是帶new : String name = new String("老王");測試
字符串常量: String name = "老王"; 字符串很是量對象: String name = new String("老王");
放置的位置:
字符串很是量放置在常量池內, 常量池內相同的值共享
很是量對象放置在堆中,值不能夠共享
存儲位置不一樣: ui
字符串很是量放置在常量池內, 常量池內相同的值共享
很是量對象放置在堆中,值不能夠共享
常量池內的值是能夠共享的 咱們定義的時候能夠不用再開闢其他的空間了,這種方法省消耗this
String再建立的時候value存儲的位置也是不一樣的,雖然底層都是默認存儲再char[] 中,可是 其存儲的位置有時也是不一樣的編碼
// 經過字面量定義的方式, 此時的s1的數據 聲明再方法區中字符串常量池中 String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); // true // new+構造器的方式此時的s3保存的地址值 是數據在堆中開闢的新空間保存的地址值 String s3 = new String("javaEE");
常量對象和很是量對象既然存儲不一樣那麼值確定不能用==
常量對象很是量對象練習題:
求出下面輸出的內容
// 經過字面量的定義方式: 此時的s1 和s2 定義在字符串常量池中 String s1 = "javaEE"; String s2 = "hadoop"; String s3 = "javaEEhadoop"; String s4 = "javaEE"+"hadoop"; String s5 = s1 +"hadoop"; String s6 = "javaEE"+s2; String s7 = s1+s2; String s8 = s6.intern(); System.out.println(s3 == s4); // System.out.println(s3 == s5); // System.out.println(s3 == s6); // System.out.println(s3 == s7); // System.out.println(s5 == s6); // System.out.println(s5 == s7); // System.out.println(s6 == s7); // System.out.println(s3 == s8); //
結果:
true false false false false false false true
由於攜帶變量名的都是存儲在堆空間中的不是存儲在常量池中,由於變量名拿到的都是講指向堆中的地址值
結論:
1: 常量與常量的拼接在常量池內,且常量池內不會存儲相同的內容的常量,同一個常量池中的常量地址都相同 2: 只要一個是變量,那麼結果就是堆中,堆中的值都是地址不一樣的 3: 若是拼接的結果調用intern()方法,返回值就在常量池中
String 的使用 1:String的聲明是使用一對 " " 引發來表示的 2: String 的聲明爲final的不可被繼承 3: String 實現了Serializable接口 可序列化, 表示字符串是支持序列化 實現了Comparable接口 表示String能夠比較大小 4: String在內部定義了final, char[] value用於存儲字符串數據 5: String表明一個不可變的字符序列, 簡稱不可變 體現: a: 當對字符串從新賦值時 須要重寫指定內存區域賦值, 不能使用原有的value進行賦值 b: 當對現有的字符串進行鏈接操做時從新賦值後, 也須要從新指定內存區域 c: 當調用String的replace()方法修改字符串時,也必須從新指定內存區域 *** 6: 經過字面量的方式(區別於new) 給一個字符串賦值 String name = "老王";此時的字符串聲明在字符串常量中 7: 字符串常量池中是不會存儲相同內容的字符串的
面試題:
1:
String s = new String("abc"); 方式建立對象, 在內存中建立了幾個對象
建立了兩個對象, 第一個是堆空間中new的結構 第二個是char[] 數組 ,對應的常量池中的數據"abc"
2:
public class StringTestTwo { public static void main(String[] args) { StringTT stringTT = new StringTT(); stringTT.change(stringTT.str, stringTT.ch); System.out.println(stringTT.str+"and"); stringTT.change("laowang", new char[]{'0'}); System.out.println(stringTT.ch); // best } } class StringTT{ String str = new String("good"); char [] ch = {'t', 'e', 's', 't'}; public void change(String str , char [] ch){ str = "test ok"; ch[0] = 'b'; System.out.println(str); } }
解答:
test ok goodand 由於String是不可變的你的變了 可是個人仍然不變 test ok best
int length():返回字符串的長度: return value.length char charAt(int index): 返回某索引處的字符return value[index] boolean isEmpty():判斷是不是空字符串:return value.length == 0 String toLowerCase():使用默認語言環境,將 String 中的全部字符轉換爲小寫 String toUpperCase():使用默認語言環境,將 String 中的全部字符轉換爲大寫 String trim():返回字符串的副本,忽略前導空白和尾部空白 boolean equals(Object obj):比較字符串的內容是否相同 boolean equalsIgnoreCase(String anotherString):與equals方法相似,忽略大 小寫 String concat(String str):將指定字符串鏈接到此字符串的結尾。 等價於用「+」 int compareTo(String anotherString):比較兩個字符串的大小 a.compareTo(b) 返回爲正數表示a1>a2, 返回爲負數表示a1<a2, 返回爲0表示a1==a2; String substring(int beginIndex):返回一個新的字符串,它是此字符串的從 beginIndex開始截取到最後的一個子字符串。 String substring(int beginIndex, int endIndex) :返回一個新字符串,它是此字 符串從beginIndex開始截取到endIndex(不包含)的一個子字符串。 boolean endsWith(String suffix):測試此字符串是否以指定的後綴結束 boolean startsWith(String prefix):測試此字符串是否以指定的前綴開始 boolean startsWith(String prefix, int toffset):測試此字符串從指定索引開始的 子字符串是否以指定前綴開始 boolean contains(CharSequence s):當且僅當此字符串包含指定的 char 值序列 時,返回 true int indexOf(String str):返回指定子字符串在此字符串中第一次出現處的索引 int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出 現處的索引,從指定的索引開始 int lastIndexOf(String str):返回指定子字符串在此字符串中最右邊出現處的索引 int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最後 一次出現處的索引,從指定的索引開始反向搜索 注:indexOf和lastIndexOf方法若是未找到都是返回-1 String replace(char oldChar, char newChar):返回一個新的字符串,它是 經過用 newChar 替換此字符串中出現的全部 oldChar 獲得的。
String replace(CharSequence target, CharSequence replacement):使 用指定的字面值替換序列替換此字符串全部匹配字面值目標序列的子字符串。
String replaceAll(String regex, String replacement) : 使 用 給 定 的 replacement 替換此字符串全部匹配給定的正則表達式的子字符串。 String replaceFirst(String regex, String replacement) : 使 用 給 定 的 replacement 替換此字符串匹配給定的正則表達式的第一個子字符串。 boolean matches(String regex):告知此字符串是否匹配給定的正則表達式。 String[] split(String regex):根據給定正則表達式的匹配拆分此字符串。 String[] split(String regex, int limit):根據匹配給定的正則表達式來拆分此 字符串,最多不超過limit個,若是超過了,剩下的所有都放到最後一個元素中。
eg:
String.length() // 求出字符串的長度
// 求出String 字符串的長度 String.length() System.out.println(name.length()); // 2 System.out.println(EnglishName.length()); // 7
String.charAt() 返回指定索引中字符串中的內容
// 返回指定索引中的字符串中的字符 String.charAt(index); 不要覺得只能懟字符串中的字符使用 還能夠對漢字使用 System.out.println(name.charAt(1)); // 王 System.out.println(EnglishName.charAt(3)); // w
isEmpty() 判斷字符串是不是空
// isEmpty() 判斷字符串是不是空 String s1 = ""; System.out.println(name.isEmpty()); // false System.out.println(s1.isEmpty()); // true
toLowerCase() 字符串全部的字母都轉爲小寫
// toLowerCase() 將String中的字符所有小寫 String s2 = "Laowang"; String lowerCase = "你好WOde"; System.out.println(lowerCase.toLowerCase()); // 你好wode System.out.println(name.toLowerCase()); // 老王 漢字不會報錯 System.out.println(s2.toLowerCase()); // L小寫 laowang
toUpperCase() 字符串中全部的字母都大寫
// toUpperCase() 將String中的字符所有大寫 System.out.println(EnglishName.toUpperCase()); // LAOWANG
trim() 祛除首尾空格
// trim() 去除字符串首尾的空格 String s3 = " ni "; System.out.println(s3.trim());
equals() 比較兩個字符串內容是否相同
== 比較的是內存地址值, equals() 比較的是大小
// equals() 比較字符串中的內容是否相同 System.out.println(name.equals(EnglishName)); // false
equalsIgnoreCase() 也是比較兩個字符串大小,忽略大小寫
// equalsIgnoreCase() 和equals()相同只是忽略大小寫 String s4 = "LAOLI"; String s5 = "laoli"; System.out.println(s4.equalsIgnoreCase(s5)); // true
concat() 拼接,相等於"+",把兩個字符串相加一塊兒
// concat() // 拼接 把兩個字符串拼接再一塊兒 ,至關於+ System.out.println(name.concat(EnglishName)); // 老王laowang
contains(String str) 匹配, 判斷字符串中是否有str
// contains() 判斷當前字符串是否包含此字符串 String testOne = "nishi老王嗎?"; System.out.println(testOne.contains("老王")); // true
indexOf(int n) 求出字符第一次出現的下標, 求出n在字符串中的下標位置
// indexOf("str")此字符串再當前字符串中第一次出現的位置 返回下標
String str1 = "helloWorld";
System.out.println(str1.indexOf("ll")); // 2
indexOf() 也能夠判斷這字符串在當前的位置是多少
// indexOf("str", int) 指定字符在此字符串中第一次出現的位置 不對就是-1 System.out.println(str1.indexOf("ll",2)); // 2
lastIndexOf() // 當前字符在字符串中最後出現的位置
//lastIndexOf() // 當前字符在字符串中的最後位置 返回下標 System.out.println(name.lastIndexOf("王")); // 1
替換: replace() 替換一個 replcaeAll() 替換全部
replace(String str, String str1) 替換, 將當前字符串中的str替換爲str1
replaceAll(String str, String str1) 將當前字符串中的 全部str都替換爲str1
String replcaeValue = "我是你的老王爸爸"; System.out.println(replcaeValue.replace("我是", "他是")); // 他是你的老王爸爸, 替換一個內容 System.out.println(replcaeValue.replaceAll("爸","奶")); // 我是你的老王奶奶 , 替換全部,把爸都替換成奶
subString(int, start, int end)截取字符串, 從當前字符串中截取中子字符串 從下標start截取到下標end
String replcaeValue = "我是你的老王爸爸"; System.out.println(replcaeValue.substring(1)); // 從下標1到最後, 是你的老王爸爸 System.out.println(replcaeValue.substring(0,3)); // 下標0-3 我是你
endsWith(String str) 測試當前字符串是否是以str結尾的
String endsWithValue = "老王你是"; System.out.println(endsWithValue.endsWith("你")); // false System.out.println(endsWithValue.endsWith("是")); // true
startsWith(String str) 測試當前字符串是否是以str開始的
System.out.println(endsWithValue.startsWith("老")); // true System.out.println(endsWithValue.startsWith("王")); // false
startsWith(String str, int n) 亦能夠判斷某下標是不是某個字符串, 判斷當前字符串的下標n是不是str
System.out.println(endsWithValue.startsWith("你", 2)); // true 當前字符串的下標2是你
String 與基本數據類型, 包裝類的之間的轉換
String ----> 基本數據類型 包裝類 : 調用包裝類的parseXXX(str)
基本數據類型 包裝類 ----> String 調用String重載的ValuesOf(xxx)
String age = "123"; int age1 = Integer.parseInt(age); System.out.println(age1); System.out.println(String.valueOf(age1));
字符串轉化爲char 數組,
String ---> char [] 調用String的toCharArray() char [] ----> String 調用String的構造器
eg:
// char [] ---> String 調用String 的構造器 char [] chars = new char []{'b', 'v'}; String charStr = new String(chars); System.out.println(charStr); // String ---> char [] 調用String的toCharArray() String strChar = "老王"; char [] chars1 = strChar.toCharArray(); System.out.println(chars1); // 老王
// String ---> byte [] 調用String的getBytes()
// byte[] ---> String 調用String的構造器
/*
. 編碼: String ----> 字節 byte [] (看得懂--->看不懂)
解碼: byte [] 字節----> String (看不懂---> 看得懂)
*/
String str4 = "abc中國";
byte [] bytes = str4.getBytes();
System.out.println(Arrays.toString(bytes));
// byte [] ---> String
System.out.println(new String(bytes));
.
習題:
2:
public class StrExer { public static void main(String[] args) { ReplcaeOne replcaeOne = new ReplcaeOne(); System.out.println(replcaeOne.replcaeBuffer()); // abfedcg System.out.println(replcaeOne.replcaeChar()); // abfedcg } } class ReplcaeOne { // 將一個字符串進行反轉。將字符串中指定部分進行反轉。好比「abcdefg」反轉爲」abfedcg」 String str = "abcdefg"; String strStart = str.substring(0, 2); String strEnd = str.substring(6); String strSub = str.substring(3, 6); // StringBuffer 解法 public String replcaeBuffer() { StringBuffer stringBuffer = new StringBuffer(strSub); strSub = stringBuffer.reverse().toString(); // 翻轉後再轉爲String return strStart.concat(strSub).concat("c").concat(strEnd); } // char [] 解法 public String replcaeChar() { String reverse = ""; char [] chars = strSub.toCharArray(); for (int i = chars.length -1; i >=0 ; i--) { // 把全部的 內容反着提取出來 reverse += chars[i]; } return strStart.concat(reverse).concat("c").concat(strEnd); } }
1. 模擬一個trim方法,去除字符串兩端的空格。 2. 將一個字符串進行反轉。將字符串中指定部分進行反轉。好比「abcdefg」反 轉爲」abfedcg」 3. 獲取一個字符串在另外一個字符串中出現的次數。 好比:獲取「 ab」在 「abkkcadkabkebfkabkskab」 中出現的次數 4.獲取兩個字符串中最大相同子串。好比: str1 = "abcwerthelloyuiodef「;str2 = "cvhellobnm" 提示:將短的那個串進行長度依次遞減的子串與較長的串比較。 5.對字符串中字符進行天然順序排序。 提示: 1)字符串變成字符數組。 2)對數組排序,選擇,冒泡,Arrays.sort(); 3)將排序後的數組變成字符串。