天天看點

Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人

Java的基礎知識回顧之字元串

一、引言

  很多人喜歡在前面加入贅述,事實上去技術網站找相關的内容的一般都應當已經對相應知識有一定了解,是以我不再過多贅述字元串到底是什麼東西,在官網中已經寫得很明确了,字元串實際上是一種特殊的類,内置了一個字元數組(是以你能對它進行下标查找,包括集合的arraylist底層也是一個數組),并附加了很多其他方法,友善我們進行一些操作。有興趣的話可以去百度中查閱相關内容。我事先說好了,本文隻是我用來回憶和複習的一個粗略筆記,以及一些實驗代碼。如果需要學習Java,建議去慕課網或者雲課堂。

二、關于string類型的一些常識

  Java的類基本上都繼承于Object類,也就是都繼承了其中的tostring方法,來辨別其指向的位址,這是因為Java對象名稱實際上隻是一個引用,真正的東西還在堆中。Java的理念來源于C艹,但是字元串的運算符實際上不是重載而是在jvm中動了手腳,Java中任何運算符都不能重載!要細究這個問題就要探究JVM,我對Java虛拟機也是一知半解,是以就不豬鼻子插蔥了。

1.1Java的相關入門基礎

Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人
1 package TheUnity5;
 2 //java中的字元串連接配接通過運算符加号完成,他友善了在字元串換行時候的連接配接
 3 public class Demo1 {
 4 public static void main(String[] args){
 5     String str="the java like skr rap";
 6     String str2="the java like "
 7             + "skr2 rap";//java編譯器不允許一個字元串跨越兩行
 8     System.out.println(str);
 9     System.out.println(str2);//一個顯示效果
10     
11     System.out.println("--------------------");
12     
13     Boolean str3=Boolean.valueOf(false);
14     System.out.println(""+str3);//string連接配接資料類型
15     
16     Object str4=new Object();
17     System.out.println(str4.toString());
18     //通過對照說明了封裝類其實内部已經對tostring進行了重寫
19 }
20 }      
Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人

而事實上很多類的tostring也進行了重寫,格式化輸出的實際上是類的tostring方法

三、字元串的檢索方法

  Java内置了字元串的檢索方法indexof,這個方法經過了重載,允許字元和字元串作為參數,且能夠指定檢索的起始位置,需要注意的是他會傳回取到的第一個比對值然後結束如果你需要檢索所有内容你需要進行一個循環判斷,而這個方法當你檢索的位置超出時,會産生負值。是以在循環判斷的過程中,需要注意很多因素。當然你也可以一個一個用charAt去截取然後再去判斷,事實上從算法的時間複雜度來說,這兩個家夥都是周遊,壞的很。

1.2Java檢索指定字元串的出現位置

Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人
1 package TheUnity5;
 2 //這裡總結字元串的相關檢索方法
 3 public class Demo2 {
 4 public static void main(String[] args){
 5     String str="do you like van♂ 遊戲?";
 6     System.out.println(str);
 7     System.out.println("------------------");
 8     System.out.println("length:"+str.length());
 9     System.out.println(str.indexOf('o'));//這裡傳回的是第一個O的位置。
10     System.out.println(str.indexOf('o',str.length()-1));//這裡傳回從2開始的第一個o的位置,包括2也在檢索範圍内
11     
12     //如果想要獲得所有的指定字元的位置,隻能通過循環的方式
13     talk1(str,'o');
14     talk2(str,'o');
15 }
16 //通過對每一個字元進行比對确定位置
17     public static void talk1(String str,char ch){
18         int size=str.length();
19         for(int i=0;i<size-1;i++){
20             char a=str.charAt(i);
21             if(a==ch){
22                 System.out.print(i+" ");
23             }
24         }
25         System.out.println("talk1結束");
26     }
27 //實際上indexof底層也是周遊比對,但是對安全性做了很多措施
28     public static void talk2(String str,char ch){
29         int i=0;
30         do{
31             i=str.indexOf(ch,i);
32             if(i==str.lastIndexOf(ch)){
33                 System.out.print(i+" ");
34                 break;
35             }
36             if(i>=0){
37                 System.out.print(i+" ");
38                 i++;//注意這個位置
39             }
40         }while(i>=0);
41         System.out.println("talk2結束");
42     }
43 }      
Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人

四、Java的字元串修改操作

  Java實際上是開發者因為感受寫一個機頂盒c++程式非常煩躁下,開發出的一款語言。非常随意,就和它的名字來源于當時喝的咖啡(其實本來是另外一種咖啡但是名字已經被注冊了23333)。是以重複的字元數組裁剪工作被封裝成了對應的方法,這就很nice了,常見的操作有字元串的分割,截取,替換,去空格等,下面是相關的代碼實作和結果。(懶癌入髓,不過這也能夠起到讓你們認真看代碼的效果【理直氣壯.jpg】)

1.3Java的字元串操作

Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人
1 package TheUnity5;
 2 //Java中内置了一些對字元串的相關操作。友善對字元串進行修改
 3 public class Demo3 {
 4 public static void main(String[] args){
 5     //初始字元串
 6     String str=" deep♂ dark♂ fantasy ";
 7     //字元串截取方法substring會産生一個臨時的字元串副本,本質上不會改變原來的字元串
 8     String str1=str.substring(5);
 9     String str2=str.substring(5,11);//不包含第二參數
10     System.out.println(str);
11     System.out.println(str1);
12     System.out.println(str2);
13     System.out.println("------------------------");
14     //去除首尾空格,Java的trim方法不會去除字元串内部的非首尾空格
15     String str3=str.trim();
16     System.out.println(str3+" "+str.length()+" "+str3.length());
17     System.out.println("------------------------");
18     //字元串替換中Java内置了replace方法,但不建議使用因為他會将原字元串是以相同部分全部替換
19     String str4=str.replace('♂', ' ');
20     System.out.println(str);
21     System.out.println(str4);
22     String str5=change(str,"♂"," ",0,str.length());
23     String str6=change(str,"♂"," ",str.indexOf("♂")+1,str.length());
24     System.out.println(str5);
25     System.out.println(str6);
26     System.out.println("------------------------");
27     //java同時也内置了一些字元串開頭和結尾的驗證,但事實上你會發現大部分字元串的操作方法你都可以自己去重新定義
28     System.out.println(str.startsWith("deep"));
29     System.out.println(str.startsWith("deep",1));
30     System.out.println(str.endsWith("fantasy"));
31     System.out.println(str.endsWith("fantasy "));
32     //從輸出結果來看,空格也被包含進去了
33     System.out.println("------------------------");
34     //Java也有字元串的大小寫轉換,可以參考我們自定義的替換方法思考他是怎麼做到的。
35     String str7=str.toUpperCase();
36     String str8=str.toLowerCase();
37     System.out.println(str7);
38     System.out.println(str8);
39     System.out.println(str7.compareTo(str8));//順帶提一下,有興趣可以自己百度
40     System.out.println("------------------------");
41     //字元串分割
42     String[] sp=str.split("♂");
43     talk(sp);
44     sp=str.split("♂", 2);//後面表示分割為幾份
45     talk(sp);
46     sp=str.split(" ");
47     talk(sp);//這樣能去除所有空格,注意第一個位置為空字元串而不是空。
48     System.out.println("------------------------");
49 }
50 //自定義字元串替換
51 public static String change(String str,String demo,String demo2,int startindex,int endindex){
52     String s1=str.substring(0, startindex);
53     String s2=str.substring(startindex, endindex);
54     String s3=str.substring(endindex);
55     s2=s2.replace(demo, demo2);
56     String s=s1+s2+s3;
57     return s;
58 }
59 
60 public static void talk(Object[] objs){
61     for(int i=0;i<objs.length;i++){
62         System.out.print("["+objs[i]+"] ");
63     }
64     System.out.println();
65 }
66 }      
Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人

五、字元串的記憶體問題

  如果你在高并發的環境下和我們的demo中一樣寫,那麼恭喜你,你明天可以去人事部結一下工資了。事實上原始的string不光效率不高,而且上述方法都會産生一段字元串對象,Java中string非常特殊,如果你直接指派給一個引用一段字元串,那麼它會先去常量區尋找,如果找不到那麼就會将該字元串注入常量池,下次再引用的時候就會直接指向常量池中的内容。而如果是通過new出一段字元串對象,那麼它會将你放進推中,并且不會去理你,除非我對這段對象進行操作。

1.4Java字元串記憶體位置

Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人
1 package TheUnity5;
 2 //Java字元串的記憶體問題
 3 public class Demo4 {
 4 public static void main(String[] args){
 5     //對于String,如果你對Java底層的代碼有過了解會知道,其實是一個封裝的char數組
 6     //而且,是被final修飾的,是以隻能指派一次,String的内容實際是在常量池中的
 7     String str="神奇的沙德沃克先生";
 8     String s1="神奇的沙德沃克先生";
 9     System.out.println(str==s1);
10     //輸出true,說明str與s1指向了同一記憶體位址
11     //如果不建立新的字元串對象,相同内容的指派實際上是多個引用指定一個記憶體【證明常量池的存在】
12     System.out.println("------------------------");
13     String s2=new String("神奇的沙德沃克先生");
14     System.out.println(s2==str);
15     System.out.println(s2.equals(str));
16     //列印結果很明顯是内容相同記憶體不同,這裡string對象存在堆中
17     System.out.println("------------------------");
18     String s3="神奇的沙德沃克先生";
19     System.out.println(str==s3);
20     System.out.println(s2==s3);
21     //仍然指向最早定義的字元串常量
22 }
23 }      
Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人

1.5對比試驗

Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人
1 package TheUnity5;
 2 
 3 public class Demo5 {
 4 public static void main(String[] args){
 5     //這裡接demo4繼續讨論
 6     String str=new String("ABC");
 7     String s1="ABC";
 8     System.out.println(s1==str);
 9     //輸出結果為false,證明new 一個string對象實際上避免了在常量池注入常量
10     //而事實上String的大部分方法都會傳回一個新的string對象,在程式開發中确實確定了安全性
11     //但事實上我們需要的不是堆中記憶體配置設定的過渡浪費。
12 }
13 }      
Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人

  重點來了,你可能也聽說過jvm的對象銷毀機制,它是由虛拟機自己決定什麼時候銷毀的,這就會導緻堆中對象不斷累加,正常開發環境沒什麼問題,但是如果是高并發開發那麼就會産生很大的記憶體開銷,這是不明智的。Java的開發者也想到了這個問題,是以提出了stringbuffer,提供線程安全的string增強類。在後續開發中在非并發中又開發了stringbuild類,當然後者是線程不安全的,但是性能更高。對這兩種增強類的操作不會産生新的對象,是以節省了堆的開銷。

1.6兩種增強類

Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人
1 package TheUnity5;
 2 //這裡開始正式講string的兩種拓展,他們都是在原對象上進行修改,達到節省空間的效果
 3 public class Demo6 {
 4 public static void main(String[] args){
 5     //Stringbuild
 6     System.out.println("---------------------");
 7     StringBuilder sb=new StringBuilder("NMSL");
 8     StringBuilder sb1=new StringBuilder(" CNM");
 9     sb.append(sb1);//在後部添加
10     System.out.println(sb.toString());
11     sb.insert(0, "髒魚 ");//指定位置插入
12     System.out.println(sb.toString());
13     sb.delete(0, 3);
14     System.out.println(sb.toString());
15     System.out.println("---------------------");
16     StringBuffer sf=new StringBuffer("NMSL");
17     sf.append(" CNM");
18     //stringbuffer同上,而且更安全。
19     System.out.println(sf.toString());
20     //事實上是先有的StringBuffer,然後有的StringBuild,在多線程中前者安全後者不
21     //在單線程中後者比前者性能更好
22 }
23 }      
Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人

六、正規表達式

  正規表達式實際上是一種規範,在不同的語言會有些許不同,而Java中采用類對其進行處理,具體的文法可以參考各個技術論壇。PS:我是真的煩背書T_T,如果開發要用到這個,我可能得去翻相關的文檔,實在記不住。

1.7Java正規表達式的兩種用法

Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人
1 package TheUnity5;
 2 
 3 import java.util.regex.Matcher;
 4 import java.util.regex.Pattern;//Java正規表達式包
 5 
 6 //嚴格意義來說正規表達式并不是一種語言,而是一種規範,不同語言在部分地方有細微查異
 7 //本文隻對Java的正規表達式讨論
 8 public class Demo7 {
 9 public static void main(String[] args){
10     String content="風見嘯大勝利!";
11     String par=".*勝利.*";
12     boolean isMatch = Pattern.matches(par,content);
13     System.out.println(isMatch);
14     System.out.println("--------------------");
15     String content2="15270003639";
16     String par2="1[358]\\d{9}";
17     boolean isMatch2=content2.matches(par2);
18     System.out.println(isMatch2);
19     //以上是正規表達式的兩種寫法,更多的内容推薦從菜鳥教程這些網站中學習
20 }
21 }      
Java基礎知識回顧(一):字元串小結Java的基礎知識回顧之字元串相關聲明:部落格園原作者為本人

總結

  漏洞百出,懶惰至極,建議當場出櫃【劃掉】。

相關聲明:部落格園原作者為本人

繼續閱讀