Android面試題資料結構篇
Android面試題資料結構篇,如果喜歡請持續關注和推薦。
List,Set,Map的區別
Set是最簡單的一種集合。集合中的物件不按特定的方式排序,並且沒有重複物件。 Set介面主要實現了兩個實現類:
HashSet: HashSet類按照雜湊演算法來存取集合中的物件,存取速度比較快
TreeSet :TreeSet類實現了SortedSet介面,能夠對集合中的物件進行排序。
List的特徵是其元素以線性方式儲存,集合中可以存放重複物件。
ArrayList() :代表長度可以改變得陣列。可以對元素進行隨機的訪問,向ArrayList()中插入與刪除元素的速度慢。
LinkedList():在實現中採用連結串列資料結構。插入和刪除速度快,訪問速度慢。
Map 是一種把鍵物件和值物件對映的集合,它的每一個元素都包含一對鍵物件和值物件。Map沒有繼承於Collection介面 從Map集合中檢索元素時,只要給出鍵物件,就會返回對應的值物件。
HashMap:Map基於散列表的實現。插入和查詢“鍵值對”的開銷是固定的。可以通過構造器設定容量capacity和負載因子load factor,以調整容器的效能。
LinkedHashMap: 類似於HashMap,但是迭代遍歷它時,取得“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,因為它使用連結串列維護內部次序。
TreeMap : 基於紅黑樹資料結構的實現。檢視“鍵”或“鍵值對”時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在 於,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
WeakHashMao :弱鍵(weak key)Map,Map中使用的物件也被允許釋放: 這是為解決特殊問題設計的。如果沒有map之外的引用指向某個“鍵”,則此“鍵”可以被垃圾收集器回收。
ArrayMap和HashMap的對比
1、儲存方式不同,HashMap內部有一個HashMapEntry<K,V>[]物件,每一個鍵值對都儲存在這個物件裡,當使用put方法新增鍵值對時,就會new一個HashMapEntry物件。
2、新增資料時擴容時的處理不一樣,進行了new操作,重新建立物件,開銷很大。ArrayMap用的是copy資料,所以效率相對要高。
3、ArrayMap提供了陣列收縮的功能,在clear或remove後,會重新收縮陣列,是否空間
4、ArrayMap採用二分法查詢;
HashMap和HashTable的區別
1 HashMap不是執行緒安全的,效率高一點、方法不是Synchronize的要提供外同步,有containsvalue和containsKey方法。
hashtable是,執行緒安全,不允許有null的鍵和值,效率稍低,方法是是Synchronize的。有contains方法方法。Hashtable 繼承於Dictionary 類
HashMap與HashSet的區別
hashMap:HashMap實現了Map介面,HashMap儲存鍵值對,使用put()方法將元素放入map中,HashMap中使用鍵物件來計算hashcode值,HashMap比較快,因為是使用唯一的鍵來獲取物件。
HashSet實現了Set介面,HashSet僅僅儲存物件,使用add()方法將元素放入set中,HashSet使用成員物件來計算hashcode值,對於兩個物件來說hashcode可能相同,所以equals()方法用來判斷物件的相等性,如果兩個物件不同的話,那麼返回false。HashSet較HashMap來說比較慢。
HashSet與HashMap怎麼判斷集合元素重複?
HashSet不能新增重複的元素,當呼叫add(Object)方法時候,首先會呼叫Object的hashCode方法判hashCode是否已經存在,如不存在則直接插入元素;如果已存在則呼叫Object物件的equals方法判斷是否返回true,如果為true則說明元素已經存在,如為false則插入元素。
ArrayList和LinkedList的區別,以及應用場景
ArrayList是基於陣列實現的,ArrayList執行緒不安全。 LinkedList是基於雙鏈表實現的。 使用場景:
如果應用程式對各個索引位置的元素進行大量的存取或刪除操作,ArrayList物件要遠優於LinkedList物件;
如果應用程式主要是對列表進行迴圈,並且迴圈時候進行插入或者刪除操作,LinkedList物件要遠優於ArrayList物件;
陣列和連結串列的區別
陣列:是將元素在記憶體中連續儲存的;它的優點:因為資料是連續儲存的,記憶體地址連續,所以在查詢資料的時候效率比較高;它的缺點:在儲存之前,我們需要申請一塊連續的記憶體空間,並且在編譯的時候就必須確定好它的空間的大小。在執行的時候空間的大小是無法隨著你的需要進行增加和減少而改變的,當資料兩比較大的時候,有可能會出現越界的情況,資料比較小的時候,又有可能會浪費掉記憶體空間。在改變資料個數時,增加、插入、刪除資料效率比較低。
連結串列:是動態申請記憶體空間,不需要像陣列需要提前申請好記憶體的大小,連結串列只需在用的時候申請就可以,根據需要來動態申請或者刪除記憶體空間,對於資料增加和刪除以及插入比陣列靈活。還有就是連結串列中資料在記憶體中可以在任意的位置,通過應用來關聯資料(就是通過存在元素的指標來聯絡)
HashMap的實現原理:
HashMap是基於雜湊表的map介面的非同步實現,它允許使用null值作為key和value。在Java程式語言中最基本的結構就是兩種,一種是陣列,另一種是模擬指標(引用)。所有的資料結構都可以用這兩個基本的結構來構造,HashMap也不例外。HashMap實際上是一個“連結串列雜湊”的資料結構。即陣列和連結串列的結合體。HashMap底層就是一個數據結構,陣列中的每一項又是一個連結串列。
衝突:
HashMap中呼叫Hashcode()方法計算Hashclde值,由於Java中兩個不同的物件可能有一樣的Hashcode。就導致了衝突的產生。
解決:
HashMap在put時候,底層原始碼可以看出,當程式試圖將一個key-value物件放入到HashMap中,首先根據該key的hashCode()返回值決定該Entry的儲存位置,如果兩個Entry的key的hashCode()方法返回值相同,那他們的儲存位置相同,如果這兩個Entry的key通過equals比較返回true,新新增的Entry的value將會覆蓋原來的Entry的value,但是key不會被覆蓋,反之,如果返回false,新新增的Entry將與集合中原有的Entry形成Entry鏈,新新增的位於頭部,舊的位於尾部。
原理
利用key的hashCode重新hash計算出當前物件的元素在陣列中的下標。
儲存時如果出現hash值相同的key,分兩種情況:1、如果key相同,則覆蓋原來的值。2、如果key不同(出現衝突),則放在連結串列中。
獲取時,直接找到hash值對應的下標,再進一步判斷key是否相同,從而拿到對應的值。
Hashmap的核心就是使用陣列進行儲存,出現key衝突的時候,就存放在連結串列中。
ConcurrentHashMap內部實現,HashTable的實現被廢棄的原因:
1.HashTable容器在競爭激烈的併發環境下表現出效率低下的原因,是因為所有訪問HashTable的執行緒都必須競爭同一把鎖,那假如容器裡有多把鎖,每一把鎖用於鎖容器其中一部分資料,那麼當多執行緒訪問容器裡不同資料段的資料時,執行緒間就不會存在鎖競爭,從而可以有效的提高併發訪問效率,這就是ConcurrentHashMap所使用的鎖分段技術,首先將資料分成一段一段的儲存,然後給每一段資料配一把鎖,當一個執行緒佔用鎖訪問其中一個段資料的時候,其他段的資料也能被其他執行緒訪問。
2.ConcurrentHashMap是由Segment陣列結構和HashEntry陣列結構組成。Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap裡扮演鎖的角色,HashEntry則用於儲存鍵值對資料。一個ConcurrentHashMap裡包含一個Segment陣列,Segment的結構和HashMap類似,是一種陣列和連結串列結構, 一個Segment裡包含一個HashEntry陣列,每個HashEntry是一個連結串列結構的元素,每個Segment守護者一個HashEntry數組裡的元素,當對HashEntry陣列的資料進行修改時,必須首先獲得它對應的Segment鎖。
說說 LruCache 底層原理
LruCache 使用一個 LinkedHashMap 簡單的實現記憶體的快取,沒有軟引用,都是強引用。如果新增的資料大於設定的最大值,就刪除最先快取的資料來調整記憶體。
maxSize 是通過構造方法初始化的值,他表示這個快取能快取的最大值是多少。
size 在新增和移除快取都被更新值,他通過safeSizeOf 這個方法更新值。safeSizeOf預設返回1,但一般我們會根據 maxSize重寫這個方法,比如認為 maxSize 代表是 KB 的話,那麼就以KB為單位返回該項所佔的記憶體大小。
除異常外首先會判斷size是否超過maxSize,如果超過了就取出最先插入的快取,如果不為空就刪掉,並把size減去該項所佔的大小。這個操作將一直迴圈下去,直到 size 比 maxSize 小或者快取為空。
最後
喜歡的話可以關注一下哦,會每天更新android相關的文章。