集合的toString()方法源碼解析:
代碼:
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
System.out.println(c);
爲什麼c輸出的不是地址值呢?
A:Collection c = new ArrayList();
這是多態,所以輸出c的toString()方法,其實是輸出ArrayList的toString()
B:看ArrayList的toString()
而我們在ArrayList裏面卻沒有發現toString()。
以後遇到這種情況,也不要擔心,你認爲有,它卻沒有,就應該去它父親裏面看看。
C:toString()的方法源碼
public String toString() {
Iterator<E> it = iterator(); //集合本身調用迭代器方法,得到集合迭代器
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next(); //e=hello,world,java
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
//[hello, world, java]
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
1:登錄註冊案例(理解)
分析:
需求:用戶登錄註冊案例。
按照如下的操作,可以讓我們更符號面向對象思想
A:有哪些類呢?
B:每個類有哪些東西呢?
C:類與類之間的關係是什麼呢?
分析:
A:有哪些類呢?
用戶類
測試類
B:每個類有哪些東西呢?
用戶類:
成員變量:用戶名,密碼
構造方法:無參構造
成員方法:getXxx()/setXxx()
登錄,註冊
假如用戶類的內容比較對,將來維護起來就比較麻煩,爲了更清晰的分類,我們就把用戶又劃分成了兩類
用戶基本描述類
成員變量:用戶名,密碼
構造方法:無參構造
成員方法:getXxx()/setXxx()
用戶操作類
登錄,註冊
測試類:
main方法。
C:類與類之間的關係是什麼呢?
在測試類中創建用戶操作類和用戶基本描述類的對象,並使用其功能。
分包:
A:功能劃分
B:模塊劃分
C:先按模塊劃分,再按功能劃分
今天我們選擇按照功能劃分:
用戶基本描述類包 cn.itcast.pojo
用戶操作接口 cn.itcast.dao
用戶操作類包 cn.itcast.dao.impl
今天是集合實現,過幾天是IO實現,再過幾天是GUI實現,就業班我們就是數據庫實現
用戶測試類 cn.itcast.test
2:Set集合(理解)
(1)Set集合的特點
無序,唯一
(2)HashSet集合(掌握)
A:底層數據結構是哈希表(是一個元素爲鏈表的數組)
B:哈希表底層依賴兩個方法:hashCode()和equals()
執行順序:
首先比較哈希值是否相同
相同:繼續執行equals()方法
返回true:元素重複了,不添加
返回false:直接把元素添加到集合
不同:就直接把元素添加到集合
C:如何保證元素唯一性的呢?
由hashCode()和equals()保證的
D:開發的時候,代碼非常的簡單,自動生成即可。
E:HashSet存儲字符串並遍歷
F:HashSet存儲自定義對象並遍歷(對象的成員變量值相同即爲同一個元素)
(3)TreeSet集合
A:底層數據結構是紅黑樹(是一個自平衡的二叉樹)
B:保證元素的排序方式
a:自然排序(元素具備比較性)
讓元素所屬的類實現Comparable接口
b:比較器排序(集合具備比較性)
讓集合構造方法接收Comparator的實現類對象
C:把我們講過的代碼看一遍即可
(4)案例:
A:獲取無重複的隨機數
import java.util.HashSet; import java.util.Random; public class Test10 { public static void main(String[] args) { //自動去除重複項 HashSet<Integer> hs = new HashSet<>(); Random r=new Random(); while (hs.size() < 10) { int n = r.nextInt(20)+1; hs.add(n); } for (Integer m : hs) { System.out.println(m); } } }
B:鍵盤錄入學生按照總分從高到底輸出
3:Collection集合總結(掌握)
Collection
|--List有序,可重複
|--ArrayList
底層數據結構是數組,查詢快,增刪慢。
線程不安全,效率高
|--Vector
底層數據結構是數組,查詢快,增刪慢。
線程安全,效率低
|--LinkedList
底層數據結構是鏈表,查詢慢,增刪快。
線程不安全,效率高
|--Set無序,唯一
|--HashSet
底層數據結構是哈希表。
如何保證元素唯一性的呢?
依賴兩個方法:hashCode()和equals()
開發中自動生成這兩個方法即可
|--LinkedHashSet
底層數據結構是鏈表和哈希表
由鏈表保證元素有序
由哈希表保證元素唯一
|--TreeSet
底層數據結構是紅黑樹。
如何保證元素排序的呢?
自然排序
比較器排序
如何保證元素唯一性的呢?
根據比較的返回值是否是0來決定
4:針對Collection集合我們到底使用誰呢?(掌握)
唯一嗎?
是:Set
排序嗎?
是:TreeSet
否:HashSet
如果你知道是Set,但是不知道是哪個Set,就用HashSet。
否:List
要安全嗎?
是:Vector
否:ArrayList或者LinkedList
查詢多:ArrayList
增刪多:LinkedList
如果你知道是List,但是不知道是哪個List,就用ArrayList。
如果你知道是Collection集合,但是不知道使用誰,就用ArrayList。
如果你知道用集合,就用ArrayList。
5:在集合中常見的數據結構(掌握)
ArrayXxx:底層數據結構是數組,查詢快,增刪慢
LinkedXxx:底層數據結構是鏈表,查詢慢,增刪快
HashXxx:底層數據結構是哈希表。依賴兩個方法:hashCode()和equals()
TreeXxx:底層數據結構是二叉樹。兩種方式排序:自然排序和比較器排序