Java之HashSet功能用法详解,存储机制和性能分析

HashSet的存储机制:

  • 底层用一个数组存放元素,而且数组的长度永远是2的n次方,如果传入数组的长度不是2的n次方,hashset会自动的将其扩展到2的n次方;
  • HashSet的构造器:
HashSet(int initialCapacity, float loadFactor)
//initialCapacity——控制底层数组长度
//loadFactor——当HashSet感觉到底层快要满的时候(0.75),会将底层数组容量扩充1倍,
//原来的数组就变成垃圾,等待回收,即rehash(重hash)
//说明:当LoadFactor为0.75时,75%的桶已满,HashSet会分配新的数组;LoadFactor越小,
//越消耗内存;LoadFactor越大,性能越低
//数组越满,才回去“重hash”,越有可能出现链表
  • HashSet的存入机制:
  1. 当有元素加进来的时候,HashSet会调用该对象的HashCode()方法,得到一个int值;
  2. 根据HashCode()返回的int值,计算出它在HashSet【底层数组】的存储位置(数组中的索引);
  3. 如果要加入的位置没有元素(是空的),直接放入即可;
  4. 如果要加入的位置已经有元素,此处就会形成“链表”
  • HashSet的取元素机制:
  1. 当我们要取一个元素时,HashSet会调用该对象的HashCode()方法,得到一个int值;
  2. 根据HashCode()返回的int值,计算出它在HashSet的存储位置(数组中的索引);
  3. 如果该位置恰好是要找的元素,直接取出即可;
  4. 如果该位置有链表,HashSet要“挨个”搜索链表里的元素

说明:在最理想的情况下,HashSet的性能几乎可以数组匹敌,存、取的性能非常高

  • HashSet认为两个对象相等的条件:
  1. 两个对象的HashCode()的返回值相等;
  2. 两个对象通过equals比较也返回True
发布了111 篇原创文章 · 获赞 57 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_38358499/article/details/100631653