Hashmap

使用java语言进行系统开发时,使用得比较多得数据结构hashmap,它以[key,value],进行数据存储,通过key可以快速找到到对应的value值,但是key,value不能是java的基本类型 (int , float,double,long,short,byte) 必须是复合类型(String,Double...).并不是线程安全。

      存储数据格式:默认16个桶,每个桶对应一个hash值,以数组形式对16个桶依次存储;对所有的key进行hash后,然后 hash&(桶的数量-1)得到对应的桶数组位置,然后把该[key,value]存储到该桶里面;查询时间:通过key查询时,首先通过key,hash后,找到对应的桶O(1),如果该桶下面只有一条数据,或者没有,查询时间最快O(1),否则遍历桶下面链表数据,直到找到对应的key,或者遍历完该桶下面所有的链。删除,添加只需要移动链表的指针,不需要移动内存数据,
 
      当当前的数量超过阀值,需要重新申请一块内存(桶数组),是当前的内存(桶数组)的2倍,对已有的数据 也需要通过hash &(桶的数量-1)找到新桶的位置并存储。
 
Hashtable
    在hashmap的基础上,加了多线程并发控制,在hashmap的方法上加了synchronized关键字。
 
Hashset
   对hashmap进行了一层封装,由于该结构对外表现只存储key,默认value=new Object() ,对于hashmap 的key只会存在一份。
 
Linkhashmap
   由于hashmap中数据是存放在不同的桶里面的,对hashmap进行数据遍历时,就不一定是添加数据的顺序,linkhashmap在此基础中,对每条存储数据增加两个指针,after指向下一条数据,befort指向,每次新加一条数据,就改变指针的指向,对map进行遍历时,就遍历该双向链表,就可以保证顺序。
 
currenthashmap
   线程安全的hashmap,对hashmap进行了重写,hashmap使用数组链表来存储数据,currenthashmap在又在数组链表外又封装了一层,一个currenthashmap有多个分片,每个分片对应一个数组链表,对同一个分片的操作有多线程的并发控制,实际上就是,对每个分片的访问加了锁(可重入锁),和hashtable的并发控制相比,该结构对于多个线程访问不同的片段,不会互相等待,从而,降低了锁的粒度,提高了效率。
 
treemap
    以树的形式来存储数据,每个节点包含指向父节点指针,指向左节点的指针,指向右节点的指针,左节点小与右节点。以该形式存储,插入和删除,都可以快速找到对应的位置,效率比较高。
 
 
 
 
 

java JDK源码解析的更多相关文章

  1. 【转】Java HashMap 源码解析(好文章)

    ­ .fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...

  2. 设计模式-简单工厂Coding+jdk源码解析

    感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...

  3. Java——LinkedHashMap源码解析

    以下针对JDK 1.8版本中的LinkedHashMap进行分析. 对于HashMap的源码解析,可阅读Java--HashMap源码解析 概述   哈希表和链表基于Map接口的实现,其具有可预测的迭 ...

  4. Java集合类源码解析:Vector

    [学习笔记]转载 Java集合类源码解析:Vector   引言 之前的文章我们学习了一个集合类 ArrayList,今天讲它的一个兄弟 Vector.为什么说是它兄弟呢?因为从容器的构造来说,Vec ...

  5. Java集合类源码解析:ArrayList

    目录 前言 源码解析 基本成员变量 添加元素 查询元素 修改元素 删除元素 为什么用 "transient" 修饰数组变量 总结 前言 今天学习一个Java集合类使用最多的类 Ar ...

  6. Java集合类源码解析:AbstractMap

    目录 引言 源码解析 抽象函数entrySet() 两个集合视图 操作方法 两个子类 参考: 引言 今天学习一个Java集合的一个抽象类 AbstractMap ,AbstractMap 是Map接口 ...

  7. Java集合类源码解析:LinkedHashMap

    前言 今天继续学习关于Map家族的另一个类 LinkedHashMap .先说明一下,LinkedHashMap 是继承于 HashMap 的,所以本文只针对 LinkedHashMap 的特性学习, ...

  8. Java集合类源码解析:HashMap (基于JDK1.8)

    目录 前言 HashMap的数据结构 深入源码 两个参数 成员变量 四个构造方法 插入数据的方法:put() 哈希函数:hash() 动态扩容:resize() 节点树化.红黑树的拆分 节点树化 红黑 ...

  9. Java - TreeMap源码解析 + 红黑树

    Java提高篇(二七)-----TreeMap TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap ...

随机推荐

  1. [BZOJ1031] [JSOI2007] 字符加密Cipher (后缀数组)

    Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作 ...

  2. [BZOJ1036] [ZJOI2008] 树的统计Count (LCT)

    Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...

  3. mysql测试

    数据库效率测试: 1.创建索引: 数据量小(或者空表)的情况下创建索引: 有一定数据量情况下(100000条数据)创建索引: 在有一定数据量的情况下,数据库会为现有数据添加索引,此时,创建索引的工作量 ...

  4. 视频直播技术(七):Ijkplayer切换网络时停止播放的问题处理

    问题起因: 在进行ijkplayer播放器的测试时,发现ijkplayer播放器在切换网络时出现直播画面停止的问题. 问题分析: 抓取日志发现:tv.danmaku.ijk.media.player. ...

  5. Scala学习笔记(一)

    scala 版HelloWorrld object HelloWorld{ def main(args:Array[String]){ println("Hello World!!!&quo ...

  6. 怎么解决VMware“该虚拟机似乎正在使用中”问题

    问题如下:

  7. 设计模式——建造者模式/生成器模式(C++实现)

    #include <iostream> #include <string> using namespace std; class STProduct { public: voi ...

  8. Jmeter 相关资源

    官网:http://jmeter.apache.org/ 插件: https://jmeter-plugins.org

  9. java 获取文件内所有文件名

    package com.xinwen.user.controller; import java.io.File;import java.util.ArrayList;import java.util. ...

  10. 插入排序—直接插入排序(Straight Insertion Sort)

    基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插插入到已入,直至整个序列有序为止. 要点: ...