Java 第九天(純乾貨)(Api 、String 、StringBuilder)(帶你14天瞭解並掌握Java SE)

今日內容

  • API概述與Object類的功能介紹
  • String類的功能介紹
  • StringBuilder類的功能介紹

01. API的概述和使用步驟

  • 1. 什麼是API?
  • 2. 如何使用API?
總結:
    1: Application Parmgring Interface  (應用程序編程接口)

            大白話: 其實就是學習java已經寫好的類, 這些類中的功能

    2:
        A:打開幫助文檔
        B:點擊顯示,找到索引,看到輸入框
        C:你要學習什麼內容,你就在框框裏面輸入什麼內容
              舉例:Random
        D:看包
        java.lang包下的類在使用的時候是不需要導包的
        E:看類的描述
            Random類是用於生成隨機數的類
        F:看構造方法
            Random():無參構造方法
                Random r = new Random();
        G:看成員方法
               public int nextInt(int n):產生的是一個[0,n)範圍內的隨機數
                調用方法:
                    看返回值類型:人家返回什麼類型,你就用什麼類型接收
                    看方法名:名字不要寫錯了
                    看形式參數:人家要幾個參數,你就給幾個,人家要什麼數據類型的,你就給什麼數據類型的
                    int number = r.nextInt(100);

02. 通過Scanner獲取字符串數據

  • next方法與nextLine的區別
  • nextInt與nextLine的注意事項
總結:
    1. 
        共同點: 都是用於鍵盤接受字符串.
        不同點:    
                結束標記不一樣
                next() : 遇到了空格或者是tab鍵, 就不再錄入了
                nextLine() : 遇到了回車換行就不再錄入了
    2.

        現象: nextInt與nextLine配合使用的話, nextLine將不會再有鍵盤錄入的機會

                原因: 鍵盤錄入了10之後, 實際上在內存中記錄的是10\r\n

                        10被整數變量num所記錄了, \r\n被nextLine遇到了, 遇到了結束標記之後, 就結束自己的任務, 所以第二次錄入的機會就沒有了

                System.out.println("請輸入一個整數:");
                int num = sc.nextInt();         // 10
                                                // \r\n

                System.out.println("請輸入一個字符串:");
                String s = sc.nextLine();       // 回車換行

        解決:

                今後無論是字符串還是整數, 所有的數據都以nextLine字符串的形式進行接收

                    如果想要進行數學的四則運算, 可以使用包裝類, 將字符串轉換爲數字

                            int num = Integer.parseInt("123");

03. Object類的toString()方法

  • 什麼是Object類?
  • Object類中的toString方法返回的是什麼?
總結:
    1. Object類是所有類父類, 所有的類都直接或者間接的繼承到了Object

            換句話來說, Object類中的方法, 所有的類都可以進行使用.

    2. Object類中的toString方法, 默認返回            ->  全類名@十六進制地址值

            默認返回的地址值對我們來說沒有意義, 我們希望數據展示的更加方便, 就可以去重寫Object類的toString方法

    3. toString方法存在的意義:

            單獨使用Object類默認的toString沒有意義, 一般我們會重寫Object類的toString方法, 在方法內部輸出本對象的屬性

                爲了[讓數據展示的更加方便]

練習:
    5分鐘, 編寫標準學生類, 加入toString方法
        alt + shift + s + s   : 自動生成toString方法

結論:
    如果打印一個對象的引用, 結果不是全類名 + 16進制哈希值的話, 說明該對象就重寫了toString方法

04. Object類的equals()方法

  • equals方法的作用?
  • equals方法跟==號的區別?
總結:
    1. equals方法是用於對象之間做比較的.

    2.
        ==號可以比較基本數據類型, 也能比較引用數據類型
                基本數據類型: 具體的值
                引用數據類型: 地址值

        equals方法只能比較引用數據類型

                細節: 如果直接使用Object類的equals比較, 默認比較的還是地址值

                        我們需要重寫equals方法, 方法內部根據屬性進行比較.

                代碼:
                        @Override
                        public boolean equals(Object obj) {     // Object obj = p2;
                                                                // 錯誤: Object obj = new Demo2_Equals();

                            if(obj instanceof Person){
                                // 爲了調用子類特有的屬性和行爲, 需要向下轉型
                                Person p = (Person) obj;    
                                return this.age == p.age && this.name.equals(p.name);
                            }else{
                                return false;
                            }

                        }



分析eclipse自動生成的equals方法, 要求能夠看得懂.   alt + shift + s + h 

    @Override
    public boolean equals(Object obj) {
        if (this == obj)                // 如果當前對象和傳入對象的地址值相同, 直接返回true
            return true;
        if (obj == null)                // 如果傳入的對象爲null, 那就說明當前對象有值, 傳入對象沒值, 沒有可比性了, 返回false
            return false;
        if (getClass() != obj.getClass()) // 如果當前對象的字節碼和傳入對象的字節碼不一致, 說明類型不一樣, 沒有可比性, 返回false
            return false;
        Person other = (Person) obj;    // 向下轉型
        if (age != other.age)           // 年齡不同, 直接返回false
            return false;

        if (name == null) {
            if (other.name != null)     // 當前對象的name如果爲null, 傳入對象的name不是null, 直接返回false
                return false;
        } else if (!name.equals(other.name))  // 如果姓名不一樣, 返回false;
            return false;


        return true;
    }

練習:
    5分鐘, 編寫標準學生類, 加入toString和equals方法

05. String類的概述和構造方法

  • 1. 什麼是String類? 跟普通的類對比,有什麼特殊之處?
  • 2. 構造方法
總結:
    1:  String指的就是字符串, 但是String類比較特殊, 直接寫一個雙引號, 就相當於是創建了一個對象.
            必須掌握的概念: String是一個不可改變的字符序列

                // String是一個不可改變的字符序列
                String s = "abc";
                s = "def";      // 這裏是使用新對象的地址值, 去替換了原對象, 原對象中的數據沒有發生任何改變.


    2:
        String(String original):把字符串數據封裝成字符串對象

        String(char[] value):把字符數組的數據封裝成字符串對象

        String(char[] value, int index, int count):把字符數組中的一部分數據封裝成字符串對象

    注意:
            String s = "123";                               
            String s = new String("123");

06. String創建對象的特點

  • 看圖說話
字符串常量池:

        每一次使用雙引號創建對象的時候, 都會先檢查字符串常量池中, 是否有該對象

                沒有: 創建

                有 : 不再創建, 而是直接複用已經存在的

構造方法創建和直接賦值的區別:

        String s = new String("123");  // 這一步是創建了兩個對象       1. 字符串常量池       2. 堆內存      s變量記錄的是堆內存
        String s = "123"; // s記錄的是字符串常量池


jdk1.8版本之後, 字符串常量池從方法區移動到了堆內存

07. String的練習之模擬用戶登錄

  • 需求: 模擬登錄,給三次機會,並提示還有幾次
  • 分析:
1. 定義兩個字符串對象,用於存儲(已經存在)的用戶名和密碼
2. 鍵盤錄入用戶名和密碼
3. 拿鍵盤錄入的用戶名和密碼和已經存在的用戶名和密碼進行比較
    拿誰比? equals
4. 如果內容相同,提示登錄成功
5. 如果內容不同,提示登錄失敗,並提示還有幾次機會
  • 7分鐘時間實現

08. String的練習之字符串遍歷

  • 需求: 獲取字符串中的每一個字符
第一種遍歷方式:
     * int length():獲取字符串的長度,其實也就是字符個數
     * char charAt(int index):獲取指定索引處的字符
         * // StringIndexOutOfBoundsException --> 字符串索引越界異常

        for(int i = 0; i < s.length(); i++){
            System.out.println(s.charAt(i));
        }

第二種遍歷方式:
    * char[] toChatArray()  : 將字符串拆分成字符數組

        char[] cArr = s.toCharArray();
        for (int i = 0; i < cArr.length; i++) {
            System.out.println(cArr[i]);
        }
  • 3分鐘時間練習

09. String的練習之數組元素拼接成指定格式的字符串

  • 需求: 方法接收一個int類型數組, 將數組中的數字拼接成字符串

    • 例如: int[] arr = {1,2,3}; --> [1, 2, 3]
  • 案例演示

10. String的練習之字符串反轉

  • 需求: 鍵盤錄入abc字符串 輸出結果cba
  • 分析:
A:鍵盤錄入一個字符串
B:寫方法實現字符串的反轉
    a:把字符串倒着遍歷,得到的每一個字符拼接成字符串。
    // b:把字符串轉換爲字符數組,然後對字符數組進行反轉,最後在把字符數組轉換爲字符串
C:調用方法
D:輸出結果
  • 5分鐘時間練習

11. StringBuilder的概述以及與String的區別

  • 1. 什麼是StringBuilder - StringBuffer
  • 2. String跟StringBuilder的區別是?
總結:
    1. StringBuilder字符串的緩衝區(提高字符串的操作效率)
    2. String是一個[不可改變]的字符序列
       StringBuilder是一個[可以改變]的字符序列
  • 3. StringBuilder怎麼樣提高效率的?
    畫圖解釋

    字符串的拼接: 每一次用+號串聯的時候, 底層都會重新創建一個StringBuilder, 然後再通過append方法完成鏈接, 最後通過toString方法轉換成字符串
                        ---這個步驟, 是每一次相加都會進行的步驟---           所以說非常消耗內存

    StringBuilder的拼接: 單獨在堆內存中創建一塊空間, 所有的數據拼接, 都在這一塊空間內進行. 
                            如果想轉成字符串, 可以在拼接結束後, 手動調用toString方法進行轉換.

12. StringBuilder的構造方法

  • A:構造方法: StringBuilder() : 創建字符串緩衝區, 緩衝區中沒有數據 StringBuilder(String str) : 創建字符串緩衝區, 緩衝區中最開始帶有傳入的字符串

  • B:成員方法: public int length():返回長度(已經存儲的字符個數)

13. StringBuilder的添加和反轉方法

  • public StringBuilder append(任意類型):添加數據,並返回自身對象
    * StringBuilder是一個可以改變的字符序列
            // 鏈式編程 : 當一個方法返回的是一個對象, 對象就可以繼續向下調用方法
            sb.append("123").append("456").append("789");
  • public StringBuilder reverse():反轉功能

14. StringBuilder和String的相互轉換

  • StringBuilder -- String
    • public String toString():通過toString()就可以實現把StringBuilder轉成String
        StringBuilder sb = new StringBuilder();
        sb.append("itheima");
        String str = sb.toString();
  • String -- StringBuilder
    • StringBuilder(String str):通過構造方法就可以實現把String轉成StringBuilder
        StringBuilder sb = new StringBuilder("123");

15. StringBuilder的練習之數組元素拼接成指定格式的字符串

  • 需求: int[] arr = {1, 2, 3} --> [1, 2, 3]

    • StringBuilder實現
  • 5分鐘練習

16. StringBuilder的練習之字符串反轉

  • 需求: 鍵盤錄入一個字符串將內容反轉
  • 5分鐘練習

17. StringBuilder和StringBuffer的區別

  • 1. StringBuilder是jdk1.5版本的, StringBuffer是jdk1.0版本的
  • 2. StringBuilder是線程不安全的, StringBuffer是線程安全的.
    線程安全(線程同步):

            效率低

    線程不安全(線程不同步):

            效率高
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章