2019-10-08集合

集合:Collection 單例集合的根接口

List

如果是實(shí)現(xiàn)了List接口的集合類,具備的特點(diǎn):有序,可重復(fù)
ArrayList 底層是使用了Object數(shù)組實(shí)現(xiàn)的 特點(diǎn):查詢速度快 增刪慢
LinkedList 底層使用了鏈表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的 特點(diǎn):查詢速度慢 增刪快
Vector 底層使用了Object數(shù)組實(shí)現(xiàn)的 實(shí)現(xiàn)原理與ArrayList 是一致的 但是線程是安全的 操作效率低


Set

如果是實(shí)現(xiàn)了Set接口的實(shí)現(xiàn)類 具備的特點(diǎn):無(wú)序,不可重復(fù)
HashSet 底層是使用了哈希表實(shí)現(xiàn)的 特點(diǎn)存取速度快

  HashSet注意事項(xiàng):  往HashSet中添加元素時(shí),首先會(huì)調(diào)用hashcode方法得到元素的哈希碼值,然后把哈希碼經(jīng)過(guò)運(yùn)算得到該元素在hash表中的位置
    情況1:如果算出的位置目前還沒(méi)有存在任何的元素,那么該元素會(huì)直接添加到哈希表中
    情況2:如果算法的位置已經(jīng)存在其他的元素,那么還會(huì)調(diào)用元素的equals方法與這個(gè)位置上的元素再比較一次;
          如果equals方法返回的值為T(mén)rue,那么該元素被視為重復(fù)元素,不允許添加,
          如果返回false,那么該元素也會(huì)被添加(存疑:是否重新計(jì)算hashcode值)

代碼實(shí)現(xiàn)

import java.util.HashSet;
import java.util.Set;

public class Connection1 {

    public static void main(String[] args) {
        Set set = new HashSet();
        A a1 = new A();
        B b1 = new B();
        
        set.add(a1); // 1
        set.add(b1); // 2 // 由于1和2的hashcode相同,而且equals直接相等,因此認(rèn)為兩個(gè)對(duì)象相同,2就不被允許存儲(chǔ)
        System.out.println(a1.hashCode());
        System.out.println(b1.hashCode());
        System.out.println(set);
        B b2 = new B();
        B b3 = new B();
        set.add(new B());
        System.out.println(set);
    }
}

class A{
    @Override
    public int hashCode() {
        return 1;
    }
}

class B{
    public static int count = 0;
    int a = 0;
    public B(){
        count++;
        a = count;
    }
    
    @Override
    public int hashCode() {
        return a;
    }
    
    @Override
    public boolean equals(Object obj) {
        return true;
    }
}

輸出結(jié)果:
1
1
[com.ysy.A@1]
[com.ysy.A@1, com.ysy.B@4]

package com.ysy;

import java.util.HashSet;
import java.util.Set;

public class Connection2 {

    public static void main(String[] args) {
        Set set = new HashSet();
        B1 b1 = new B1();
        B1 b2 = new B1();
        set.add(b1);
        set.add(b2);
        
        System.out.println(set);
        System.out.println(b1); // com.ysy.B1@1
        System.out.println(b2); // com.ysy.B1@1
        System.out.println(b1 == b2); // false
        System.out.println(b1.hashCode()); // 1
        System.out.println(b2.hashCode()); // 1
    }
}

class B1{
    int a = 0;
    public B1(){
        a = 1;
    }
    
    @Override
    public int hashCode() {
        return a;
    }
}

輸出結(jié)果:
[com.ysy.B1@1, com.ysy.B1@1]
com.ysy.B1@1
com.ysy.B1@1
false
1
1

遺留問(wèn)題:內(nèi)存地址相同,hashcode值相等,但不屬于同一個(gè)對(duì)象(可能原因:com.ysy.B1@1不是地址,或則equals比較的不是地址)

TreeSet 底層是使用了紅黑樹(shù)(二叉樹(shù))數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的。特點(diǎn):對(duì)集合中的元素進(jìn)行排序

TreeSet注意事項(xiàng):    
1. 往TreeSet中添加元素的時(shí)候 如果元素巨鱉自然順序的特點(diǎn),那么TreeSet會(huì)根據(jù)元素的自然順序特性排序
2. 往TreeSet中添加元素的時(shí)候 如果元素巨鱉自然順序的特點(diǎn),那么元素所屬的類就必須要實(shí)現(xiàn)Compareble接口,將比較方法定義在CompareTo方法中
3. 往TreeSet中添加元素的時(shí)候 如果元素巨鱉自然順序的特點(diǎn),且元素所屬的類沒(méi)有實(shí)現(xiàn)Compareble接口,那么創(chuàng)建TreeSet對(duì)象時(shí),必須要傳入比較器對(duì)象
    比較器的定義格式: class 類名 implements Comparator{}

Map 雙列集合的根接口

Map 存儲(chǔ)的數(shù)據(jù)都是以鍵值對(duì)的形式存在的,鍵不可重復(fù),值可重復(fù)
HashMap 底層也是使用了哈希表實(shí)現(xiàn)的
TreeMap 底層是使用了紅黑樹(shù)(二叉樹(shù))數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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