【JAVA】筆記(8)--- java.lang.String 精講

猿頭猿腦的王狗蛋發表於2021-11-15

String 特性:

1.String 表示字串型別,屬於引用資料型別,所以其儲存的是地址;

2.java 中規定,雙引號括起來的字串是不可變的,也就說” name “永遠也只能是” name “,不能改變;

3.由於字串在使用中過於頻繁,所以為了保證執行效率,SUN 公司設定把字串放到了方法區的字串常量池中;

4.凡是雙引號括起來的,都在字串常量池中有一份;

注意:字串變數經過初始化才能使用;

String類 構造方法:

1.String str = "java" ; //首先查詢字串常量池中是否有“java”,若無,則建立並將其地址返回給 棧記憶體中的字串變數 str ,若有,則直接返回給 str ;

以下均只討論字串常量池中沒有被查詢字串的情況

2.String str = new String( "java" ) ; //首先查詢字串常量池中是否有“java”,若無,則建立並將其地址返回給 堆記憶體中的String物件,然後再將此String物件的地址返回給棧記憶體中的字串變數 str;

3.String str = new String( byte陣列 ) ;

4.String str = new String( byte陣列 ,起始下標,長度 ) ;

6.String str = new String( char陣列 ) ;

5.String str = new String( char陣列 ,起始下標,長度 ) ;

3,4,5,6構造方法的栗子:

public class pra{
    public static void main(String[] args) {
        byte [] b={97,98,99};
        char [] c={'H','e','l','l','o'};
        String s1=new String(b);
        System.out.println(s1);
        String s2=new String(b,0,2);
        System.out.println(s2);
        String s3=new String(c);
        System.out.println(s3);
        String s4=new String(c,0,4);
        System.out.println(s4);
    }
}

執行結果:
------------------------
abc
ab
Hello
Hell

字串常量池:

String str = ” zifu“ + ” chuan “ ;//(先查詢字串常量池中有無“zifu”“chuan”,若無)在字串常量池中建立 ” zifu “ ,” chuan “ ,”  zifuchuan “,三個字串;若print (str),則str會直接指向字串常量池,並返回“ zifuchuan ”

String strr = “  zifu ”;//字串常量池無變化(因為已存在“zifu”);

輔助理解:

1.String s1=“ java ”;

  String s2=“ java ”;

  System.out.println( s1==s2 ) // 輸出true/false

答:true,因為字串常量池中的“java”是不變的,所以無論是s1還是s2,儲存的地址對應的都是那個字串常量池中的“java”,所以自然儲存的地址是相同的,而“==”比較地址,輸出true;

2.String s1=new String(“ java ”);

  String s2=new String(“ java ”);

  System.out.println( s1==s2 ) // 輸出true/false?

答:false,s1與s2只是儲存了“=”右邊在堆記憶體中建立的String物件的地址,而這倆個new出來的地址是不同的,所以輸出“false”;

再問記憶體中一共建立了幾個物件?

答:3個,方法區中一個 “java”,堆記憶體中倆個String物件;

String類 的方法:

注意:雙引號中的空格正常會影響執行結果,但為了方便閱讀,博主加上了一些空格(當它不存在就好了~~)

1.char charAt( int index )

System.out.println( "王狗蛋".charAt( 1 ) ) ; // 輸出:狗

2.boolean contains( CharSequence s ) //是否包含

System.out.println( "http".contains( "ht" ) ) //輸出:true

3.boolean endWith( String string ) //是否以其結尾

System.out.println( "nameabn".endWith( abn ) ) //輸出:true

4.boolean equals( Object object ) // 見 java筆記(6) 

5.boolean equalsIgnoranceCase ( String string ) //判斷字串是否相等,並忽略大小寫

System.out.println( "AAA". equalsIgnoranceCase( “aaa” ) ) //輸出:true

6.byte [ ] getBytes(  ) //把字串轉化為byte陣列

byte [ ] bytes=" abc ".getBytes(  ) ;

遍歷陣列 bytes ,輸出:97    98      99

7.int indexOf( String string ) //判斷某個字串在當前字串中第一次出現的索引(下標)

System.out.println( "hello". indexOf( "el" )) //輸出:1

8.boolean isEmpty(  ) //判斷是否為空字串(底層呼叫“ Length( ) ”方法)

System.out.println( "yes".isEmpty( ) ) //輸出:false

9.int Length( ) //輸出字串長度

System.out.println( "12345".Length( ) ) //輸出:5

注意:Length( )方法與“ .length ”不同,前者返回字串長度,後者返回陣列長度

10.int lastIndexOf( String string )//輸出某個字串在當前字串中最後一次出現的索引(下標)

System.out.println( "mynameisname" .lastIndexOf( “name” ) ) //輸出:8

11.String repalce( CharSequence c1 , CharSequence c2 ) //替換字串

System.out.println("name" . replace ( "name" , " good " ) ) ; //輸出:good

12.String [ ] split ( String string ) //根據後面的字串對前面的字串進行拆分

String [ ] string = "1,2;3,4;5," . split( " , " ) //輸出:1      2 ; 3      4 ; 5

13.boolean startsWith( String string ) //是否以其開始

System.out.println( "nameabn".startsWith( na ) ) //輸出:true

14.String subString( int i ) //以 i 為起始下標,擷取以後的字串

System.out.println( "123456789". subString( 2 ) ) //輸出:3456789

15.String subString( int i , int j ) //以 i 為起始下標(包括),以 j 為終點下標(不包括),擷取字串

System.out.println( "123456789" . substring( 2 , 9 ) ) //輸出:3456789

16.char [ ] toCharArray (  ) //把字串轉化為 char 陣列

char [ ] chars =" abc ". toCharArray (  ) ;

遍歷陣列 chars ,輸出:a    b     c

17.String toLowerCase( ) //全轉換為小寫

System.out.println( "abcd" .  toLowerCase( ) ) //輸出:ABCD

18.String toUpperCase( ) //全轉換為大寫

System.out.println( "ABCD" .  toUpperCase( ) ) //輸出:abcd

19.String trim( ) //去除字串中的空格

System.out.println("              hahaha               " . trim( ) ) ; //輸出:hahaha

20.String中只有一個靜態方法--- vauleOf( ) //將非字串轉換為字串

String str1 = String . valueOf( true ) ;  //boolean--->String

String str2 = String . valueOf( 1.33 ) ;  //double--->String

String str3 = String . valueOf( 100 ) ;  //int--->String

21.int compareTo( String string ) //大小根據26個英文字母排序而定

System.out.println( "abc".compareTo( “abc” ) ) //輸出 0;

System.out.println( "abc".compareTo( ”abz“ ) ) //輸出 -1;

System.out.println( "aby".compareTo( “abd” ) ) //輸出 1;

字串拼接:

1.通過拼接符“ + ”進行拼接,有一個缺點,就是每次拼接,都會在字串常量池中建立倆個物件(在拼接部分字串為新字串的情況下),浪費記憶體;

2.通過 stringBuffer 和 stringBuilder 方法來進行拼接;

栗子老師:

public class pra {
    public static void main(String[] args) {
        StringBuffer str1=new StringBuffer();
        StringBuilder str2=new StringBuilder();
        str1.append("hello");
        System.out.println("StringBuffer---str1:"+str1);
        str1.append(" world");
        System.out.println("StringBuffer---str1:"+str1);
        str2.append("hello world");
        System.out.println("StringBuilder---str2:"+str2);
    }
}

執行結果:
--------------------------
StringBuffer---str1:hello
StringBuffer---str1:hello world
StringBuilder---str2:hello world

Process finished with exit code 0

stringbuffer和stringbuilder的區別,目前博主只知道線上程安全方面,StringBuffer >> StringBuilder( 不安全 ) ;

隨筆:

1.System.out.println( "jim".equals( 字串變數) ) ;

  System.out.println( "字串變數".equals(jim ) ) ;

  //更推薦使用第一種方式來判斷這倆個字串內容是否相同,因為第一種可以避免“ 字串變數為null ”而導致的空指標異常;

2.通過原始碼可以看出:System.out.println( ) ; 這個方法輸出任何型別資料時,都是先轉換為字串,再輸出


由於博主目前只是一隻猿寶寶,所以有些地方可能說的有些片面,若前輩們能夠指點一二就更好了      (~ ̄(OO) ̄)ブ

 

 

  

 

相關文章