zoukankan      html  css  js  c++  java
  • 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 }



  • 相关阅读:
    阿里terway源码分析
    golang timeoutHandler解析及kubernetes中的变种
    第四章 控制和循环
    关于 自媒体的声明
    java用正则表达式获取url的域名
    javaweb三大核心基础技术
    NumPy之计算两个矩阵的成对平方欧氏距离
    C/C++之计算两个整型的平均值
    C/C++代码优化之整型除以2的指数并四舍五入
    SSE系列内置函数中的shuffle函数
  • 原文地址:https://www.cnblogs.com/liubo6/p/4491189.html
Copyright © 2011-2022 走看看