文档章节

5.Java基础复习----Map

baibuxiha
 baibuxiha
发布于 2016/01/24 14:28
字数 941
阅读 19
收藏 1
1.Map java.util.Map<K,V>  interface 实现Map接口的类用来存储键-值 对;

  可以存储null键

  Map类中存储的键 -- 值 对通过键来标识,所以键值不能重复

  public     int size();集合大小

  public     boolean isEmpty();集合是否没有键值对

  public     boolean containsKey(Object key);是否包含键key

  public     boolean containsValue(Object value);是否包含值value

  public     V        get(Object key) ;获取键key对应的值value

  public     V        put(K key,V value);往Map中放入键值对,返回先前key对应的值

  public     V        remove(Object key);移除键值对中键为key

  public     void    putAll(Map<? extends K,? extends V> m);放入一个Map m

  public     void    clear();清除所有键值对

  public     Set<K>  keySet();获取Map中所有的键key

  public     Collection<V> values();获取Map所有的值value

  public     Set<Map.Entry<K,V>> entrySet();返回Map中的键值对实体Map.Entry<K,V>

2.--HashMap    extends AbstractMap<K,V>  implements Map<K,V>, Cloneable, Serializable

  static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 ;默认初始化容量  必须是2的倍数

  static final float DEFAULT_LOAD_FACTOR = 0.75f;     默认初始化加载因子0.75

  Entry<K,V> 数组存储 K-V 

3.HashMap的工作原理

     内部使用Entry<K,V> 数组存储对象 默认数组大小为16

  HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。

       当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。

      

      

      

      HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的第一个节点中。 HashMap在每个链表节点中储存键值对对象。

 当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。


  当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

  出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。

为什么String, Interger这样的wrapper类适合作为键? 

  •        String, Interger这样的wrapper类作为HashMap的键是再适合不过了,而且String最为常用。因为String是不可变的,也是final的,而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。不可变性还有其他的优点如线程安全。如果你可以仅仅通过将某个field声明成final就能保证hashCode是不变的,那么请这么做吧。因为获取对象的时候要用到equals()和hashCode()方法,那么键对象正确的重写这两个方法是非常重要的。如果两个不相等的对象返回不同的hashcode的话,那么碰撞的几率就会小些,这样就能提高HashMap的性能。

我们可以使用自定义的对象作为键吗?
  • 只要它遵守了equals()和hashCode()方法的定义规则,并且当对象插入到Map中之后将不会再改变了。如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。

我们可以使用CocurrentHashMap来代替HashTable吗?
  • 我们知道HashTable是synchronized的,但是ConcurrentHashMap同步性能更好,因为它仅仅根据同步级别对map的一部分进行上锁。ConcurrentHashMap当然可以代替HashTable,但是HashTable提供更强的线程安全性。


© 著作权归作者所有

共有 人打赏支持
baibuxiha
粉丝 6
博文 67
码字总数 33393
作品 0
私信 提问
【重温基础】11.Map和Set对象

本文是 重温基础 系列文章的第十一篇。 今日感受:注意身体,生病花钱又难受。 系列目录: 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理) 【重温基础】1.语法和数据类型 【重温基础】2.流程...

王平安的前端世界
01/06
0
0
01-利用思维导图梳理JavaSE-Java语言基础

01利用思维导图梳理JavaSE基础知识之Java语言基础 主要内容 1.Java的命名规范 2.Java程序的注释 3.Java语言的符号 4.Java数据类型 5.Java表达式与语句 想了解飞鱼说编程的最新动态可以关注公...

飞鱼说编程
2018/09/11
0
0
PHP 源码阅读日记

最近比较闲,正好借这个时间看看PHP源码,有看到不懂的地方会记录一下,之后会把问题以及答案都写下来。 1.C语法生疏需要复习。(后面会写相关复习的内容) (1)struct 结构体 struct是一种数...

起什么name呢
2016/03/30
22
0
机器学习的数学基础--提纲篇

缘起 不用多说,入了机器学习这个坑,需要填补太多数学基础。 写这个题目,主要是为了总结和复习以前的数学知识。 这会是一系列文章,我会逐步把机器学习的数学基础知识分门别类一一写出,每...

徐朝_尼克徐
2017/11/19
0
0
2017年应试 | 通过软考(集成、项管)的三个关键要素

有同学咨询教程教辅、学习方法等相关的问题,我们把相关问题合并后在此一并答复。 1.我们在面授过程中强调的是“框架+内容”的学习方法,所谓框架,具体的产物是攻克要塞的知识图谱,通过知识...

liuyiok
2017/04/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【行为型】- 中介者模式

中介者模式: 调停者模式 定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,可独立地改变他们之间的交互。 角色 抽象中介者:定义好同...

ZeroneLove
18分钟前
0
0
Harbor快速部署到Kubernetes集群及登录问题解决

Harbor(https://goharbor.io)是一个功能强大的容器镜像管理和服务系统,用于提供专有容器镜像服务。随着云原生架构的广泛使用,原来由VMWare开发的Harbor也加入了云原生基金会(参考《Har...

openthings
38分钟前
1
0
MQ学习-基本概念区分

消息队列 Kafka 涉及的专有名词和术语进行定义和解释,方便您更好地理解相关概念并使用该产品。 Broker: 消息队列 Kafka 集群包含一个或多个消息处理服务器,该服务器被称为 Broker。 Topi...

os1cheng
52分钟前
3
0
腾讯怒怼:靠红包骗用户下载怎么可以叫产品

近日,社交圈出现了大动荡,三款新推出的社交软件全部被微信封杀,对此,腾讯公关总监在回应外界对于1月15日三款社交新产品撼动微信的消息,他呼吁媒体在批评的同时应当尊重事实,“我们尊重...

linux-tao
今天
3
0
面试必考-数据优化

sql语句优化 性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化。 为了获得稳定的执行性能,SQL语句越简单越好...

瑞查德-Jack
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部