【前面的话】

早上起来好瞌睡哈,最近要注意一样作息状态。

      HashMap好好学习一下。

【定义】

  1. Hashmap是一个散列表,它存储的内容是键值对(key——value)映射。允许null值和null键。
  2. java.lang.Cloneable 接口是一个空接口,该接口用来指明一个对象是否可以进行克隆.实现了该接口的对象可以调用clone()方法来进行对象的浅克隆.  java默认的克隆是浅克隆,浅克隆仅仅克隆所考虑的对象,而不克隆它所引用的对象.
  3. Serializable序列化接口,表明这个类可以进行序列化。
  4. Java HashMap的代码:

HashMap继承了AbstracMap类,实现了Map接口和Cloneable接口,以及Serializable接口。

1)  HashMap:

 public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable

2)  AbstractMap

 public abstract class AbstractMap<K,V> implements Map<K,V> 

3)  Map

 public interface Map<K,V>

4)  Cloneable

 public interface Cloneable { //空接口
}

5)  Serializable

 public interface Serializable {//空接口
}

【知识点】

一、HashMap的数据结构

java中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本的结构来构造的,hashMap也不例外。Hashmap实际上是一个“链接散列”的数据结构,也就是数组和链表的结合体。

从下图可以看出,HashMap底层是一个数组结构,数组中的每一项又是一个链表,当新建一个HashMap的时候,就会初始化一个数组。

如下:

源代码如下:

 static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
int hash;
•••
}

可以看出,这就是java泛型的一个使用。就是一个key-value对,并且拥有指向下一个Entry的next,这就构成了一个链表。并且是一个单项链表。

二、HashMap的构造函数

 public HashMap(int initialCapacity, float loadFactor) 

指定容器大小和加载因子的构造函数

 public HashMap(int initialCapacity)

指定容器大小的构造函数,加载因子默认为0.75

 public HashMap() 

默认构造函数,构造一个默认初始容量为16,默认加载因子为0.75的空HashMap

 public HashMap(Map<? extends K, ? extends V> m) 

构造一个映射关系与指定Map相同的新的HashMap

三、HashMapAPI

类型

函数和功能

void

clear()

从此映射中移除所有映射关系。

Object

clone()

返回此 HashMap 实例的浅表副本:并不复制键和值本身。

boolean

containsKey(Object key)

如果此映射包含对于指定键的映射关系,则返回 true

boolean

containsValue(Object value)

如果此映射将一个或多个键映射到指定值,则返回 true

Set<Map.Entry<K,V>>

entrySet()

返回此映射所包含的映射关系的 Set 视图。

V

get(Object key)

返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null

boolean

isEmpty()

如果此映射不包含键-值映射关系,则返回   true

Set<K>

keySet()

返回此映射中所包含的键的 Set 视图。

V

put(K key, V value)

在此映射中关联指定值与指定键。

void

putAll(Map<? extends K,? extends V> m)

将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系。

V

remove(Object key)

从此映射中移除指定键的映射关系(如果存在)。

int

size()

返回此映射中的键-值映射关系数。

Collection<V>

values()

返回此映射所包含的值的 Collection 视图。

四、HashMap 的实例有两个参数影响其性能:初始容量加载因子

1. 容量是哈希表中数组的长度。初始容量只是哈希表在创建时的长度默认为16

 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

2. 加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。默认加载因子是 0.75,

  static final float DEFAULT_LOAD_FACTOR = 0.75f;

五、HashMapresizerehash

  1. 为什么会有初始容量和加载因子的设置,原因就是:当HashMap中的元素越来越多的时候,Hash冲突的几率也就会越来越高,也为数组的长度是默认固定的,为16。为了提高查询效率就需要对Hashmap的数组进行扩容,对hashmap进行扩容以后,最消耗性能的地方也就出现了,原数组中的数据必须进行重新计算放到新数组中去。这就是resize。
  2. 默认加载因子是 0.75, 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。

六、Hashmap的实现不是同步的,这意味着它不是线程安全的。它的key,value都可以为null。此外,HashMap中的映射不是有序的。

  1. HashMap不是线程安全的意思是多个线程操作的时候,结果可能不可预料,在操作系统中我们学习过,线程的安全状态是绝对安全的,不安全状态是可能会出现不安全的现象,如死锁,但有可能不会出现。
  2. HashMao的映射不是有序的,如下拉链法的例子:

在有拉链法建立散列表的时候,最终建立的散列表和最初的关键字码中的顺序是不一样的。

关键字码为:{06,12,15,26,36,38,41,44,51,68},散列函数为H(key)=key%13。用拉链法处理冲突建立的表如下:

【参考资料】

1. 深入Java集合学习系列:HashMap的实现原理

2. Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例 (推荐这篇文章)

http://www.cnblogs.com/skywang12345/p/3310835.html

3. HashMap的工作原理

http://www.importnew.com/7099.html

【后面的话】

好好学习。

——TT

Java学习笔记(二二)——Java HashMap的更多相关文章

  1. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  2. Java学习笔记心得——初识Java

    初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开 ...

  3. 2019暑假Java学习笔记(二)

    目录 基础语法(下) 流程控制 if语句 switch语句 while语句和do-while语句 for语句 break关键字 continue关键字 数组 一维数组 二维数组 用户输入操作 练习题: ...

  4. Java学习笔记(二)——变量与常量

    一.java中的关键字 Java 语言中有一些具有特殊用途的词被称为关键字.关键字对 Java 的编译器有着特殊的意义,在程序中应用时一定要慎重哦!! 二.认识Java标识符 1.定义 标识符就是用于 ...

  5. Java学习笔记(二)——Java操作properties文件

    [前面的话] 前段时间在学习和玩java web相关的东西,对于这些技术,一边学习,一边做东西,一边总结,希望可以一边成长和有所收获.有时总是思考太多反而成为了前进的阻力,所以对于生活还是简单一些,不 ...

  6. 【Java学习笔记之二十八】深入了解Java8新特性

    前言: Java8 已经发布很久了,很多报道表明java8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java 8 ...

  7. JAVA学习笔记(二):eclipse智能提示(转)

    存盘 Ctrl+s(肯定知道)注释代码 Ctrl+/取消注释 Ctrl+\(Eclipse3已经都合并到Ctrl+/了)代码辅助 Alt+/快速修复 Ctrl+1代码格式化 Ctrl+Shift+f整 ...

  8. Java学习笔记(二)不定时更新

    Java语言画图 package cn.witksy.dev; import javax.imageio.ImageIO; import java.awt.*; import java.awt.ima ...

  9. java学习笔记(二)图形用户接口

    这个学期主要放在ACM比赛上去了,比赛结束了.不知不觉就15周了,这周就要java考试了,复习一下java吧.java的学习的目的还是让我们学以致用,让我们可以运用java开发一下小项目.而不是单单应 ...

  10. 零基础学Java之Java学习笔记(二):Java快速入门

    提出要求: 开发一个 HelloWorld.java 程序,可以输出 "Hello,world!" 开发步骤: (1)将 Java 代码编写到扩展名为 HelloWorld.jav ...

随机推荐

  1. What Need To Do when A Node down!

    就以pdsp node3 down了为例,如下 ==========================START===================================== The Who ...

  2. 【故障处理】一次RAC故障处理过程

    [故障处理]一次RAC故障处理过程 1.1  故障环境介绍 项目 source db db 类型 2节点RAC db version 11.2.0.1.0 db 存储 ASM OS版本及kernel版 ...

  3. android动态注册监听网络变化异常

    在使用广播接收器监听网络变化的时候,在AndroidManifest.xml中加入<user-permission android:name="android.permission.A ...

  4. SQL Server调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行)

    前言 上一篇我们分析了查询Hint的用法,作为调优系列的最后一个玩转模块的第一篇.有兴趣的可以点击查看:SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行) 本篇继续玩转模块 ...

  5. 数据分页处理系列之一:Oracle表数据分页检索SQL

      关于Oracle数据分页检索SQL语法,网络上比比皆是,花样繁多,本篇也是笔者本人在网络上搜寻的比较有代表性的语法,绝非本人原创,贴在这里,纯粹是为了让"数据分页专题系列"看起 ...

  6. 【转】input输入框中光标高度的变化问题

    原文地址:http://blog.csdn.net/luochao_tj/article/details/17755457 input[type='text']文本框光标高度在有输入内容和为空时发生很 ...

  7. 烂泥:使用nginx利用虚拟主机搭建WordPress博客

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近开始打算学习nginx web服务器,既然是学习还是以实用为目的的.我们在此以搭建WordPress博客为例. 搭建WordPress博客,我们需要 ...

  8. vim IDE平台-打造属于自己的配置

    vim IDE平台-打造属于自己的配置 一.前言 目前工作环境基本以Linux为主,自然用到VIM也很多,很早就对如何提高VIM的使用效率有所研究,限于时间关系,也没做个系统记录和资料积累,时间久了又 ...

  9. linux chmod命令和chown命令

    一.chmod及文件权限 1.了解文件权限 root账户新建一个目录permission,在该目录新建一个文件file,通过ll就可以查看其权限. root@development:~# cd per ...

  10. Hacker communities collection

    Copy from E安全 Hack Forums: Hack Forums是目前最为理想的黑客技术学习根据地.该论坛不仅在设计上面向黑客群体,同时也适用于开发人员.博主.游戏开发者.程序员.图形设计 ...