HashMap

  1. list,map,set的區別(首先假定小豬都是同一個細胞克隆出來的)
  2. List=排成一長隊的小豬
  3. Map=放在一個個,有房間號的屋子裏面的一羣小豬
  4. Set=一羣小豬貼上號,然後趕到一個豬圈裏
Hashset 它不保證集合的迭代順序;特別是它不保證該順序恆久不變。
LinkedHashSet定義了迭代順序,即按照將元素插入到集合中的順序(插入順序)進行迭代。

map遍歷 keySet ,EntrySet ,(iterator ,foreach)

  1. Map<String,String> map =newHashMap<String,String>();
    map.put("1","001");
    map.put("2","002");
    map.put("3","003");
    String key ="";
    String value ="";
    // 遍歷1 keySet方式
    Iterator<String> it = map.keySet().iterator();
    while(it.hasNext()){
    key = it.next();
    value = map.get(key);
    System.out.println(key +" : "+ value);
    }
    // 遍歷2 增強for循環
    for(String string : map.keySet()){
    value = map.get(string);
    System.out.println(string +" : "+ value);
    }
    // 遍歷3 entrySet
    Iterator<Entry<String,String>> iter = map.entrySet().iterator();
    Entry<String,String> entry;
    while(iter.hasNext()){
    entry = iter.next();
    key = entry.getKey();
    value = entry.getValue();
    System.out.println(key +" : "+ value);
    }
    // 遍歷4 entrySet foreach
    for(Entry<String,String> entry2 : map.entrySet()){
    key = entry2.getKey();
    value = entry2.getValue();
    System.out.println(key +" : "+ value);
    }
    

      

map最大 容量 1<< 30 =1073741824
<< 左移位  相當於乘以多少個2, 最大30,以爲32位,so,超過32位就是1,31位時候是-2147483648
>> 右移位  除以多少個2
>>> 無符號移位
2<<2  = 8 
 
基於哈希表的 Map 接口的實現。此實現提供所有可選的映射操作,並允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順序恆久不變。
 

構造方法

static final int DEFAULT_INITIAL_CAPACITY = 16; 

 

static final int MAXIMUM_CAPACITY = 1 << 30; 
static final float DEFAULT_LOAD_FACTOR = 0.75f; 
有參數,初始化大小等
 public HashMap(int initialCapacity, float loadFactor) 

 

 public HashMap(int initialCapacity) 
 無參構造
public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
        table = new Entry[DEFAULT_INITIAL_CAPACITY];
        init();
    } 
 
可接收map類型的構造
 public HashMap(Map<? extends K, ? extends V> m) {
        this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1,
                      DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);
        putAllForCreate(m);
    } 

方法

是否包含 key
 1 publicboolean containsKey(Object key){
 2 Object k = maskNull(key);
 3 int hash = hash(k);
 4 int i = indexFor(hash, table.length);
 5 Entry e = table[i];
 6 while(e !=null){
 7 if(e.hash == hash && eq(k, e.key))
 8 returntrue;
 9 e = e.next;
10 }
11 returnfalse;
12 }

 

  
 
包含value
  1.  1 publicboolean containsValue(Object value){
     2 if(value ==null)
     3 return containsNullValue();
     4 Entry[] tab = table;
     5 for(int i =0; i < tab.length ; i++)
     6 for(Entry e = tab[i]; e !=null; e = e.next)
     7 if(value.equals(e.value))
     8 returntrue;
     9 returnfalse;
    10 }

     

 
 
加入元素(如果key存在,則返回原value,不存在則加入)
  1.  1 public V put(K key, V value){
     2 K k = maskNull(key);
     3 int hash = hash(k);
     4 int i = indexFor(hash, table.length);
     5 for(Entry<K,V> e = table[i]; e !=null; e = e.next){
     6 if(e.hash == hash && eq(k, e.key)){
     7 V oldValue = e.value;
     8 e.value = value;
     9 e.recordAccess(this);
    10 return oldValue;
    11 }
    12 }
    13 modCount++;
    14 addEntry(hash, k, value, i);
    15 returnnull;
    16 }

     

 public void putAll(Map<? extends K, ? extends V> m) 
 
可以放入map 類型
 
 根據key刪除
  1. 1 public V remove(Object key){
    2 Entry<K,V> e = removeEntryForKey(key);
    3 return(e ==null?null: e.value);
    4 }

     

清空
  1.  1 /**
     2 * Removes all mappings from this map.
     3 */
     4 publicvoid clear(){
     5 modCount++;
     6 Entry[] tab = table;
     7 for(int i =0; i < tab.length; i++)
     8 tab[i]=null;
     9 size =0;
    10 }

     

重寫了 hashCode  toString

  1.  1 publicboolean equals(Object o){
     2 if(!(o instanceofMap.Entry))
     3 returnfalse;
     4 Map.Entry e =(Map.Entry)o;
     5 Object k1 = getKey();
     6 Object k2 = e.getKey();
     7 if(k1 == k2 ||(k1 !=null&& k1.equals(k2))){
     8 Object v1 = getValue();
     9 Object v2 = e.getValue();
    10 if(v1 == v2 ||(v1 !=null&& v1.equals(v2)))
    11 returntrue;
    12 }
    13 returnfalse;
    14 }
    15 publicint hashCode(){
    16 return(key==NULL_KEY ?0: key.hashCode())^
    17 (value==null?0: value.hashCode());
    18 }
    19 publicString toString(){
    20 return getKey()+"="+ getValue();
    21 }

     

 
遍歷方法keySet 和entrySet 選擇上,由此可知,key簡單情況下,選keySet, 需要同時取值時候選entrySet
entrySet消耗更大
 keySet
  1. 1 publicSet<K> keySet(){
    2 Set<K> ks = keySet;
    3 return(ks !=null? ks :(keySet =newKeySet()));
    4 }

     

 
  entrySet 
  1. 1 publicSet<Map.Entry<K,V>> entrySet(){
    2 Set<Map.Entry<K,V>> es = entrySet;
    3 return(es !=null? es :(entrySet =(Set<Map.Entry<K,V>>)(Set)newEntrySet()));
    4 }

     

 
 Values
  1. 1 publicCollection<V> values(){
    2 Collection<V> vs = values;
    3 return(vs !=null? vs :(values =newValues()));
    4 }

     



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章