今日內容
- 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是線程安全的.
線程安全(線程同步):
效率低
線程不安全(線程不同步):
效率高