2019-02-23

集合(Collection / Map) - 一:

Collection

Java 集合繼承圖
![Java集合繼承圖.jpg](https://upload-images.jianshu.io/upload_images/14215857-12709e2df837f10b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

Collection 繼承 → Iterable 有 iterator() 方法
顧 凡是繼承Collection的 都會(huì)有 iterator() 方法

iterator():
    1. hasNext()
    2. next()
    3. remove()

Collection(接口)
    1. List(接口)   繼承 Collection
        a. ArrayList(實(shí)現(xiàn)類) 
        b. LinkedList(實(shí)現(xiàn)類)
        c. Vector(實(shí)現(xiàn)類)
        
    2. Set(接口)    繼承 Collection
        a. HashSet(類)
        b. SortedSet(接口)
            1. TreeSet(實(shí)現(xiàn)類)
            
            
Collection 特點(diǎn):
    1. 只能存儲(chǔ)引用類型, 并且只能單個(gè)存儲(chǔ)數(shù)據(jù)(一個(gè)一個(gè)存)
       存 1, 2, 3 不報(bào)錯(cuò)是因?yàn)?自動(dòng)裝箱 轉(zhuǎn)成了 包裝類

類比數(shù)組:

定義: 
    存放同一類型, 在存儲(chǔ)空間中連續(xù)的一系列數(shù)據(jù)

數(shù)組尋址公式:
    改數(shù)據(jù)地址 = 數(shù)組首數(shù)據(jù)地址 + 索引 * 該類型的字節(jié)數(shù)
    
為什么數(shù)組的索引是從 0 開始的?
    因?yàn)槿绻麖?1 開始 或者其他開始, 就會(huì)多運(yùn)算后面的 乘法, 如果是 0 的話
    
效率高:
    查詢
    
效率低:
    添加刪除
    

List

特點(diǎn):
    1. 有序
    2. 可重復(fù)
    3. 單個(gè)存儲(chǔ)
    4. 存引用類型
        原因: 由于繼承了Collection 所以特點(diǎn)也包括 Collection特點(diǎn)
ArrayList
底層數(shù)據(jù)結(jié)構(gòu):
    數(shù)組, 顧適合 查詢
特點(diǎn):
    1. 適合 查詢
    2. 不適合 增刪
    
    原因: 底層采用數(shù)組存儲(chǔ)元素的 而數(shù)組底層是有規(guī)律的順序的存儲(chǔ)的.
        
LinkedList
底層數(shù)據(jù)結(jié)構(gòu):
    雙向鏈表, 顧適合頻繁增刪, 不適合查詢
    
特點(diǎn):
    1. 合適 增刪
    2. 不適合 查詢
Vector
底層數(shù)據(jù)結(jié)構(gòu):
    數(shù)組, 也只適合查詢
    
特點(diǎn):
    1. 適合多線程, 因?yàn)槭蔷€程安全的
    2. 效率不高
    
一般情況不會(huì)使用集合自帶的安全機(jī)制, Vector 效率不高, 現(xiàn)在用的比較少

Set

特點(diǎn):
    1. 無序
    2. 不可重復(fù)
    
HashSet
底層數(shù)據(jù)結(jié)構(gòu):
    哈希散列表

SortedSet(接口)
底層數(shù)據(jù)結(jié)構(gòu)
    
特點(diǎn):
    1. 無序
    2. 不可重復(fù)
    3. 排序 → 根據(jù)大小
        原因: 
        
實(shí)現(xiàn)類:
    TreeMap
    
    TreeMap特點(diǎn):
        1. key 就是 一個(gè) TreeSet

Map

Map(接口):
    1. SortedMap(接口)
    2. HashMap(實(shí)現(xiàn)類)
        a. LinkedMap
    3. Hashtable(實(shí)現(xiàn)類)          → 線程安全, 效率不高, 用的少
    4. ConcurrentHashMap(實(shí)現(xiàn)類)  → 并發(fā)編程

特點(diǎn):
    鍵值對(duì)

HashMap ?

特點(diǎn):
    1. 無序
    2. key 不可重復(fù), 類似于 Set 的不可重復(fù) 

Hashtable

Hashtable 本身用的不多, 但是他的子類 Properties 用的多, 用于配置文件.

Properties 特點(diǎn):
    1. key 和 value存儲(chǔ)
    2. 存儲(chǔ)類型只能是 字符串

Hashtable

特點(diǎn):
    1. 無序
    2. 不可重復(fù)
    3. 排序 → 按照 key 大小排序, 類似于 SortedSet

UML

繼承 → 空心箭頭
實(shí)現(xiàn) → 虛線空心

擴(kuò)展

單向鏈表:
單向鏈表:
    每個(gè)元素都稱作結(jié)點(diǎn) Entry(JDK 1.5) / Node(JDK 1.8)

特點(diǎn):
    1. 單項(xiàng)鏈表每個(gè)結(jié)點(diǎn)字內(nèi)存中的存儲(chǔ)空間沒有規(guī)律

問題:
    1. 為什么單項(xiàng)鏈表查詢效率低?
    答: 因?yàn)閱雾?xiàng)鏈表在內(nèi)存中存儲(chǔ)的空間上面是沒有規(guī)律的, 也沒有順序, 如果我們想要獲得到摸個(gè)元素, 要從頭開始往后遍歷, 找到為止
    
    2. 為什么單向鏈表增刪效率高?
    答: 因?yàn)閱雾?xiàng)鏈表在內(nèi)存中存儲(chǔ)的空間上面沒有規(guī)律, 刪除或者隨機(jī)增加元素, 只要讓指針重新指向即可, 不要將后面元素位移.
雙向鏈表:
    頭部內(nèi)存地址 是上一個(gè)元素的內(nèi)存地址, 尾部的內(nèi)存地址是下一個(gè)元素的內(nèi)存地址
import java.util.ArrayList;
import java.util.Collection;

/**
 * description:     集合的基本操作
 *
 * @author Lomonkey
 * @date 2019/2/22
 */

/**
*   add()               添加元素
*   clear()             清空集合
*   contains()          判斷元素是否存在
*   isEmpty()           判斷是否為空, 為空 返回 true
*   iterator()          創(chuàng)建迭代器
*   remove()            刪除元素
*   retainAll()         交集
*   size()              集合長度
*   toArray()           轉(zhuǎn)換成數(shù)組
*
* */
public class ConnectionTest1 {

    public static void main(String[] args) {
        // 創(chuàng)建一個(gè) 集合
        // 父類型引用 指向子類對(duì)象 → 多態(tài)
        Collection collection = new ArrayList();

        // 添加元素 → 只能添加引用類型
        collection.add(123321);
        collection.add("的說法");
        collection.add(true);


        // 泛型集合
        Collection<String> collection1 = new ArrayList<String>();
        // 只能添加 String 類型
        collection1.add("大家好!");
        collection1.add("你們好!");
        /*
        * 在編譯階段, 對(duì)代碼進(jìn)行檢查
        * */

        // 能直接打印出 → 大家好!
        System.out.println(collection1);
        // collection1 指向的是 ArrayList集合的對(duì)象
        // 調(diào)用 println() 方法的時(shí)候, 把 collection1 的變量值, 即ArrayList的對(duì)象的引用

        // 判斷非空
        System.out.println(collection1.isEmpty());

        // 長度
        System.out.println(collection1.size());

        // 判斷元素是否存在
        System.out.println(collection1.contains("da"));

        // 刪除元素
        collection1.remove("大家好");
        System.out.println(collection1);

        // 轉(zhuǎn)化成數(shù)組
        Object[] arr = collection1.toArray();
        for(Object o : arr){
            System.out.print(o);
        }
    }
}

作業(yè):

java 來模擬單鏈表
public class Linked{
    // 結(jié)點(diǎn)
    Entry entry;
    
    //  構(gòu)造
    Linked(){
        entry = new Entry(null, null);
    }
    
    // 元素的添加 → add
    
    // 元素的刪除 → remove
    
    // 元素的查找 → find
    
    // 元素
    
    
    // 內(nèi)部類 幾點(diǎn)
    static class Entry{
        Object data;
        Entry next;
        
        Entry(Object data, Entry next){
            this.data = data;
            this.next = next;
        }
    }
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java集合類可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 2,091評(píng)論 0 13
  • 在一個(gè)方法內(nèi)部定義的變量都存儲(chǔ)在棧中,當(dāng)這個(gè)函數(shù)運(yùn)行結(jié)束后,其對(duì)應(yīng)的棧就會(huì)被回收,此時(shí),在其方法體中定義的變量將不...
    Y了個(gè)J閱讀 4,576評(píng)論 1 14
  • 集合類框架的介紹: ![Java 集合類框架](https://upload-images.jianshu.io/...
    LynnGuo閱讀 804評(píng)論 0 1
  • ArrayList實(shí)現(xiàn)原理要點(diǎn)概括 參考文獻(xiàn):http://zhangshixi.iteye.com/blog/6...
    晨光光閱讀 1,168評(píng)論 0 1
  • 在編程中,常常需要集中存放多個(gè)數(shù)據(jù)。集合類主要負(fù)責(zé)保存、盛裝其他數(shù)據(jù),因此集合類也被稱為容器類。所有的集合類都位于...
    一一一二二三閱讀 489評(píng)論 0 1

友情鏈接更多精彩內(nèi)容