数据结构(一): 键值对 Map
Map基本介绍
Map 也称为:映射表/关联数组,基本思想就是键值对的关联,可以用键来查找值。
Java标准的类库包含了Map的几种基本的实现,包括:HashMap,TreeMap,LinkedHashMap,WeakHashMap,ConcurrentHashMap,IdentityHashmap。它们都有同样的基本接口Map,但是在效率、键值对的保存及呈现次序、对象的保存周期、映射表如何在多线程程序中工作和判定“键”等价的策略等方面。
Map最大的作用就是能够将对象映射到其他对象,基本的用法在这里就不做过多的说明了。需要说明的是,Map与数组和其他的Collection一样,可以很容易扩展到多维,我们只需要将其value值设置为Map(这些Map的value可以是其他容器,甚至是其他Map)。因此我们可以很容易的将容器组合起来,从而快速地生成强大的数据结构。
性能
性能是Map的一个重要指标,当在get()方法使用线性搜索的时候,执行速度会相当的慢。Map不同的实现方式,其性能表现也是不相同的。
其中HashMap能够提高搜索的执行速度,因为HashMap使用了特殊的值,称做散列码,来取代对键的缓慢搜索。散列码是“相对唯一”的、用以代表对象的int值,它通过将该对象的某些信息进行转换而生成的。hashCode()是根类Object中的方法,因此所有的Java对象都能产生散列码,HashMap就是使用对象的hashCode()进行快速查询的,此方法能够显著提高性能。
不同Map实现的对比
下面是基本的Map实现,如果没有其他的限制,应该默认使用HashMap,因为它对速度进行了优化。其他的强调了其他方面的特性,所有都不如HashMap快。
- HashMap :Map基于散列表的实现,插入和查询的开销是固定的。可以通过构造函数设置容量和内容的类型,以提高性能。
- LinkedHashMap:类似于HashMap,但是迭代遍历的时候,取得的“键值对”的顺序是其插入的次序,或者是最近最少使用(LRU)的次序,只比HashMap慢一点。而在迭代访问时反而更快,因为它使用链表维护内部次序。
- TreeMap:基于红黑树实现的。查看“键”或“键值对”时,它们会被排序。TreeMap的特点在于,所得到的结果是经过排序的。TreeMap是唯一带有subMap()方法的Map,它可以返回一个子树。
- WeakHashMap:弱键映射,允许释放映射所指向的对象。这是为了解决某类特殊问题而设计的。如果映射之外没有引用指向某个“键”,则此“键”可以被垃圾回收器回收。
- ConcurrentHashMap: 一种线程安全的Map,它不涉及同步加锁,
- IdentityHashMap:使用==代替equal()对“键”进行比较的散列映射。转为解决特殊问题而设计的。
数据结构(一): 键值对 Map的更多相关文章
- 《java JDK7 学习笔记》之键值对Map
一.常用的Map操作类 1.使用HashMap Map也支持泛型语法,泛型的Map实例: 建立Map操作对象时,可以使用泛型语法指定键与值的类型.上图键使用String,值也使用String类型.要建 ...
- [Swift]LeetCode677. 键值映射 | Map Sum Pairs
Implement a MapSum class with insert, and sum methods. For the method insert, you'll be given a pair ...
- mybatis oracle 插入自增记录 获取主键值 写回map参数
网上搜了好多文章照着弄都返回不了主键给map, 实践证明要在传入的map参数里写回插入的主键,要这样写 <selectKey resultType="java.lang.Integer ...
- 用字典给Model赋值并支持map键值替换
用字典给Model赋值并支持map键值替换 这个是昨天教程的升级版本,支持键值的map替换. 源码如下: NSObject+Properties.h 与 NSObject+Properties.m / ...
- JAVA中的数据结构——集合类(线性表:Vector、Stack、LinkedList、set接口;键值对:Hashtable、Map接口<HashMap类、TreeMap类>)
Java的集合可以分为两种,第一种是以数组为代表的线性表,基类是Collection:第二种是以Hashtable为代表的键值对. ... 线性表,基类是Collection: 数组类: person ...
- Java中Map根据键值(key)或者值(value)进行排序实现
我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Ke ...
- 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...
- map自定义键值类型
map自定义键值类型 改变Map的默认比较方式 https://www.cnblogs.com/zjfdlut/archive/2011/08/12/2135698.html 大家知道,STL中的ma ...
- map集合键值对存储,键值不重复,值可以重复
import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Li ...
随机推荐
- css:元素水平垂直居中的多种方式
CSS元素(文本.图片)水平垂直居中方法 1.text-align:center; 2.margin:0 auto; 3.display:inline-block; + text-align:ce ...
- 绑定checkedComboBox
using System; namespace CommonLib{ /// <summary> /// CommonCode 的摘要说明. /// </summary> [S ...
- Numpy三维数组的转置与交换轴
二维数组的转置应该都知道,就是行列交换 而在numpy中也可以对三维数组进行转置,np.T 默认进行的操作是将0轴与2轴交换 本文主要对三位数组轴交换的理解上发表本人的看法. a = np.array ...
- Linux redhat 7 进入单用户模式
redhat 7 进入单用户模式修复系统故障 1.启动机器,grub界面选择第一个,按e 2.往下翻,找到Linux16 开头的那一行 3.将ro改为"rw init=/sysroot/b ...
- mysql学习笔记--表操作
一.显示所有表 1. 语法:show tables; 二.创建表 1. 语法:create table [if not exists] 表名( 字段名 数据类型 [null | not null] ...
- 封装的mybatis连接类
package com.kevin.utils;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSe ...
- 【计算机网络】TCP的流量控制和拥塞控制
TCP的流量控制 1. 利用滑动窗口实现流量控制 如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失.所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收. 利用滑动 ...
- VUE项目小试牛刀
首先安装webstorm:http://www.jetbrains.com/webstorm/ (推荐) 再安装node.js:https://nodejs.org/en/download/ (必 ...
- 交叉编译sudo
编译Sudo version 1.8.6p7下载路径:https://www.sudo.ws/news.html 1.交叉编译 # tar -xvf sudo-1.8.6p7.tar.gz # cd ...
- 关于前端设置cookie
cookie既可以后端设置也可以在前端设置,例如登陆/注册功能,每次都要向服务器请求用户数据,这种就可以把cookie放到前端储存起来. 当网页要发http请求时,浏览器会先检查是否有相应的cooki ...