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. 【Spring源码分析】非懒加载的单例Bean初始化过程(上篇)

    代码入口 上文[Spring源码分析]Bean加载流程概览,比较详细地分析了Spring上下文加载的代码入口,并且在AbstractApplicationContext的refresh方法中,点出了f ...

  2. CentOS 静态IP分配,提示Error, some other host already uses address解决办法

    (一)第一 修改 ifup-eth vi /etc/sysconfig/network-scripts/ifup-eth #if ! /sbin/arping -q -c 2 -w 3 -D -I $ ...

  3. mount挂接命令使用

    挂接 操作系统 1.-t vfstype 指定文件系统的类型,通常不必指定.mount 会自动选择正确的类型.常用类型有: 光盘或光盘镜像:iso9660 DOS fat16文件系统:msdos Wi ...

  4. javascript从数组中删除一个元素

    Array.prototype.remove = function(val) { var index = this.indexOf(val); if (index > -1) { this.sp ...

  5. Oracle用户、授权、角色管理

    创建和删除用户是Oracle用户管理中的常见操作,但这其中隐含了Oracle数据库系统的系统权限与对象权限方面的知识.掌握还Oracle用户的授权操作和原理,可以有效提升我们的工作效率. Oracle ...

  6. Golang的CSP很酷?其实.NET也可以轻松完成

    说起Golang(后面统称为Go),就想到他的高并发特性,在深入一些就是 Goroutine.在大家被它优雅的语法和简洁的代码实现的高并发程序所折服时,其实C#/.NET也可以很容易的做到.今天我们来 ...

  7. WordPress用键盘左右方向键来查看上一篇和下一篇文章

    通过键盘来查看上下篇文章是不是很方便,这个其实就是条用键盘所对应的ASCII码来实现的,比如左右方向键所对应的ASCII码就是37和39,下面来看看实现怎么实现这个功能: 1.加载jQury库,当然很 ...

  8. WordPress怎么给分类目录排序

    WordPress默认的分类目录是按照字母的顺序排序的, 我们可以安装一款插件Category Order就可以自定义分类目录的顺序了,这款插件很小,安装后即可在后台的左侧菜单中看见Category ...

  9. java 多线程(总结)

    今天看了几篇关于java多线程问题的文章,将他们的部分内容引过来总结下,也算是对java多线程这类问题的整理. 在多线程中,必须明白两个问题,一是多线程实现,二是代码同步. 在java中要想实现多线程 ...

  10. Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级

    1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...