hash系列的集合:

HashSet、LinkedHashSet     采用hash算法决定元素在集合中的存储位置

HashMap、LinkedHashMap、Hashtable   采用hash算法决定key在集合中的存储位置

hash表中可以存储元素的位置,被称为bucket(桶)。

在通常情况下,一个bucket里只存储一个元素,此时性能最好,可根据hashCode直接定位元素所在的bucket,获得元素。

但hash表的状态是open的,在发生hash冲突时,一个bucket中会存储多个元素,这些hash冲突的元素以链表形式存储在一个bucket中:

此时hash表性能会下降,根据hash算法确定bucket位置后,还要遍历链表,找到指定的元素。

如果我们重写了自定义类的hashCode()、equals()则不会出现hash冲突的情况,一个bucket里只会存储一个元素。

hash系列的集合都有以下属性:

  • capacity     容量,hash表中bucket的数量
  • initial capacity     初始容量,创建hash表时bucket的数量
  • size    hash表中已装元素的bucket数量
  • load factor  负载因子,等于size/capacity,即已装元素的bucket数占总bucket数的比例。0表示空的hash表,0.5表示半满的hash表。
  • 负载极限  0~1之间的一个float,表示当前hash表的最大填满程度,即允许的load factor的最大值。

创建hash表时,此hash表的内存就确定了,根据hash算法确定的是元素在此hash表中的位置。

往hash表中添加元素时, 会先找到hash表中空的bucket,根据hash算法确定用哪个空的bucket来存储元素。

load factor较小时,添加元素时很容易找到空的bucket,hash冲突少(因为可用的空bucket很多),存储性能较高;已装元素的bucket少,很容易从中找到指定的元素,查找性能较高;但遍历集合(hash表)时,要过滤掉大量的空bucket,很花时间,所以遍历时比较慢。

当load factor达到设置的负载极限时,会发生rehashing(重哈希/再散列),hash表会自动成倍地增加容量(capacity),将原有的元素都移到新的hash表中(会重新分配存储位置),而此时原有的元素是极多的,这会增加很大的开销。

负载极限设置较高时,节省内存(空桶较少),但添加、查找元素效率较低,时间开销会增大;负载极限较低时,添加、查找元素效率较高,但会增加内存开销。默认为0.75,是时间、空间的折中,我们可根据需要自行设置。

如果我们一开始就知道要存储的元素个数,可以在创建hash表时就指定容量:元素总数/负载极限。这样避免了rehashing,节省了时间开销。且前中期hash表负载会很低,添加、查询效率极高。

hash系列集合都有的3个重载构造函数:

()      //无形参,使用默认的capacity、负载极限(0.75)

(int capacity)     //指定容量

(int capacity,float 负载极限)

hash系列集合的性能优化的更多相关文章

  1. 读书笔记系列之java性能优化权威指南 一 第一章

    主题:java性能优化权威指南 pdf 版本:英文版 Java Performance Tuning 忽略:(0~24页)Performance+Acknowledge 1.Strategies, A ...

  2. [转] 擎天哥as3教程系列第二回——性能优化

    所谓性能优化主要是让游戏loading和运行的时候不卡. 一  优化fla导出的swf的体积? 1,  在flash中,舞台上的元件最多,生成的swf越大,库里面有连接名的元件越多,swf越大.当舞台 ...

  3. 吊打面试官系列:Redis 性能优化的 13 条军规大全

    1.缩短键值对的存储长度 键值对的长度是和性能成反比的,比如我们来做一组写入数据的性能测试,执行结果如下: 从以上数据可以看出,在 key 不变的情况下,value 值越大操作效率越慢,因为 Redi ...

  4. mysql小白系列_09 mysql性能优化关键点

    一 服务器参数调优,有哪些关键点? 1. 应用访问优化 优化方法 性能提升效果 优化成本 说明 减少数据访问能不访问就不访问-减少磁盘IO 1~1000 低 缓存服务器缓存mysql数据,Redis. ...

  5. Mysql优化系列之查询性能优化前篇2

    接前一篇,这一篇主要总结下几个经常要用的命令 命令一:explain+sql mysql> explain select * from servers; +----+-------------+ ...

  6. Mysql优化系列之查询性能优化前篇1

    前言 这是优化系列的最后一篇的第1小篇,我们其实可以直接从sql怎么写讲起,why not?但是我还是决定花2个篇幅 问一些问题,带着几个问题循序渐进的往下走. 一个sql语句是怎么被执行的? sql ...

  7. Mysql优化系列之查询性能优化前篇3(必须知道的几个事实)

    事实一:临时表没有任何索引 最常见的临时表莫过于在from子句中写子查询,遇到这种情况,Mysql会先将其查询结果放到一张临时表中, 然后将这个临时表当做普通表对待 事实二:执行计划优化 大多数的sq ...

  8. 移动web性能优化笔记

    移动web性能优化 最近看了一些文章,对移动web性能优化方法,做一个简单笔记 笔记内容主要出自 移动H5前端性能优化指南和移动前端系列——移动页面性能优化

  9. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

随机推荐

  1. mysql数据库引擎InnoDB和MyISAM的区别

    InnoDB支持行级锁和表级锁(默认行级锁),支持事务,外部键等:大量的insert和update更快等.只有通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁. MyI ...

  2. POJ1077 Eight —— 反向BFS

    主页面:http://www.cnblogs.com/DOLFAMINGO/p/7538588.html 代码一:以数组充当队列,利用结构体中的pre追溯上一个状态在数组(队列)中的下标: #incl ...

  3. 织梦DEDE多选项筛选_联动筛选功能的实现_二次开发

    织梦默认的列表页没有筛选功能,但有时候我们做产品列表页的时候,产品的字段比较多,很多人都需要用到筛选功能,这样可以让用户更方便的找到自己所需要的东西,实现这个联动筛选功能需要对织梦进行二次开发,下面就 ...

  4. Swift(一)简单值

    Swift的源文件扩展名是.swift 按照国际惯例,学习一门新语言写的第一个程序都是在屏幕上输出一句 “Hello, world!” .在Swift里,一行代码就搞定了: 如果你以前写过C或者Obj ...

  5. html5--6-6 CSS选择器3

    html5--6-6 CSS选择器3 实例 学习要点 掌握常用的CSS选择器 了解不太常用的CSS选择器 什么是选择器 当我们定义一条样式时候,这条样式会作用于网页当中的某些元素,所谓选择器就是样式作 ...

  6. Kafka使用经验小结

    本文尽量从一个使用者的角度去记录一些在实战当中使用Kfaka所需要关注的要点,这样可能会贴切更多的读者,本文并不会介绍太多的Kafka的一些架构层次设计的知识,因为网上已经有一大堆的重复搬运的资料任由 ...

  7. BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心

    BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心 Description Bessie烘焙了一块巧克力蛋糕.这块蛋糕是由R*C(1 <= R,C ...

  8. 09:LGTB 学分块

    总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  65536kB 描述 LGTB 最近在学分块,但是他太菜了,分的块数量太多他就混乱了,所以只能分成 3 块 今天他得 ...

  9. .NETFramework:Cache

    ylbtech-.NETFramework:Cache 1.返回顶部 1. #region 程序集 System.Web, Version=4.0.0.0, Culture=neutral, Publ ...

  10. 查看mysql状态

    命令:mysqladmin -uroot -p -h172.16.0.20 status Uptime: 14317755  Threads: 61  Questions: 187732924  Sl ...