1. 程式人生 > 其它 >Api01 類_物件_訪問成員

Api01 類_物件_訪問成員

API基礎第一天:

筆記:

  1. String:字串型別

    • java.lang.String使用的final修飾,不能被繼承
    • 字串底層封裝了字元陣列以及針對字元陣列的操作演算法
    • Java字串在記憶體中採用Unicode編碼方式,任何一個字元對應兩個位元組的編碼
    • 字串一旦建立,物件內容永遠無法改變,但字串引用可以重新賦值
  2. 常量池:

    • java對字串有一個優化措施:字串常量池(堆中)
    • java推薦我們使用字面量/直接量的方式來建立字串,並且會快取所有以字面量形式建立的字串物件到常量池中,當使用相同字面量再次建立字串時會重用物件以減少記憶體開銷,避免記憶體中堆積大量內容相同的字串物件
點選檢視程式碼

   /*
     使用字面量建立字串時:
     1.JVM會檢查常量池中是否有該物件:
       1)若沒有,則建立該字串物件並存入常量池
       2)若有,則直接將該物件返回而不再建立一個新的字串物件
    */
   /*
   String s1 = "123abc"; //常量池還沒有,因此建立該字串物件,並存入常量池
   String s2 = "123abc"; //常量池已有了,直接重用物件
   String s3 = "123abc"; //常量池已有了,直接重用物件
   //引用型別==,比較地址是否相同
   System.out.println(s1==s2); //true
   System.out.println(s1==s3); //true
   System.out.println(s2==s3); //true
   */
  1. 常見面試題:
    String s = new String("hello");
    問:建立了幾個物件?
    答:2個
點選檢視程式碼
  第一個:字面量"hello"
               ---java會建立一個String物件表示字面量"hello",並將其存入常量池
         第二個:new String()
               ---new String()時會再建立一個字串,並引用hello字串的內容
點選檢視程式碼
/*
String s1 = new String("hello"); //s1裝的是new String()物件的地址
String s2 = "hello"; //s2裝的是字面量"hello"的地址
System.out.println("s1:"+s1); //hello
System.out.println("s2:"+s2); //hello
System.out.println(s1==s2); //false,因為s1與s2的地址不同

//字串實際開發中比較相等的需求都是比較字串的內容
//因此我們應該使用字串提供的equals()方法來比較兩個字串的內容
System.out.println(s1.equals(s2)); //true,因為s1與s2的內容相同
*/


/*
String s1 = "123abc";
String s2 = "123abc";
System.out.println(s1==s2); //true,s1與s2地址相同

s1 = s1+"!"; //建立新物件並把地址賦值給s1
System.out.println(s1==s2); //false,s1為新的物件的地址,與s2不同了
*/

//如下程式碼:常量池中會有3個儲存,一個是123abc的地址,一個是123的地址,一個是abc的地址
//一個新的物件,它的值也是123abc
String s1 = "123abc";
//編譯器在編譯時,若發現一個計算表示式可以在編譯期間確定結果,
//則直接運算好並將結果儲存到表示式中 相當於String s2 = "123abc";
String s2 = "123"+"abc";
System.out.println(s1==s2); //true,s1與s2共用常量池中的

String s3 = "123";
//當字串拼接產生的內容與常量池是某內容相同時,也不會重用常量池的物件
String s4 = s3+"abc"; //建立一個新的物件儲存123abc
System.out.println(s4==s1); //false
  1. String常用方法:

    • length():獲取字串的長度(字元個數)
點選檢視程式碼
 
     String str = "我愛Java!";
     int len = str.length(); //獲取str的長度
     System.out.println(len); //7
     ```

</details>

   - trim():去除當前字串兩邊的空白字元

   
<details>
<summary>點選檢視程式碼</summary>


  ```java
     String str = "  hello world            ";
     System.out.println(str); //  hello world
     str = str.trim(); //去除當前字串兩邊的空白字元
     System.out.println(str); //hello world
     ```

</details>

   - indexOf(String str):檢索給定字串在當前字串的開始位置

     int lastIndexOf(String str):
     檢索給定字串在當前字串中最後一次出現的位置
<details>
<summary>點選檢視程式碼</summary>


     ```java
     //            0123456789012345
     String str = "thinking in java";
     int index = str.indexOf("in"); //檢索in在字串str中出現的開始位置
     System.out.println(index); //2
     
     index = str.indexOf("IN"); //當前字串不包含給定內容IN,所以返回-1
     System.out.println(index); //-1
     
     index = str.indexOf("in",3); //從第4個字元開始找in第一次出現的位置
     System.out.println(index); //5
     
     index = str.lastIndexOf("in"); //找in最後一次出現的位置
     System.out.println(index); //9
     ```

</details>

   - substring(int start,int end):擷取當前字串中指定範圍內的字串(含頭不含尾--包含start,但不包含end)
<details>
<summary>點選檢視程式碼</summary>

     ```java
     public class SubstringDemo {
         public static void main(String[] args) {
             /*
             //            01234567890
             String str = "www.tedu.cn";
             String name = str.substring(4,8); //擷取第4個到第7個----下標
             System.out.println(name); //tedu
             name = str.substring(4); //從第4個一直擷取到字串末尾----下標
             System.out.println(name); //tedu.cn
             */
             String name = getName("www.tedu.com.cn");
             System.out.println(name); //tedu
             String str = getName("http://www.google.com");
             System.out.println(str); //google
     
         }
     
         /**
          * 獲取給定網址中的域名
          * @param line 網址
          * @return 返回域名
          */
         public static String getName(String line){
             //012345678901234
             //www.tedu.com.cn  第一個點到第二個點之間的字串
             int start = line.indexOf(".")+1; //4,加1目的是為了找到點後的第一個字元的位置
             int end = line.indexOf(".",start); //8,從start往後找第一個.的位置
             return line.substring(start,end);
         }
     }
     
  • charAt():返回當前字串指定位置上的字元
點選檢視程式碼
   //            0123456789012345
   String str = "thinking in java";
   char c = str.charAt(9); //獲取位置9所對應的字元
   System.out.println(c); //i
   
  • startsWith(String str)和endsWith(String str):判斷當前字串是否是以給定的字串開始/結尾的
點選檢視程式碼
 ```java
 String str = "thinking in java";
 boolean starts = str.startsWith("think"); //判斷str是否是以think開頭的
 System.out.println("starts:"+starts); //true
 
 boolean ends = str.endsWith(".png"); //判斷str是否是以.png結尾的
 System.out.println("ends:"+ends); //false
 ```
  • toUpperCase()和toLowerCase():將當前字串中的英文部分轉為全大寫/全小寫
點選檢視程式碼
   String str = "我愛Java!";
   String upper = str.toUpperCase(); //將str中英文部分轉為全大寫
   System.out.println(upper); //我愛JAVA!
   
   String lower = str.toLowerCase(); //將str中英文部分轉為全小寫
   System.out.println(lower); //我愛java!
   ```

</details>

 - valueOf():String類中提供的靜態方法,將其它資料型別轉換為String

  
<details>
<summary>點選檢視程式碼</summary>


```java
   int a = 123;
   String s1 = String.valueOf(a); //將int型變數a轉換為String型別並賦值給s1
   System.out.println("s1:"+s1); //123
   
   double dou = 123.456;
   String s2 = String.valueOf(dou); //將double型變數dou轉換為String型別並賦值給s2
   System.out.println("s2:"+s2); //123.456
   
   String s3 = a + ""; //任何內容與字串連線結果都是字串,效率低(下週一才能體會)
   System.out.println(s3); //123
   ```


</details>




補充:

1. ASCII:美國標準編碼,是美國最早的字符集,也是計算機最底層的字符集,一個位元組
2. GBK:國標編碼,中國自己的編碼,總共6萬多個
3. Unicode:萬國碼,裝全世界所有符號
4. UTF:在Unicode基礎之上做的二次編碼,裡面加入了一個長度資訊來標記是按一個字元解析還是按兩個字元算

> 結論:網際網路上真正使用的並不是unicode,真正傳輸出的是UTF這種帶長度資訊的編碼,拿到UTF資料後再把長度去掉,還原成unicode編碼。