由於部落客目前只是一隻猿寶寶,所以有些地方可能說的有些片面,若前輩們能夠指點一二就更好了 (~ ̄(OO) ̄)ブ
【JAVA】筆記(8)— java.lang.String 精講
- 2021 年 11 月 16 日
- 筆記
- Java-SE, JavaSE---練氣期
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( ) ; 這個方法輸出任何類型數據時,都是先轉換為字元串,再輸出