美文网首页
JJJJJava-Map

JJJJJava-Map

作者: 南在南方i | 来源:发表于2019-08-17 18:39 被阅读0次

Java中的map是一个很重要的集合,他是一个接口,下面继承它实现了多个实现类,这些类各有千秋,各自有个各自的优点和缺点

image

Map

map的主要特点是键值对的形式,一一对应,且一个key只对应1个value。其常用的map实现类主要有HashMap、HashTable、TreeMap、ConcurrentHashMap、LinkedHashMap、weakHashMap等等,在java中map是一个接口,是和collection接口同一等级的集合根接口

键值对

  • 键:就是你存的值的编号
  • 值:就是你要存放的数据

特点

  • 没有重复的 key(一方面,key用set保存,所以key必须是唯一,无序的;另一方面,map的取值基本上是通过key来获取value,如果有两个相同的key,计算机将不知道到底获取哪个对应值;这时候有可能会问,那为什么我编程时候可以用put()方法传入两个key值相同的键值对?那是因为源码中,传入key值相同的键值对,将作为覆盖处理)
  • 每个 key 只能对应一个 value, 多个 key 可以对应一个 value(这就是映射的概念,最经典的例子就是射箭,一排射手,一排箭靶,一个射手只能射中一个箭靶,而每个箭靶可能被不同射手射中。这里每个射手只有一根箭,不存在三箭齐发还都中靶这种骚操作。将射手和射中的靶子连线,这根线加射手加靶子就是一个映射)
  • key,value 都可以是任何引用类型(包括 null)的数据(只能是引用类型)

HashMap

HashMap是用哈希表(直接一点可以说数组加单链表)+红黑树实现的map类

image
上图便是HashMap的存储结构,HashMap的这种特殊存储结构在获取指定元素前需要把key经过哈希运算,得到目标元素在哈希表中的位置,然后再进行少量比较即可得到元素,这使得 HashMap 的查找效率极高。(说白了HashMap就是用了拉链法的哈希表,也有叫桶数组的)

特点

  • 底层实现是 链表数组,JDK 8 后又加了 红黑树
  • 实现了 Map 全部的方法
  • key 用 Set 存放,所以想做到 key 不允许重复,key 对应的类(一般是String)需要重写 hashCode 和 equals 方法
  • 允许空键和空值(但空键只有一个,且放在第一位)
  • 元素是无序的,而且顺序会不定时改变
  • 插入、获取的时间复杂度基本是 O(1)(前提是有适当的哈希函数,让元素分布在均匀的位置)
  • 遍历整个 Map 需要的时间与数组的长度成正比(因此初始化时 HashMap 的容量不宜太大)
  • 两个关键因子:初始容量、加载因子
//HashMap  集合  存储数据的特点:键key - 值value
        //key不能重复 可以是任意的对象类型 通常使用字符串String
        HashMap<String,Integer> score = new HashMap<>();

        //添加对象
        score.put("Chinese",89);
        score.put("Math",94);
        score.put("English",92);

        //更改某个键对应的值
        score.put("English",91);

        //获取键值对的个数
        score.size();

        //获取所有的key
        System.out.println(score.keySet());

        //获取所有的value
        System.out.println(score.values());

        //获取Entry:key-value
        System.out.println(score.entrySet());

        //获取一个键key对应的值
        System.out.println(score.get("English"));

遍历

  • 通过遍历key来得到每一个key对应的值
for (String key:score.keySet()){
            //通过key得到值
            int s = score.get(key);
            System.out.println("key:"+key+" value:"+s);
        }
  • 通过EntrySet 得到Entry对象的集合
 //  一个Entry管理一个键值对  getkey getvalue
        Set <Map.Entry<String,Integer>> entrys =  score.entrySet();
        for (Map.Entry<String,Integer> entry:entrys){
            //得到Entry对应的Key
            String key = (String)entry.getKey();

            //获取Entry对应的值
            Integer value = (Integer)entry.getValue();

            System.out.println("key:"+key+" value:"+value);
        }

相关文章

  • JJJJJava-Map

    Java中的map是一个很重要的集合,他是一个接口,下面继承它实现了多个实现类,这些类各有千秋,各自有个各自的优点...

网友评论

      本文标题:JJJJJava-Map

      本文链接:https://www.haomeiwen.com/subject/zrdksctx.html