首先对hash的了解:就是关键字,和数据建立关系的映射。

  hash常用算法:假设我们中的字符有相应的内部编码,当然在实际过程中,我们不可能将所有的编码当做hash值。

        平方取中法,将所得的内部编码平方,取7-9位作为hashcode.

        折叠法:将编码分割,然后相加。

        除留取余法

  即便是按照上面的计算,也有可能发生冲突。

1.HashMap 分析

  基于哈希表的Map接口的非同步实现,不保证顺序,允许键值为null,但是只能有一个,它实际相当于链表和数组的结合体。

  根据key计算数据在数组上面存储的位置,没有这个位置没有值,则放入值,如果有值,如果有key,进行数据的覆盖,如果不存在,那个这个值将以链表的方式存储,

  新加入的放在链表的头部。(java8新加入红黑树)如果不存在key值,那么判断是否为红黑树,如果是,红黑树直接插入,如果不是,遍历准备插入,如果大于8,

  转化为红黑树插入,否则,判断是否存在键,覆盖或者插入,最后,判断是否需要扩容。

  数据的读取,根据key的hashcode,找到对应位置的数据,这个位置可能是一个,也有可能是多个,如果是多个值,然后通过key值的equals 方法进行对比,

  找到元素。

2.Hashtable是线程安全的

  值不能为空,否则抛出异常,原理和上面相同,数据新增过程中如果table[index]元素不为空,则进行迭代,如果遇到相同的key,则直接替换,并返回旧value;

  否则,我们可以将其插入到table[index]位置

  上面两个,里面的数据,会保存同位置的下一个数据的对象。

3.LinkedHashMap 

  维护一个双向链表,保存上一个和下一个数据的对象。

  hashmap 的初始容量是16,乘以负载因子0.75,相当于是12个,在扩容过程中,需要重新计算hash值,计算位置,所以在创建的时候,我们尽量设置大小。

  在java8中,引入了红黑树,就是避免拉链过长,默认情况下,当链表长度超过8时,就会转化为红黑树进行。

4.TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。  

红黑树是二叉树的一种,每个节点要么是红的,要么是黑色的,根节点是红色的,红色节点的两个儿子一定是黑色的,

每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。 

5.在我们使用迭代的过程中,java中,使用了fail-fast机制,就是快速失败机制,也就是数据的安全性,就是多线程下,同时删除和新增,检测失败的一种机制,

 但是这种机制不是绝对不会失败,只是用于失败的检测,失败后,会抛出异常。 

  

HashMap Hashtable TreeMap LinkedHashMap 分析的更多相关文章

  1. Map总结--HashMap/HashTable/TreeMap/WeakHashMap使用场景分析(转)

    首先看下Map的框架图 1.Map概述 1.Map是键值对映射的抽象接口 2.AbstractMap实现了Map中绝大部分的函数接口,它减少了“Map实现类”的重复编码 3.SortedMap有序的“ ...

  2. 杨晓峰-Java核心技术-9 HashMap Hashtable TreeMap MD

    目录 第9讲 | 对比Hashtable.HashMap.TreeMap有什么不同? 典型回答 考点分析 知识扩展 Map 整体结构 有序 Map HashMap 源码分析 容量.负载因子和树化 精选 ...

  3. Collections+Iterator 接口 | Map+HashMap+HashTable+TreeMap |

    Collections+Iterator 接口 1. Collections 是一个操作 Set.List 和 Map 等集合的工具类 Collections 中提供了大量方法对集合元素进行排序.查询 ...

  4. Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)

    概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括:第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转 ...

  5. Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)

    概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括:第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转 ...

  6. HashMap,HashTable,TreeMap区别和用法

    开始学HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的.需要大家注意,在实际开发中以需求而定. java为数据结构中的映射定义了一 ...

  7. HashMap,Hashtable,TreeMap ,Map

    package com.wzy.list; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterato ...

  8. Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]

    ------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...

  9. hasSet,TreeSet,ArrayList,LinkedList,Vector,HashMap,HashTable,TreeMap利用Iterator进行输出

    基础类,没有重写hashCode()和equals()方法: package niukewang; import java.util.Objects; public class setClass { ...

随机推荐

  1. javascript之数组的6种去重方法

    去重 var arr=[11,11,333,4,4,5,66,66,7]; // 方法一:在新数组内判断不存在时加入 var newarr1=[]; function quchong1(){ for( ...

  2. "Activity" 总结

    1.什么是Activity? 1.四大组件之一 2.通常一个界面对应一个activity 3.是Context的子类 4.同时实现window.callback和keyevent.callback回调 ...

  3. DDK编写64位驱动时加入x64汇编的方法

    上篇讲了如何在编写x64应用程序时加入x64汇编,这里来说说如何在编写x64驱动时加入x64汇编. 一.在asm文件中单独编写功能函数 比如要实现一个64位的加法函数,原型如下: ULONG64 my ...

  4. pl/sql developer中如何导出oracle数据库结构? 参考文章一

    本文作者来自csdn的xieyuooo地址为 : http://bbs.csdn.net/topics/340209135 进入PL/SQL后,使用如下图所示的操作步骤: 然后会弹出一个窗口,在弹出窗 ...

  5. Unity里的人物驱动/换装备/换武器/换衣服/卡通重定位(转)

    Unity里的人物驱动/换装备/换武器/换衣服/动画重定位 刚学的过程被这个问题困扰最多. 首先,基本的,大家都知道驱动人物需要骨架.绑骨的Mesh和动画(这三个要是不知道的话就得考虑看看计算机图形学 ...

  6. 11.5NOIP模拟赛

    /* 唉,那个第二种策略应该是没用吧. 为什么我列出式子最优策略跟第二种策略有关??为什么我写了写分布列还是跟第二种策略有关??为什么数学还没学到期望的孩子们都A了? 唉.人生啊. 0.5h后 我好像 ...

  7. C++构造函数详解(复制构造函数 也是 拷贝构造函数)

    构造函数是干什么的 该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员. 构造函数的种类 1 class Com ...

  8. C++ 操作符重载 (operator)

    重载不能改变操作符的优先级 如果一个内建操作符是一元的,那么所有对它的重载仍是一元的.如果是二元的重载后也是二元的 下面看一个有代表性的例子:: 头文件Complex.h: #includeusing ...

  9. Hdu 5496 Beauty of Sequence (组合数)

    题目链接: Hdu 5496 Beauty of Sequence 题目描述: 一个整数序列,除去连续的相同数字(保留一个)后,序列的和成为完美序列和.问:一个整数序列的所有子序列的完美序列和? 解题 ...

  10. POJ1961(kmp中Next数组的性质)

    对于某个位置i,i - Next[i]是循环节长度,i整除(i - Next[i])时是完整的几个循环元. ; int n, kase, Next[maxn]; char ch[maxn]; inli ...