zoukankan      html  css  js  c++  java
  • Map以及HashMap

      本文主要介绍java集合框架的Map集合,在日常生活中Map的运用也十分广泛。

      与List集合、Set集合隶属于Collection不同,Map是一个独立的接口,与Collection相同级别的接口。

      重要的是,Map集合提供了一个不一样的元素存储方法,利用“key—value”的形式进行存储。其中,每个键映射一个值。而在Set集合中,元素的存储就是利用Map的这一特性来实现。

      简单的介绍了下Map集合,接下来,就让笔者对其主要实现类HashMap、TreeMap、HashTable进行详细的说明。

     

    1 Map常用方法

    具体介绍之前,我们先了解下Map接口本身,一边了解所有实现的共同点。

     1 public interface Map<K,V> {
     2 
     3     //返回Map中的key--value的数目
     4     int size();
     5 
     6     //如果Map不包含任何key--value,则返回 true
     7     boolean isEmpty();
     8 
     9     //如果Map中包含指定key的映射,则返回true
    10     boolean containsKey(Object key);
    11 
    12     //如果此Map将一个或多个键映射到指定值,则返回 true
    13     boolean containsValue(Object value);
    14 
    15     //返回与指定键关联的值
    16     V get(Object key);
    17 
    18     //将指定值与指定键相关联
    19     V put(K key, V value);
    20 
    21     //从Map中删除键和关联的值
    22     V remove(Object key);
    23 
    24     //将指定Map中的所有映射复制到此map
    25     void putAll(java.util.Map<? extends K, ? extends V> m);
    26 
    27     //从Map中删除所有映射
    28     void clear();
    29 
    30     //返回Map中所包含键的Set集合
    31     Set<K> keySet();
    32 
    33     //返回 map 中所包含值的 Collection集合。
    34     Collection<V> values();
    35 
    36     //返回Map中所包含映射的Set视图。Set中的每个元素都是一个 Map.Entry 对象
    37     Set<java.util.Map.Entry<K, V>> entrySet();
    38 
    39     //比较指定对象与此 Map 的等价性
    40     boolean equals(Object o);
    41 
    42     //返回此 Map 的哈希码
    43     int hashCode();
    44 
    45     //Map集合中存储key--value的对象Entry,在Map集合内形成数组结构
    46     interface Entry<K,V> {
    47 
    48         V getValue();
    49 
    50         V setValue(V value);
    51 
    52         boolean equals(Object o);
    53 
    54         int hashCode();
    55     }
    56 }

     2 HashMap

      HashMap基于哈希表,底层结构由数组来实现,添加到集合中的元素以“key—value”形式保存到数组中,在数组中key—value被包装成一个实体来处理—-也就是上面Map接口中的Entry。

      在HashMap中,Entry[]保存了集合中所有的键值对,当我们需要快速存储、获取、删除集合中的元素时,HashMap会根据hash算法来获得“键值对”在数组中存在的位置,以来实现对应的操作方法。

      此时,细心的朋友可能会问,既然是基于哈希表的实现,那么当新增的元素出现了hash值重复了怎么办,怎么插入呢?

      专业上来说,hash值重复的情况,我们称之为哈希碰撞(又或者哈希冲突)。在HashMap中,是通过链表的形式来解决的,在hash值重复的数组角标下,通过链表将新插入的元素依次排列,当然如果插入的key相同,那么我们会将新插入的value覆盖掉原有的value;

    像上图所示,当产生了hash冲突后,会在产生冲突的角标下,生成链表,依次排列。

    HashMap继承于AbstractMap,实现了Map, Cloneable, Serializable接口。
    (1)HashMap继承AbstractMap,得到了Map接口中定义方法的实现,减少实现Map接口所需的工作;
    (2)HashMap实现Map,得到了Map接口定义的所有方法,其中一部分AbstractMap已实现;
    (3)HashMap实现Cloneable,得到了clone()方法,可以实现克隆功能;
    (4)HashMap实现Serializable,表示可以被序列化,通过序列化去传输,典型的应用就是hessian协议。

    它具有如下特点:

      • 允许存入null键,null值(null值只有一个,并存于数组第一个位置)

      • 无序集合,而且顺序会随着元素的添加而随时改变(添加顺序,迭代顺序不一致)

      • 随着元素的增加而动态扩容(与ArrayList原理一致)

      • 不存在重复元素(得益于hashCode算法和equals方法)

      • 线程不安全

    3 HashMap基本操作

     1  public static void main(String[] agrs){
     2     //创建HashMap集合:
     3     Map<String,String> map = new HashMap<String,String>();
     4     System.out.println("HashMap元素大小:"+map.size());
     5 
     6     //元素添加:
     7     map.put("hi","hello");
     8     map.put("my","hello");
     9     map.put("name","hello");
    10     map.put("is","hello");
    11     map.put("jiaboyan","hello");
    12 
    13     //遍历1:获取key的Set集合
    14     for(String key:map.keySet()){
    15         System.out.println("map的key是:"+key);
    16         System.out.println("map的value是:"+map.get(key));
    17     }
    18 
    19     //遍历2:得到Set集合迭代器
    20     Set<Map.Entry<String,String>> mapSet1 = map.entrySet();
    21     Iterator<Map.Entry<String,String>> iterator = mapSet1.iterator();
    22     while(iterator.hasNext()){
    23         Map.Entry<String,String> mapEntry = iterator.next();
    24         System.out.println("map的key是:" + mapEntry.getKey());
    25         System.out.println("map的value是:" + mapEntry.getValue());
    26     }
    27 
    28     //遍历3:转换成Set集合,增强for循环
    29     Set<Map.Entry<String,String>> mapSet2 = map.entrySet();
    30     for(Map.Entry<String,String> mapEntry : mapSet2){
    31         System.out.println("map的key是:" + mapEntry.getKey());
    32         System.out.println("map的value是:" + mapEntry.getValue());
    33     }
    34 
    35     //元素获取:通过key获取value
    36     String keyValue = map.get("jiaboyan");
    37     System.out.println("HashMap的key对应的value:" + keyValue);
    38 
    39     //元素替换:map没有提供直接set方法,而是使用新增来完成更新操作
    40     map.put("jiaboyan","helloworld");
    41     System.out.println("HashMap的key对应的value:" + map.get("jiaboyan"));
    42 
    43     //元素删除:
    44     String value = map.remove("jiaboyan");
    45     System.out.println("HashMap集合中被删除元素的value" + value);
    46     //清空所有元素:
    47     map.clear();
    48 
    49     //hashMap是否包含某个key:
    50     boolean isContain = map.containsKey("hello");
    51     //hashMap是否为空:
    52     boolean isEmpty = map.isEmpty();
    53 }
  • 相关阅读:
    VR虚拟现实眼镜那些事
    C#使用MysqlBackup.Net 备份MySQL数据库
    AgileConfig服务端搭建
    IE浏览器,各版本的请求头信息
    搜索算法
    一个完整的信号采集系统项目开发流程
    Linux内核模块简介
    搭建wordpress开发环境
    AbstractRoutingDataSource+AOP+JNDI实现spring动态数据源
    Linux 挂载磁盘记录
  • 原文地址:https://www.cnblogs.com/liushiqiang123/p/11053437.html
Copyright © 2011-2022 走看看