Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。

Map是一个接口,实例化Map可以采用下面的方式:

  • HashMap //Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。
  • hashMap的数据结构是由:数组+链表+红黑树的形式存储的如下图

  初始数组大小为16,增长因子为0.75,当数量大于n*0.75时,n*2

  如果put(k,v);

  1.先用key计算出hash值,在源码中使用(n-1)&hash(其相当于hash%n),前者效率更高,将node节点放入相应的数组位置

  2.如果hashcode()相同,则使用链表存储

    • 当链表长度大于8时,则将链表转为红黑树存储
    • 当使用remove后,如果链表长度小于6,则将红黑树转换为链表

  3.当数量达到n*0.75时,将数组进行扩容,及n=n*2;扩容则是新建一个为原来数组大小的两倍的数组,其中原来的的节点放在原位置或者原位置+16.

  • LinkedHashMap  //类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
  • TreeMap //底层是二叉树数据结构,线程不同步,可用于给Map集合中的键进行排序。
  • HashTable //HashMap是Hashtable的轻量级实现,非线程安全的实现他们都实现了map接口,主要区别是HashMap键值可以为空null,效率可以高于Hashtable。
  • ConcurrentHashMap //ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如Hashtable和Collections.synchronizedMap。
  • WeakHashMap //弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。
  • IdentifyHashMap //使用==代替equals()对“键”作比较的hash map
  • ArrayMap //ArrayMap是一个<key,value>映射的数据结构,它设计上更多的是考虑内存的优化,内部是使用两个数组进行数据存储,一个数组记录key的hash值,另外一个数组记录Value值,它和SparseArray一样,也会对key使用二分法进行从小到大排序,在添加、删除、查找数据的时候都是先使用二分查找法得到相应的index,然后通过index来进行添加、查找、删除等操作,所以,应用场景和SparseArray的一样,如果在数据量比较大的情况下,那么它的性能将退化至少50%。
  • SparseArray //SparseArray比HashMap更省内存,在某些条件下性能更好,主要是因为它避免了对key的自动装箱(int转为Integer类型),它内部则是通过两个数组来进行数据存储的,一个存储key,另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据,从而节约内存空间。

Map的基本操作:

  • Object put(Object key, Object value): 向集合中加入元素
  • Object remove(Object key): 删除与KEY相关的元素
  • void putAll(Map t):  将来自特定映像的所有元素添加给该映像
  • void clear():从映像中删除所有映射
  • 删除:集合名.remove(键);  从映射中移除指定键的映射关系(如果存在)

    判断:集合名.containsKey(键);  如果此映射包含对于指定键的映射关系,返回true

      集合名.containsValue(值);如果此映射将一个或多个键映射到指定值,返回true

    其它:集合名.size();  获得集合的大小

Map使用

这里以最常用的HashMap为例

添加数据

  1. Map<Integer, String> hashMap = new HashMap<>();
  2. for (int i = 0; i < maxCount; i++) {
  3. hashMap.put(i, String.valueOf(i));
  4. }

遍历entrySet方式

  1. //用entry遍历
  2. for (Map.Entry<String, String> entry: hashmap.entrySet()) {
  3. String key = entry.getKey();
  4. String value = entry.getValue();
  5. System.out.println(key+"-"+value);
  6.  
  7. }
  8.  
  9. //用Iterator遍历
  10.  
  11. Iterator<Entry<String, String>> iterator = hashmap.entrySet().iterator();
  12. while(iterator.hasNext()){
  13. Entry<String, String> entry = iterator.next();
  14. String key = entry.getKey();
  15. String value = entry.getValue();
  16. System.out.println(key+"+"+value);
  17.  
  18. }

1、Map没有实现的超级父类接口,不是Collection的直接接口子类

2、了解HashMap类

A):定义的格式:HashMap<类型,类型>集合名 = new HashMap<类型,类型>();

B):数据的存储方法:key+value的存储方式

C):对象的类型:必须要定义集合对象类型,否则会影响后续的使用

D)集合的设计:泛型的方式进行类型的指定:HashMap<具体类型>

特点:一条数据,是由两部分组成:键和值,元素无序、不可重复,可变大小的容器

遍历:需要使用键的迭代器   Set<类型>名称1 =集合名.keySet();

Iterator<类型>名称 =名称1.iterator();

三大集合框架之map的更多相关文章

  1. Java集合框架之map

    Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...

  2. 第19章 集合框架(3)-Map接口

    第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...

  3. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

  4. 【JAVA集合框架之Map】

    一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

  5. 十七、Java基础---------集合框架之Map

    前两篇文章中介绍了Collection框架,今天来介绍一下Map集合,并用综合事例来演示. Map<K,V> Map<K,V>:Map存储的是键值对形式的元素,它的每一个元素, ...

  6. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  7. [黑马程序员] 集合框架2——Map系 & 集合工具类(Collections、Arrays)

    ---------------------- ASP.Net+Android+IO开发..Net培训.期待与您交流! ---------------------- 0. 集合框架按其所实现的接口, 大 ...

  8. Java三大集合框架

    定义:java中集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象 一.List集合 1.List实现的超级父类接口:Collection 2.了解ArrayList类 A):定义的格 ...

  9. 集合框架以及Map(一)

    集合又称容器,编程思想中对其的定义为持有对象 我们在使用集合或者数组时得到最多的异常就是数组下表越界异常 Java.lang.ArrayIndexOutOfBoundsException这篇文章我们不 ...

随机推荐

  1. QQ在线状态的使用

    在网页中显示QQ在线状态并点击后发起对话,是很多门户网站常见的一个功能,这两天就碰到这样一个.原以为很简单,结果还是折腾了半天,虽然是个小问题,但也值得记录一下. 按以前的经验,网上有很多QQ在线代码 ...

  2. LeetCode231.2的幂

    231.2的幂 描述 给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 示例 示例 1: 输入: 1 输出: true 解释: 2^0 = 1 示例 2: 输入: 16 输出: true 解释 ...

  3. [原创]c# 类中 Collection 字段初始化的特殊之处

    1.今天看一下StackExchange.Redis的源代码,里面有这样一段代码 public sealed class ConfigurationOptions : ICloneable { ... ...

  4. 【研究】Joomla二阶注入

    受影响Joomla版本:3.7.0 到 3.8.3 1.下载安装Joomla3.8.3,登录后台管理系统:http://127.0.0.1/joomla/administrator/index.php ...

  5. Ionic3,安装,创建项目(一)

    Ionic3 简介:是一款html5的轻量级手机开发框架,基于angularjs.scss语法,ionic是一个轻量的手机UI库.并直接放弃了IOS 6和Android 4.1一下的版本支持. 安装: ...

  6. VMware虚拟网卡设置问题

    具体操作过程如下: (1)为虚拟机添加虚拟网卡 (2)添加后会自动分配子网ip,不用修改.点击应用,确定. (3)添加完成后本机的网络上会多出一个网络适配器,根据虚拟机器中的ip设置此ip地址, 这里 ...

  7. ife task0003学习笔记(四):JavaScript构造函数

    JavaScript创建对象主要是3种方法:工厂模式.构造函数模式.原型模式.其实对于构造函数的概念,我们并不陌生.在之前学习c++语言的时候,也有提到过构造函数的概念.除了创建对象,构造函数(con ...

  8. pat02-线性结构1. Reversing Linked List (25)

    02-线性结构1. Reversing Linked List (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, ...

  9. Linux下Makefile的automake生成全攻略--转

    http://www.yesky.com/120/1865620.shtml 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下 ...

  10. Linux文本处理工具

    Linux文本处理工具 Linux中熟练的使用文本处理工具非常的重要, 因为Linux在设计的时候是采用一切皆文件的哲学的, 甚至连计算机中的配置也都使用伪文件系统来表示, 要查询里面的内容就是对文件 ...