博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashMap
阅读量:6583 次
发布时间:2019-06-24

本文共 4669 字,大约阅读时间需要 15 分钟。

  1. list,map,set的区别(首先假定小猪都是同一个细胞克隆出来的)
  2. List=排成一长队的小猪
  3. Map=放在一个个,有房间号的屋子里面的一群小猪
  4. Set=一群小猪贴上号,然后赶到一个猪圈里
Hashset 它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。
LinkedHashSet定义了迭代顺序,即按照将元素插入到集合中的顺序(插入顺序)进行迭代。

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

  1. Map
    map =newHashMap
    ();map.put("1","001");map.put("2","002");map.put("3","003");String key ="";String value ="";// 遍历1 keySet方式Iterator
    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 entrySetIterator
    > iter = map.entrySet().iterator();Entry
    entry;while(iter.hasNext()){entry = iter.next();key = entry.getKey();value = entry.getValue();System.out.println(key +" : "+ value);}// 遍历4 entrySet foreachfor(Entry
    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
    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
    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
    keySet(){2 Set
    ks = keySet;3 return(ks !=null? ks :(keySet =newKeySet()));4 }

     

 
  entrySet 
  1. 1 publicSet
    > entrySet(){2 Set
    > es = entrySet;3 return(es !=null? es :(entrySet =(Set
    >)(Set)newEntrySet()));4 }

     

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

     

转载于:https://www.cnblogs.com/liubo6/p/4491189.html

你可能感兴趣的文章
Gson工具包使用
查看>>
有一个系统修复处于挂起状态,需要重新启动才能完成该修复
查看>>
Ubuntu上安装bind9
查看>>
访问共享提示“服务器存储空间不足,无法处理此命令。”
查看>>
C#读写XML文件
查看>>
linux
查看>>
今夜杂谈
查看>>
第七章 虚拟化 虚拟机备份 Veeam backup &Replication
查看>>
微软云计算介绍与实践(介绍之五)
查看>>
在linux下搭建HA和LB集群(lvs&heartbeat群集)
查看>>
安装wine
查看>>
阻抗匹配与史密斯(Smith)圆图基本原理
查看>>
路由器与交换机的密码恢复
查看>>
Cisco路由器上的IPSec协议(站点到站点的×××)
查看>>
Java面向对象学习笔记 -- 5(抽象类、接口)
查看>>
关于apache下同IP多域名支持HTTPS和80跳转HTTPS的配置
查看>>
Linux Python详细安装、升级指南
查看>>
软件架构
查看>>
无法修复ie使用代理服务器
查看>>
【Apache Mina2.0开发之二】自定义实现Server/Client端的编解码工厂(自定义编码与×××)!...
查看>>