String常用的三種構造方法
public static void main(String[] args) {//1.使用常量字符串構造String s1 = "1.Hello world";System.out.println(s1);//2.使用new關鍵字構造String s2 = new String("2.Hello world");System.out.println(s2);//3。使用字符數組構造char[] ch = {'H','e','l','l','o'};String s3 = new String(ch);System.out.println(s3);//輸出字符串長度System.out.println(s1.length());System.out.println("hello".length());//字符串中這種寫法也是ok的//判斷字符串長度是否為0System.out.println(s1.isEmpty());//輸出false/*String s4 = null;System.out.println(s4.isEmpty());//會報空指針錯*/String s5 = "";//字符串為0返回trueSystem.out.println(s5.isEmpty());}
- 字符串是引用型變量,變量需要用“”一對雙引號引起來?
- null和字符串為0不是一個概念
介紹String對象中四種常見的比較
日常中,遇到字符串比較的情況還是比較多的;"=="對于String這種引用型變量來說,比較的是一個哈希地址,是比較不了字符串中的內容是否相等的:
public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("abc");String s3 = s1;System.out.println(s1 == s2);//falseSystem.out.println(s1 == s3);//true}
由結果可見,s1和s2是兩個不同的對象,自然的地址也不同,用"=="去比較輸出的結果固然是false,可以理解成"=="比較兩個引用變量引用的是否為同一個對象;
那么如何可以比較字符串中的內容是否相等呢?我們引出了equals()方法(按照字典序比較);在使用equals的時候,String類重寫了父類Object中equals()方法,使得可以比較字符串內的內容。
而equals方法返回的是一個布爾值,我們并不知道字符串之間的關系,所以我們引入了返回int類型的compareTo()方法,也是同樣的按照字典序比較:
?
值得注意的是它的比較規則:
- 先按照字典次序大小比較,如果出現不等的字符,直接返回這兩個字符的大小差值
- s1>s2返回大于0的數字;s1=s2返回0;s1<s2返回小于0的數字
- 返回值是對應字符ASCII碼的差值
那么如果我們需要忽略大小寫的比較又該用哪一個方法呢?比如我們文件名或擴展名檢查、用戶名或密碼的校驗,通常都是需要忽略大小寫來增加靈活性的,可以用compareToIgnoreCase(String str) 方法;這個方法和compareTo()的使用方法和規則是一樣的,只是它忽略大小寫去對字符串進行比較;
字符串查找String提供的部分常用方法
以下是部分常用的方法及使用的規則案例:
?
?
字符串轉換
1.其他數據類型轉換成字符串用?valueOf方法:
?
2.字符串的大小寫轉換toUpperCase()&toLowerCase()
3.?字符串轉數組用toCharArray()
public static void main(String[] args) {//字符串轉數組String s1 = "hello world";char[] ch = s1.toCharArray();for (int i = 0; i < ch.length; i++) {System.out.println(ch[i]);}//數組轉字符串,直接使用String轉就好String s2 = new String(ch);System.out.println(s2);}
?4.格式化字符串用到format()
?字符串的替換:
注意:針對這種直接賦值沒有對象的字符串,在Java中會又一塊特殊的字符串常量池,存放他們;字符串常量池中不會存在兩個一樣的字符串,如果兩個字符串一樣的畫它們的地址值是一樣的;
字符串拆分
public static void main(String[] args) {String str = "abc def Good evening";//1.將字符串全部拆分String[] result = str.split(" ");//按空格for (String res:result){System.out.println(res);}System.out.println("==========================");//2.部分拆分String[] result2 = str.split(" ",3);for (String res2:result){System.out.println(res2);}//3.有特殊字符的字符串分割要記得加上轉義符String str2 = "192.168.1.1" ;String[] result3 = str.split("\\.") ;//轉義符for(String s: result) {System.out.println(s);}}
?
- 部分拆分時,程序不會根據字符串的長短去平均分;而是根據先后順序,分成相應的份數,后面的就不分了
- 有些特殊字符作為分割符可能無法正確切分, 需要加上轉義
- 字符"|","*","+"都得加上轉義字符,前面加上 "\\"
- 如果是 "\"需要拆分 ,那么就得寫成 "\\\\"
- 如果一個字符串中有多個分隔符,可以用"|"作為連字符
?以上所有涉及到修改字符串內容的操作都是創建一個新對象,改變的是新對象,而不是在原有的字符串上改動,不管是字符串轉換、格式化又或時字符串截取等等,原有的字符串還是原來的,而修改后的字符串是一個新的字符串對象;
似上面這種修改字符串的情況,如果放在循環里面每次循環都會創建一個新的對象,產生比較多的臨時對象,對程序來說效率是比較低的,我們在使用的時候也需要盡量避免直接對String類型對象進行修改,因為String類是不能修改的,所有的修改都會創建新對象,效率非常低下。
?那么如果想要修改字符串中內容,該如何操作呢?于是有了StringBuilder和StringBu?er類
StringBuilder和StringBu?er類
StringBuilder和StringBu?er類是為了方便字符串的直接修改而產生的這兩個類大部分功能是相同的,不同的是StringBuilder會比較經常用在單線程的問題上,而StringBu?er會用更多的應用到多線程的問題上。下面是一些比較常用的方法,大部分都是和String當中的方法重合的
String、StringBu?er、StringBuilder的區別
-
String是字符串常量不可變的,一旦創建就不能修改,任何對String的操作都會創建新的字符串對象。而StringBuilder和StringBu?er是可變的。
-
StringBu?er采用同步處理,屬于線程安全操作;而StringBuilder未采用同步處理,屬于線程不安全操作;在安全操作方面StringBu?er>StringBuilder>String
-
StringBuilder和StringBu?er類大部分功能相同
感謝大家閱讀📚點贊👍收藏?評論?關注?
博客主頁: 【長毛女士-CSDN博客】
水平有限,歡迎大家糾錯啦?