java HashMap相关
来源:互联网 发布:linux有几个版本 编辑:程序博客网 时间:2024/06/05 04:13
java中HashMap是使用最多的数据结构之一,也是面试java基础必问的问题之一。它有以下特性:
(1) 一般情况下查找的时间为O(1),特殊情况下为O(n) (jdk7)
(2) 存储键值对(键是唯一的)
(3) 不支持并发
一、数据结构
为了实现特性(1),HashMap使用了由数组和链表组成的hash表,这样在查找的时候根据key的hashCode值找到对应的桶(数组所在的下标),然后遍历桶找到对应的元素(key的equals())
当HashMap中的元素到达一定数量时,为了满足条件(1),需要进行扩容。为了明确扩容的条件,引入了装载因子(loadFactor),当size > capacity * loadFactor时进行扩容(resize)。但这解决不了HashMap最坏情况下查找变为O(n),当元素key的hashCode都相同,插入的数据就都在同一个桶里面,此时HashMap退化为LinkList,在自定义对象的时候应该注意hashCode的定义。
二、循环链表
HashMap中的元素个数大于规定的阈值时,就会进行扩容,重新hash,并分配到相应的桶
Entry<K,V> next = e.next; int i = indexFor(e.hash, newCapacity); e.next = newTable[i]; newTable[i] = e; e = next;
在单线程情况下重新resize分配的过程如下:
在多线程情况下,resize过程容易出现环,下面就上图例子说明多线程情况下环形成的过程。
场景:两个线程同执行HashMap扩容操作
条件:当Thread1线程执行到上面代码片的第一行,cpu被另Thread2线程占用且执行完扩容操作,此时Thread1看到的HashMap数据结构为下图所示,接着Thread1继续执行扩容操作
结果:Thread1执行完毕,形成了如下图所示的环
0 0
- Java集合-HashMap相关
- java HashMap相关
- java集合相关之HashMap
- java中HashMap结构以及内存相关
- Java基础-hashMap的相关问题
- Java基础-hashMap的相关问题
- 关于Java中HashMap相关总结
- Java集合-HashMap的相关思考
- Java基础之hashMap相关知识
- Hashmap相关
- hashmap相关
- HashTable和HashMap的区别 -- JAVA 后台相关
- 回首Java——深入理解HashMap相关
- HashMap相关推荐
- hashtable HashMap相关问题
- HashMap相关面试知识点
- HashMap相关学习
- HashMap相关细节
- 谈运营之提高玩家活跃度的新技巧
- matlab练习程序(PSNR)
- 笔记:css命名相关规范
- 第一行代码学习2(4)
- 枚举和结构体
- java HashMap相关
- Android View和ViewGroup事件分发机制源码分析
- Linux 下Mongodb的安装
- 《Map中HashMap与TreeMap的排序以及四种遍历方式》
- Android_ListView_有Header或Footer时onItemClick里的position的问题
- 浅谈MyBatis 之 集成SpringMVC(六)
- webpack 配置项选项详解
- html5 and css
- LDA主题模型和Gibbs Sampling 学习整理