集合(三)

集合的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:底層數據結構是二叉樹。兩種方式排序:自然排序和比較器排序


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