Java中Link,set 和Map的區別,ArrayList,HashSet和HashMap的區別。


首先 List Set Map 分別繼承了ArrayList HashSet HashMap ,

list 允許重復,set不允許重復,map是鍵值對形式,key-value key不能重復。

期次AryyList是線程不安全的,底層使用的是object數組,由於采用數組作為儲存,那么插入和刪除數據的時候就到位置的影響比較大,比如做add操作額時候,默認會將元素追加到數組的尾部,但是如果制定位置坐添加或者刪除,那么坐后面的 數據就會向前或者向后自動移動 一位。雖然ArrayList 對於添加刪除響應時間比較長,但是對於查詢訪問,可以通過序列快速定位。對於內存空間來說,ArrayList 會在list列表的尾部預留一定容量的空間。

ArrayList 可以使用增強for循環來做遍歷元素。線程不安全。

private static final int DEFAULT_CAPACITY = 10;--初始值為10
private static final Object[] EMPTY_ELEMENTDATA = {};--空額 object數組;
 private transient Object[] elementData;
 public ArrayList() {
        super();
        this.elementData = EMPTY_ELEMENTDATA;
    }

 

 

接下來是HashSet ,HashSet的底層是基於HashMap實現的。set 是HashSet的接口類,放入到set中的數據 是不能重復的。那么為什么不能重復呢?放入HashSet的數據,會先計算hashCode值,來判斷插入的位置,與此同時也會對已經存在set中的數據做hashCode對比,如果沒有出現重復,則插入成功,如果發現值重復,那么會調用equals()方法來檢查hashCode值相等的對象內容是否相等,如果相等,那么就不會讓其插入 。

    private transient HashMap<E,Object> map;
    private static final Object PRESENT = new Object();
public boolean add(E e) { return map.put(e, PRESENT)==null; } public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key);--hashCode值 int i = indexFor(hash, table.length); 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; } } modCount++; addEntry(hash, key, value, i); return null; }

 接下來是HashMap  底層是數組和鏈表的結構,通過key的hashCode值確定value放置的位置。默認初始容量是16,1<<<4(源碼中就這么寫的)1000 二進制。

HashMap做添加操作的時候用的是put方法;

相關連接:https://snailclimb.top/JavaGuide/#/./java/collection/Java集合框架常見面試題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM