1. 程式人生 > >常見物件StringBuffer、Arrays類和基本型別包裝類+JAVA學習筆記-DAY13

常見物件StringBuffer、Arrays類和基本型別包裝類+JAVA學習筆記-DAY13

13.01_常見物件(StringBuffer類的概述)

  • A:StringBuffer類概述
    • 通過JDK提供的API,檢視StringBuffer類的說明
    • 執行緒安全的可變字元序列
  • B:StringBuffer和String的區別
    • String是一個不可變的字元序列
    • StringBuffer是一個可變的字元序列

13.02_常見物件(StringBuffer類的構造方法)

  • A:StringBuffer的構造方法:
    • public StringBuffer():無參構造方法
    • public StringBuffer(int capacity):指定容量的字串緩衝區物件
    • public StringBuffer(String str):指定字串內容的字串緩衝區物件
  • B:StringBuffer的方法:
    • public int capacity():返回當前容量。 理論值(不掌握)
    • public int length():返回長度(字元數)。 實際值
  • C:案例演示

    • 構造方法和長度方法的使用

      public static void main(String[] args) {
              StringBuffer sb = new StringBuffer();
              System.out.println(sb.length());            //容器中的字元個數,實際值0
              System.out.println(sb.capacity());          //容器的初始容量,理論值16
      
              StringBuffer sb2 = new StringBuffer(10);
              System.out.println(sb2.length());//0
              System.out.println(sb2.capacity());//10
      
              StringBuffer sb3 = new StringBuffer("heima");
              System.out.println(sb3.length());           //實際字元的個數,5
              System.out.println(sb3.capacity());         //字串的length + 初始容量,21                  
          }
      

13.03_常見物件(StringBuffer的新增功能)

  • A:StringBuffer的新增功能

    • public StringBuffer append(String str):

      • 可以把任意型別資料新增到字串緩衝區裡面,並返回字串緩衝區本身
      • JDK1.8 使用append(boolean b) 會報錯
    • public StringBuffer insert(int offset,String str):

      • 在指定位置把任意型別的資料插入到字串緩衝區裡面,並返回字串緩衝區本身

*例項

    StringBuffer sb = new StringBuffer("");
    System.out.println(sb.toString());  //StringBuffer類中重寫了toString方法,顯示的是物件中的屬性值

    /*StringBuffer sb2 =  sb.append(true);//JDK1.8 會報錯
    System.out.println(sb2.toString());*/

    StringBuffer sb3 = sb.append("avinia");
    System.out.println(sb3.toString());

    /*StringBuffer sb4 = sb.append(100);//JDK1.8 會報錯
    System.out.println(sb4.toString());*/

    StringBuffer sb5 = new StringBuffer("1234");
    sb5.insert(3, "lavinia");                       //在指定位置新增元素,如果沒有指定位置的索引就會報索引越界異常        
    System.out.println(sb5);

13.04_常見物件(StringBuffer的刪除功能)

  • A:StringBuffer的刪除功能
    • public StringBuffer deleteCharAt(int index):
      • 刪除指定位置的字元,並返回本身
    • public StringBuffer delete(int start,int end):
      • 刪除從指定位置開始指定位置結束的內容,並返回本身(刪除的時候是包含頭,不包含尾)
  • 案例

    StringBuffer sb = new StringBuffer();
    //sb.deleteCharAt(5);                   //當緩衝區中這個索引上沒有元素的時候就會報StringIndexOutOfBoundsException
    sb.append("heima");
    //sb.deleteCharAt(4);                   //根據索引刪除掉索引位置上對應的字元
    //sb.delete(0, 2);                      //刪除的時候是包含頭,不包含尾
    //System.out.println(sb);
    //sb.delete(0, sb.length());                //清空緩衝區
    //System.out.println(sb);
    
    sb = new StringBuffer();                //不要用這種方式清空緩衝區,原來的會變成垃圾,浪費記憶體
    System.out.println(sb);
    

13.05_常見物件(StringBuffer的替換和反轉功能)

  • A:StringBuffer的替換功能
    • public StringBuffer replace(int start,int end,String str):
      • 從start開始到end用str替換
  • B:StringBuffer的反轉功能
    • public StringBuffer reverse():
      • 字串反轉
  • 案例

    StringBuffer sb = new StringBuffer("我愛總複習");
    sb.replace(1, 3, "bu");                 //替換
    System.out.println(sb);  // 我bu複習   
    sb.reverse();
    System.out.println(sb);  //習復ub我
    

13.06_常見物件(StringBuffer的擷取功能及注意事項)

  • A:StringBuffer的擷取功能
    • public String substring(int start):
      • 從指定位置擷取到末尾
    • public String substring(int start,int end):
      • 擷取從指定位置開始到結束位置,包括開始位置,不包括結束位置
  • B:注意事項
    • 注意:返回值型別不再是StringBuffer本身
  • 案例

    StringBuffer sb = new StringBuffer("woailavinaitu");
    String str = sb.substring(4);
    System.out.println(str);//  lavinaitu   
    System.out.println(sb);//woailavinaitu  
    String str3 = sb.substring(4, 7);//左包含右不包含
    System.out.println(str3);//lav 
    

13.07_常見物件(StringBuffer和String的相互轉換)

  • A:String – StringBuffer
    • a:通過構造方法
    • b:通過append()方法
  • 案例

    StringBuffer sb1 = new StringBuffer("laviniatu");           //通過構造方法將字串轉換為StringBuffer物件
    System.out.println(sb1);
    
    StringBuffer sb2 = new StringBuffer();
    sb2.append("laviniatu");    //通過append方法將字串轉換為StringBuffer物件
    System.out.println(sb2);
    
  • B:StringBuffer – String
    • a:通過構造方法
    • b:通過toString()方法
    • c:通過subString(0,length);
  • 案例

    StringBuffer sb = new StringBuffer("laviniatu");
    
    String s1 = new String(sb);                     //通過構造將StringBuffer轉換為String
    System.out.println(s1);
    
    String s2 = sb.toString();                      //通過toString方法將StringBuffer轉換為String
    System.out.println(s2);
    
    String s3 = sb.substring(0, sb.length());       //通過擷取子字串將StringBuffer轉換為String
    System.out.println(s3);
    

13.08_常見物件(把陣列轉成字串)

  • A:案例演示

    • 需求:把陣列中的資料按照指定個格式拼接成一個字串
    • 舉例:
          int[] arr = {1,2,3};    
      輸出結果:
          "[1, 2, 3]"
      
      用StringBuffer的功能實現
      
  • 程式碼

    private static String Arry2String(int[] arr) {
            StringBuffer sbBuffer = new StringBuffer("[");
            for (int i = 0; i < arr.length; i++) {
                if (i == arr.length-1) {
                    sbBuffer.append(arr[i]+"]");
                }else {
                    sbBuffer.append(arr[i]+",");
                }                   
            }
            //String str = new String(sbBuffer);
            return sbBuffer.toString();
        }
    

13.09_常見物件(字串反轉)

  • A:案例演示
  • 需求:把字串反轉
        舉例:鍵盤錄入"abc"        
        輸出結果:"cba"
    
    用StringBuffer的功能實現  
    
    private static String revString(String inString) {
            StringBuffer sBuffer = new StringBuffer(inString);
            String outsString = sBuffer.toString();
            return outsString;
        }
    

13.10_常見物件(StringBuffer和StringBuilder的區別)

  • A:StringBuilder的概述
    • 通過檢視API瞭解一下StringBuilder類
  • B:面試題 String,StringBuffer,StringBuilder的區別
    • StringBuffer和StringBuilder的區別
    • StringBuffer是jdk1.0版本的,是執行緒安全的,效率低
    • StringBuilder是jdk1.5版本的,是執行緒不安全的,效率高
    • String是一個不可變的字元序列
    • StringBuffer,StringBuilder是可變的字元序列

13.11_常見物件(String和StringBuffer分別作為引數傳遞)

  • A:形式引數問題

    • String作為引數傳遞
    • StringBuffer作為引數傳遞

      基本資料型別的值傳遞,不改變其值
      引用資料型別的值傳遞,改變其值         
      String類雖然是引用資料型別,但是他當作引數傳遞時和基本資料型別是一樣的
      
  • B:案例演示
    • String和StringBuffer分別作為引數傳遞問題

13.12_常見物件(陣列高階氣泡排序原理圖解)

  • A:畫圖演示
  • 需求:
        陣列元素:{24, 69, 80, 57, 13}
        請對陣列元素進行排序。
    
        氣泡排序
            相鄰元素兩兩比較,大的往後放,第一次完畢,最大值出現在了最大索引處
    

13.13_常見物件(陣列高階氣泡排序程式碼實現)

  • A:案例演示

    • 陣列高階氣泡排序程式碼

      public static void bubbleSort(int[] arr) {
          for (int i = 0; i < arr.length - 1; i++) {              //外迴圈只需要比較arr.length-1次就可以了
              for (int j = 0; j < arr.length - 1 - i; j++) {      //-1為了防止索引越界,-i為了提高效率
                  if(arr[j] > arr[j+1]) {
                      int temp = arr[j];
                      arr[j] = arr[j + 1];
                      arr[j+1] = temp;
                  }
              }
          }
      }
      

13.14_常見物件(陣列高階選擇排序原理圖解)

  • A:畫圖演示

    • 需求:

      • 陣列元素:{24, 69, 80, 57, 13}
      • 請對陣列元素進行排序。

      • 選擇排序

        • 從0索引開始,依次和後面元素比較,小的往前放,第一次完畢,最小值出現在了最小索引處

13.15_常見物件(陣列高階選擇排序程式碼實現)

  • A:案例演示

    • 陣列高階選擇排序程式碼

      public static void selectSort(int[] arr) {
              for (int i = 0; i < arr.length - 1; i++) {              //只需要比較arr.length-1次
                  for (int j = i + 1; j < arr.length; j++) {
                      if(arr[i] > arr[j]) {
                          int temp = arr[i];
                          arr[i] = arr[j];
                          arr[j] = temp;
                      }
                  }
              }
          }
      

13.16_常見物件(陣列高階二分查詢原理圖解)

  • A:畫圖演示
    • 二分查詢
    • 前提:陣列元素有序

13.17_常見物件(陣列高階二分查詢程式碼實現及注意事項)

  • A:案例演示
    • 陣列高階二分查詢程式碼
  • B:注意事項

    • 如果陣列無序,就不能使用二分查詢。

      • 因為如果你排序了,但是你排序的時候已經改變了我最原始的元素索引。
      • public static int getIndex(int[] arr, int value) {
                int min = 0;
                int max = arr.length - 1;
                int mid = (min + max) / 2;
        
                while(arr[mid] != value) {                  //當中間值不等於要找的值,就開始迴圈查詢
                    if(arr[mid] < value) {                  //當中間值小於了要找的值
                        min = mid + 1;                      //最小的索引改變
                    }else if (arr[mid] > value){            //當中間值大於了要找的值
                        max = mid - 1;                      //最大的索引改變
                    }
        
                    mid = (min + max) / 2;                  //無論最大還是最小改變,中間索引都會隨之改變
        
                    if(min > max) {                         //如果最小索引大於了最大索引,就沒有查詢的可能性了
                        return -1;                          //返回-1
                    }
                }
                return mid;
            }
        

13.18_常見物件(Arrays類的概述和方法使用)

  • A:Arrays類概述
    • 針對陣列進行操作的工具類。
    • 提供了排序,查詢等功能。
  • B:成員方法

    • public static String toString(int[] a)
    • public static void sort(int[] a)
    • public static int binarySearch(int[] a,int key)

      int[] arr = {33,22,11,44,66,55};
      System.out.println(Arrays.toString(arr));           //陣列轉字串
      
      Arrays.sort(arr);                                   //排序
      System.out.println(Arrays.toString(arr));
      
      int[] arr2 = {11,22,33,44,55,66};
      System.out.println(Arrays.binarySearch(arr2, 22));
      System.out.println(Arrays.binarySearch(arr2, 66));
      System.out.println(Arrays.binarySearch(arr2, 9));   //-插入點-1
      

13.19_常見物件(基本型別包裝類的概述)

  • A:為什麼會有基本型別包裝類
    • 將基本資料型別封裝成物件的好處在於可以在物件中定義更多的功能方法操作該資料。
  • B:常用操作
    • 常用的操作之一:用於基本資料型別與字串之間的轉換。
  • C:基本型別和包裝類的對應

  • byte Byte
    short Short
    int Integer
    long Long
    float Float
    double Double
    char Character
    boolean Boolean

13.20_常見物件(Integer類的概述和構造方法)

  • A:Integer類概述

    • 通過JDK提供的API,檢視Integer類的說明

    • Integer 類在物件中包裝了一個基本型別 int 的值,

    • 該類提供了多個方法,能在 int 型別和 String 型別之間互相轉換,
    • 還提供了處理 int 型別時非常有用的其他一些常量和方法
  • B:構造方法
    • public Integer(int value)
    • public Integer(String s)
  • C:案例演示

    • 使用構造方法建立物件

      System.out.println(Integer.MAX_VALUE);
      System.out.println(Integer.MIN_VALUE);
      
      Integer i1 = new Integer(100);
      System.out.println(i1);
      
      //Integer i2 = new Integer("abc");          //java.lang.NumberFormatException數字格式異常
      //System.out.println(i2);                       //因為abc不是數字字串,所以轉換會報錯
      
      Integer i3 = new Integer("100");
      System.out.println(i3);
      

13.21_常見物件(String和int型別的相互轉換)

  • A:int – String
    • a:和”“進行拼接
    • b:public static String valueOf(int i)
    • c:int – Integer – String(Integer類的toString方法())
    • d:public static String toString(int i)(Integer類的靜態方法)
  • B:String – int

    • a:String – Integer – int
    • public static int parseInt(String s)

      //int ----> String int轉換成String
      int i = 100;
      String s1 = i + "";                     //推薦用
      String s2 = String.valueOf(i);          //推薦用
      
      Integer i2 = new Integer(i);
      String s3 = i2.toString();
      
      String s4 = Integer.toString(i);
      System.out.println(s1);
      
      //String----> int String 轉換int
      String s = "200";
      Integer i3 = new Integer(s);
      int i4 = i3.intValue();                 //將Integer轉換成了int數
      
      int i5 = Integer.parseInt(s);
      //String ----> boolean
      String s1 = "true";
      boolean b = Boolean.parseBoolean(s1);
      System.out.println(b);
      
      String s2 = "abc";
      char[] c = s2.toCharArray();    //char的包裝類Character中沒有pareseXxx的方法
      System.out.println(Arrays.toString(c));
      

13.22_常見物件(JDK5的新特性自動裝箱和拆箱)

  • A:JDK5的新特性
    • 自動裝箱:把基本型別轉換為包裝類型別
    • 自動拆箱:把包裝類型別轉換為基本型別
  • B:案例演示

    • JDK5的新特性自動裝箱和拆箱

    • Integer ii = 100;

    • ii += 200;
  • C:注意事項

    • 在使用時,Integer x = null;程式碼就會出現NullPointerException。
    • 建議先判斷是否為null,然後再使用。

      //int x = 100;
      //Integer i1 = new Integer(x);          //將基本資料型別包裝成物件,裝箱   
      //int y = i1.intValue();                    //將物件轉換為基本資料型別,拆箱
      
      Integer i2 = 100;                       //自動裝箱,把基本資料型別轉換成物件
      int z = i2 + 200;                       //自動拆箱,把物件轉換為基本資料型別
      System.out.println(z);
      
      Integer i3 = null;
      int a = i3 + 100;                       //底層用i3呼叫intValue,但是i3是null,null呼叫方法就會出現
      System.out.println(a);                  //空指標異常java.lang.NullPointerException
      

13.23_常見物件(Integer的面試題)

  • A:Integer的面試題
  • 看程式寫結果
    
    Integer i1 = new Integer(97);
    Integer i2 = new Integer(97);
    System.out.println(i1 == i2);
    System.out.println(i1.equals(i2));
    System.out.println("-----------");
    
    Integer i3 = new Integer(197);
    Integer i4 = new Integer(197);
    System.out.println(i3 == i4);
    System.out.println(i3.equals(i4));
    System.out.println("-----------");
    
    Integer i5 = 97;
    Integer i6 = 97;
    System.out.println(i5 == i6);
    System.out.println(i5.equals(i6));
    System.out.println("-----------");
    
    Integer i7 = 197;
    Integer i8 = 197;
    System.out.println(i7 == i8);
    System.out.println(i7.equals(i8));
    
  • B 結果

    • false
    • true
    • ———–
    • false
    • true
    • ———–
    • true
    • true
    • ———–
    • false
    • true

      • -128到127是byte的取值範圍,如果在這個取值範圍內,自動裝箱就不會新建立物件,而是從常量池中獲取
      • 如果超過了byte取值範圍就會再新建立物件

13.24_day13總結

  • 把今天的知識點總結一遍。