大廠Android面試題匯總(三)數(shù)據(jù)結(jié)構(gòu)

  • 常用數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)介
    數(shù)據(jù)元素相互之間的關(guān)系稱為結(jié)構(gòu)。
    有四類(lèi)基本結(jié)構(gòu):集合、線性結(jié)構(gòu)、樹(shù)形結(jié)構(gòu)、圖狀結(jié)構(gòu)。
    1,集合結(jié)構(gòu):除了同屬于一種類(lèi)型外,別無(wú)其它關(guān)系。
    2,線性結(jié)構(gòu):元素之間存在一對(duì)一關(guān)系常見(jiàn)類(lèi)型有:?數(shù)組,鏈表,隊(duì)列,棧,它們之間在操作上有所區(qū)別。
      例如:鏈表可在任意位置插入或刪除元素,而隊(duì)列在隊(duì)尾插入元素,隊(duì)頭刪除元素, 棧只能在棧頂進(jìn)行插入,刪除操作.
    3,樹(shù)形結(jié)構(gòu):元素之間存在一對(duì)多關(guān)系,常見(jiàn)類(lèi)型有:樹(shù)(有許多特例:二叉樹(shù)、平衡二叉樹(shù)、查找樹(shù)等)。
    4,圖形結(jié)構(gòu):元素之間存在多對(duì)多關(guān)系,圖形結(jié)構(gòu)中每個(gè)結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)數(shù)和后續(xù)結(jié)點(diǎn)多個(gè)數(shù)可以任意。
  • 并發(fā)集合了解哪些?
    竟一個(gè)都沒(méi)用過(guò)
    并發(fā)集合類(lèi)
  • 列舉java的集合以及集合之間的繼承關(guān)系
    繼承關(guān)系

    java集合繼承關(guān)系及特點(diǎn)
  • 集合類(lèi)以及集合框架


    完整集合框架
  • 容器類(lèi)介紹以及之間的區(qū)別(
    容器類(lèi)估計(jì)很多人沒(méi)聽(tīng)這個(gè)詞,Java容器主要可以劃分為4個(gè)部分:List列表、Set集合、Map映射、工具類(lèi)(Iterator迭代器、Enumeration枚舉類(lèi)、Arrays和Collections),具體的可以看看這篇博文 Java容器類(lèi)
  • List,Set,Map的區(qū)別
    詳見(jiàn)上邊各帖
  • List和Map的實(shí)現(xiàn)方式以及存儲(chǔ)方式
    詳見(jiàn)上邊各貼
  • HashMap的實(shí)現(xiàn)原理
    HashMap的實(shí)現(xiàn)原理
    HashMap實(shí)現(xiàn)原理及源碼分析
  • HashMap數(shù)據(jù)結(jié)構(gòu)?
    見(jiàn)上
  • HashMap源碼理解
    見(jiàn)上
  • HashMap如何put數(shù)據(jù)(從HashMap源碼角度講解)?
//存儲(chǔ)
public V put(K key, V value) {
    // HashMap允許存放null鍵和null值。
    // 當(dāng)key為null時(shí),調(diào)用putForNullKey方法,將value放置在數(shù)組第一個(gè)位置。  
    if (key == null)
        return putForNullKey(value);
    // 根據(jù)key的keyCode重新計(jì)算hash值。
    int hash = hash(key.hashCode());
    // 搜索指定hash值在對(duì)應(yīng)table中的索引。
    int i = indexFor(hash, table.length);
    // 如果 i 索引處的 Entry 不為 null,通過(guò)循環(huán)不斷遍歷 e 元素的下一個(gè)元素。
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }
    // 如果i索引處的Entry為null,表明此處還沒(méi)有Entry。
    modCount++;
    // 將key、value添加到i索引處。
    addEntry(hash, key, value, i);
    return null;
}

void addEntry(int hash, K key, V value, int bucketIndex) {
    // 獲取指定 bucketIndex 索引處的 Entry  
    Entry<K,V> e = table[bucketIndex];
    // 將新創(chuàng)建的 Entry 放入 bucketIndex 索引處,并讓新的 Entry 指向原來(lái)的 Entry  
    table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
    // 如果 Map 中的 key-value 對(duì)的數(shù)量超過(guò)了極限
    if (size++ >= threshold)
    // 把 table 對(duì)象的長(zhǎng)度擴(kuò)充到原來(lái)的2倍。
        resize(2 * table.length);
}

static int hash(int h) {
    h ^= (h >>> 20) ^ (h >>> 12);
    return h ^ (h >>> 7) ^ (h >>> 4);  
}

static int indexFor(int h, int length) {  
    return h & (length-1);
}

//獲取
public V get(Object key) {
    if (key == null)
        return getForNullKey();
    int hash = hash(key.hashCode());
    for (Entry<K,V> e = table[indexFor(hash, table.length)];
        e != null;
        e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k)))  
            return e.value;
    }
    return null;
}

簡(jiǎn)單來(lái)說(shuō)就是將Entry根據(jù)hash算法放入數(shù)組的鏈表中的一個(gè)過(guò)程
詳見(jiàn)上

  • HashMap怎么手寫(xiě)實(shí)現(xiàn)?
    見(jiàn)上
  • ConcurrentHashMap的實(shí)現(xiàn)原理
    Java并發(fā)包中提供的一個(gè)線程安全且高效的HashMap實(shí)現(xiàn),策略就是分段鎖機(jī)制。
    ConcurrentHashMap實(shí)現(xiàn)原理及源碼分析
  • ArrayMap和HashMap的對(duì)比
    ArrayMap和HashMap區(qū)別
  • HashTable實(shí)現(xiàn)原理
    HashTable的使用和原理
  • TreeMap具體實(shí)現(xiàn)
    TreeMap
  • HashMap和HashTable的區(qū)別
    (1)基類(lèi)不同:HashTable基于Dictionary類(lèi),而HashMap是基于AbstractMap。Dictionary是什么?它是任何可將鍵映射到相應(yīng)值的類(lèi)的抽象父類(lèi),而AbstractMap是基于Map接口的骨干實(shí)現(xiàn),它以最大限度地減少實(shí)現(xiàn)此接口所需的工作。
    (2)null不同:HashMap可以允許存在一個(gè)為null的key和任意個(gè)為null的value,但是HashTable中的key和value都不允許為null。
    (3)線程安全:HashMap時(shí)單線程安全的,Hashtable是多線程安全的。
    (4)遍歷不同:HashMap僅支持Iterator的遍歷方式,Hashtable支持Iterator和Enumeration兩種遍歷方式
  • HashMap與HashSet的區(qū)別
    兩者區(qū)別

    HashMap和HashSet的區(qū)別
  • 集合Set實(shí)現(xiàn)Hash怎么防止碰撞
    Java集合---HashSet的源碼分析
  • ArrayList和LinkedList的區(qū)別,以及應(yīng)用場(chǎng)景
    1,如果應(yīng)用程序?qū)Ω鱾€(gè)索引位置的元素進(jìn)行大量的存取或刪除操作,ArrayList對(duì)象要遠(yuǎn)優(yōu)于LinkedList對(duì)象;
    2,如果應(yīng)用程序主要是對(duì)列表進(jìn)行循環(huán),并且循環(huán)時(shí)候進(jìn)行插入或者刪除操作,LinkedList對(duì)象要遠(yuǎn)優(yōu)于ArrayList對(duì)象;
    ArrayList和LinkedList區(qū)別及使用場(chǎng)景
  • 數(shù)組和鏈表的區(qū)別
    數(shù)組 分配內(nèi)存連續(xù),長(zhǎng)度固定,插入,刪除操作效率低
    鏈表 分配內(nèi)存不連續(xù),長(zhǎng)度不固定,插入,刪除操作效率高
  • 二叉樹(shù)的深度優(yōu)先遍歷和廣度優(yōu)先遍歷的具體實(shí)現(xiàn)
public void depthFirst() {  
    Stack<Map<String, Object>> nodeStack = new Stack<Map<String, Object>>();  
    Map<String, Object> node = new HashMap<String, Object>();  
    nodeStack.add(node);  
    while (!nodeStack.isEmpty()) {  
        node = nodeStack.pop();  
        System.out.println(node);  
        //獲得節(jié)點(diǎn)的子節(jié)點(diǎn),對(duì)于二叉樹(shù)就是獲得節(jié)點(diǎn)的左子結(jié)點(diǎn)和右子節(jié)點(diǎn)  
        List<Map<String, Object>> children = getChildren(node);  
        if (children != null && !children.isEmpty()) {  
            for (Map child : children) {  
                nodeStack.push(child);  
            }  
        }  
    }  
}  
?//節(jié)點(diǎn)使用Map存放  
public void breadthFirst() {  
    Deque<Map<String, Object>> nodeDeque = new ArrayDeque<Map<String, Object>>();  
    Map<String, Object> node = new HashMap<String, Object>();  
    nodeDeque.add(node);  
    while (!nodeDeque.isEmpty()) {  
        node = nodeDeque.peekFirst();  
        System.out.println(node);  
        //獲得節(jié)點(diǎn)的子節(jié)點(diǎn),對(duì)于二叉樹(shù)就是獲得節(jié)點(diǎn)的左子結(jié)點(diǎn)和右子節(jié)點(diǎn)  
        List<Map<String, Object>> children = getChildren(node);  
        if (children != null && !children.isEmpty()) {  
            for (Map child : children) {  
                nodeDeque.add(child);  
            }  
        }  
    }  
}  
//這里使用的是雙端隊(duì)列,和使用queue是一樣的  

Java遍歷樹(shù)(深度優(yōu)先+廣度優(yōu)先)

問(wèn)題來(lái)自:AWeiLoveAndroid的博客

最后編輯于
?著作權(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ù)。

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,823評(píng)論 18 399
  • Java集合類(lèi)可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 2,098評(píng)論 0 13
  • 數(shù)據(jù)結(jié)構(gòu)是以某種形式將數(shù)據(jù)組織在一起的集合,它不僅存儲(chǔ)數(shù)據(jù),還支持訪問(wèn)和處理數(shù)據(jù)的操作。Java提供了幾個(gè)能有效地...
    今生心理金馀閱讀 2,152評(píng)論 2 12
  • 加入了百人百天挑戰(zhàn)營(yíng)后,我發(fā)現(xiàn)又給自己找了一件麻煩事。理想很豐滿,現(xiàn)實(shí)很骨感。加入時(shí)幻想著養(yǎng)成跑步的習(xí)慣,減肥,鍛...
    平凡而溫暖的小月亮閱讀 347評(píng)論 1 1
  • 紅燒肉是中華的一道經(jīng)典名菜,在中國(guó)各地流傳甚廣。不同的做法有不同的口感,有的人做出來(lái)的五花肉肉偏硬,難以嚼爛,有的...
    好大一個(gè)煙鍋巴閱讀 369評(píng)論 1 1

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