前言 從去年八月末開始工作一年了,有了大半年的java開發經驗,自認為比在大學時候編碼能力強了很多,但是基礎方面叫不准的地方感覺越來越多了 (;´д`)ゞ 所以,我準備把這些問題以及工作中遇到的問題總結,記錄下來,造福自己和大家~ヾ(o・ω・)ノ 當然,如果大家發現我哪裡寫的有錯誤,歡迎在下方評論指 ...
前言
從去年八月末開始工作一年了,有了大半年的java開發經驗,自認為比在大學時期編碼能力強了很多,但是基礎方面概念模糊的地方感覺越來越多了 (;´д`)ゞ
所以,我準備把這些問題以及工作中遇到的問題總結,記錄下來,造福自己和大家~ヾ(o・ω・)ノ 當然,如果大家發現我哪裡寫的有錯誤,歡迎在下方評論指出來。
那我們開始吧!
String
1.String是一個final類,不能被繼承
2.String底層維護是一個數組,靜態創造一個字元串時,此字元串存在於String池,當下一個String對象也是靜態創建的時候,先去String池裡找是否有和新對象一樣的,
如果有,指向新對象,否則創建新對象。
下麵內容引用 https://blog.csdn.net/weixin_38722500/article/details/81134952 以解釋第二條
(1)
1 String str1 = "abc"; 2 System.out.println(str1 == "abc");
步驟:
1)棧中開闢一塊空間存放引用str1
2)String池中開闢一塊空間,存放String常量"abc"
3)引用str1指向池中String常量"abc"
4)str1所指代地址即常量"abc"所在地址,輸出為true
(2)
1 String str2 = new String("abc"); 2 System.out.println(str2 == "abc");
步驟:
1)棧中開闢一塊空間存放引用str2
2)堆中開闢一塊空間存放一個新建的String對象"abc"
3)引用str2指向堆中的新建的String對象"abc"
4)str2所指代地址即常量"abc"所在地址,而常量"abc"地址在池中,輸出為false
(3)
1 String str3 = new String("abc"); 2 System.out.println(str3 == str2);
步驟:
1)棧中開闢一塊空間存放引用str3
2)堆中開闢一塊新空間存放另外一個(不同於str2所指)新建的String對象
3)引用str3指向另外新建的那個String對象
4)str3和str2指向堆中不同的String對象,地址也不相同,輸出為false
(4)
1 String str4 = "a" + "b"; 2 System.out.println(str4 == "ab");
步驟:
1)棧中開闢一塊空間存放引用str3
2)根據編譯器合併已知量的優化功能,池中開闢一塊空間,存放合併後的String常量"ab"
3)引用str4指向池中常量"ab"
4)str4所指即池中常量"ab",輸出為true
(5)
1 final String s = "a"; 2 String str5 = s + "b"; 3 System.out.println(str5 == "ab");
同(4)
(6)
1 String s1 = "a"; 2 String s2 = "b"; 3 String str6 = s1 + s2; 4 System.out.println(str6 == "ab");
步驟:
1)棧中開闢一塊空間存放引用s1,s1指向池中String常量"a"
2)棧中開闢一塊空間存放引用s2,s2指向池中String常量"b"
3)棧中開闢一塊空間存放引用str5
4)s1 + s2通過StringBuilder的最後一步toString()方法還原一個新的String對象"ab",因此堆中開闢一塊空間存放此對象
5) 引用str6指向堆中(s1 + s2)所還原的新String對象
6) str6指向的對象在堆中,而常量"ab"在池中,輸出為false
(7)
1 String str7 = "abc".substring(0, 2);
步驟:
1)棧中開闢一塊空間存放str7
2)substring()方法還原一個新的String對象"ab"(不同於str6所指),堆中開闢一塊空間存放此對象
3)引用str7指向堆中的新String對象
(8)
1 String str8 = "abc".toUpperCase();
步驟:
1)棧中開闢一塊空間存放str8
2)toUpperCase()方法還原一個新的String對象"ABC",池中並未開闢新的空間存放String常量"ABC"
3)引用str8指向堆中的新String對象
呼,這部分終於結束了,我們繼續(ง •̀_•́)ง
3.幾個常用方法:
1 //1.charAt()方法:根據下標返回對應字元 2 char c = str.charAt(2); 3 System.out.println(c); 4 5 //2.substring()方法:截取字元串 6 1<=string<4 (左邊包含右邊不包含) 7 String s = "abcde"; 8 String s1= s.substring(1,4); 9 System.out.println(s1); 10 11 //3.toUpperCase():變大寫 toLowerCase():變小寫 12 String s = "aBc"; 13 System.out.println(s.toUpperCase()); 14 System.out.println(s.toLowerCase()); 15 16 //4.trim():去除字元串兩邊空格 17 String s1 = " abcde "; 18 String s2 = s1.trim(); 19 System.out.println(s2.length); 20 System.out.println(s1.length); 21 System.out.println(s1.charAt(0)); 22 23 //5.indexOf():搜索指定字元串,如果能找到返回起始下標, 24 //找不到返回-1 , 不可以隔著查 如搜索bd 會返回-1 25 String s = "abcde"; 26 int a = s.indexOf("bc"); 27 System.out.println(a); 28 29 //6.startsWith():判斷是否以某字元串開頭 30 //endsWith():判斷是否以某字元串結尾 31 String s = "abcde"; 32 boolean a = s.startsWith("ab"); 33 boolean b = s.endsWith("de"); 34 System.out.println(a); 35 System.out.println(b); 36 37 //7.字元串有兩種創建方法 38 //字面值賦值:字元串使用頻率 太高,java對String做了優化 39 //建議這樣: 40 Sting s1 = "abc"; 41 //不建議new關鍵字創建: 42 String s2 = new String("abc"); 43 44 //8.判斷字元串相等的方法 45 boolean boo = s1.equals(s2); 46 System.out.println(boo); 47 48 //9. = , == , equald的區別: 49 // = :賦值 50 // == :比較對象是否相同 51 // equals :比較兩個對象內容是否相同
4.String ,StringBuffer 以及 StringBuilder區別:
1)String長度不可以改變
2)StringBuffer和StringBuilder長度可以改變
3)StringBuffer線程安全,執行效率低
4)StringBuilder線程不安全,執行效率高
好了! 以上就是目前我在String方面概念模糊的地方了!希望能夠幫到大家!
我們下期再見!