原文网址:http://blog.csdn.net/aidesudi/article/details/4720201

Java代码
  1. public class TestHashSet {
  2. public static void main(String [] agrs){
  3. Set set = new HashSet();
  4. //添加一个string数据
  5. set.add("文本");
  6. //添加一个整数数据
  7. set.add(new Integer(5));
  8. //添加一个付点数据
  9. set.add(12.15);
  10. //输出集合大小
  11. System.out.println(set.size());
  12. //在添加个相同的文本
  13. set.add("文本");
  14. //输出大小
  15. System.out.println(set.size());
  16. //添加个null值
  17. set.add(null);
  18. //输出集合大小
  19. System.out.println(set.size());
  20. //再添加个null值
  21. set.add(null);
  22. //输出集合大小
  23. System.out.println(set.size());
  24. //判断是否存在null值
  25. System.out.println(set.contains(null));
  26. // 删除null值
  27. set.remove(null);
  28. //判断是否存在null值
  29. System.out.println(set.contains(null));
  30. //输出集合大小
  31. System.out.println(set.size());
  32. Set set1 = new HashSet();
  33. UserInfo user = new UserInfo("abc","123");
  34. UserInfo user1 = new UserInfo("abc","123");
  35. set1.add(user);
  36. System.out.println(set1.size());
  37. //判断是否存在user1这个对象
  38. System.out.println(set1.contains(user1));
  39. user.setName("xyz");
  40. user.setPassword("aaa");
  41. //在更改了user值后user1还存在吗?
  42. System.out.println(set1.contains(user1));
  43. }
  44. }
  45. public class UserInfo {
  46. private String name;
  47. private String password;
  48. private int HASHCODE= Integer.MIN_VALUE;
  49. public UserInfo(String name,String password){
  50. this.name = name;
  51. this.password = password;
  52. }
  53. public String getName() {
  54. return name;
  55. }
  56. public void setName(String name) {
  57. this.name = name;
  58. }
  59. public String getPassword() {
  60. return password;
  61. }
  62. public void setPassword(String password) {
  63. this.password = password;
  64. }
  65. public int hashCode() {
  66. if (HASHCODE == Integer.MIN_VALUE) {
  67. // 重新生成本类的hashCode
  68. HASHCODE = name.hashCode() + password.hashCode();
  69. }
  70. return HASHCODE;
  71. }
  72. //判断值是否相等
  73. public boolean equals(Object obj) {
  74. if(obj == null || !(obj  instanceof  UserInfo)){
  75. return false;
  76. }
  77. UserInfo user = (UserInfo)obj;
  78. return this.name == user.name && this.password ==  user.password;
  79. }
  80. }

从上面的简单添加,和输出结果我想大家已经知道了set的一些用法和特性了。

1.    HashSet允许null值。

2.       HashSet中值不能重复。

3.       Hashset在判断是否存在同一个对象的时候首先会判断对象的hashcode是否相等,然后在判断对象的equals()是否相等。当你向HashSet中存入重复元素时,他会按照正常的流程执行存入操作
底层的数据结构采用的是数组+链表的存储结构(明白这一点对于理解HashSet的原理非常重要),
也就是说数组中的每一个元素都是一个链表(对应java中的List的某一具体实现),
这样当有元素要存入HashSet中时,便会首先通过hashCode()方法得到该对象的一个哈希码,并利用该哈希码通过一些转换算法映射成数组的下标索引(当查找时也是如此,因此会非常的快),接下来便会判断该下标处是否为null若为null则会创建一个列表,此时将待插入的对象直接插入,若列表已经存在则利用equals()方法将带插入对象与列表中的元素逐个比较,相等则忽略,不存在相等元素则直接插入。
因此不同对象的hashCode()是可以相同的(最好是均匀的散列开,这样才能充分的提高访问及插入的速度),
根据equals()判定相等的对象所产生的hashCode()必须相等(根据其原理不难理解,否则的话便会有重复元素出现了)
保证一点  hashCode()与equals()必须能够唯一的确定一个对象。

转载于:https://www.cnblogs.com/wi100sh/p/4485508.html

【转】HashSet的用法相关推荐

  1. c++ hashset的用法_c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  2. c++ hashset的用法_C++中set的用法

    set的特性是,所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值.set不允许两个元素有相同的键值. ...

  3. [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet]

    [问题描述][数组中的重复数字][简单] 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道 ...

  4. [剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]

    [问题描述][第3题][无重复字符的最长字串] 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重 ...

  5. [剑指offer][JAVA][面试题56 - I][第260题][位运算][HashSet]

    [问题描述] [面试题56 - I] [数组中数字出现的次数] 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度 ...

  6. 面试官:HashSet是如何保证元素不重复的?

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 本文已收录<Java常见面试题>系列,开源地址:https: ...

  7. java用hashmap_Java集合之HashMap的用法

    Java集合之HashMap的用法 在学习中,出现了几次对HashMap的使用不熟练的情况,现将HashSet的用法总结如下. 1. 基本用法 HashMap map = new HashMap< ...

  8. Java中哈希集(HashSet)概念,实现以及操作

    Java中HashSet的用法 1. HashSet概念 2.Java文档中HashSet的实现 3.HashSet的构造函数 3.1 HashSet() 3.2 HashSet(int initia ...

  9. 全网最细 | 21张图带你领略集合的线程不安全

    来源 | 悟空聊架构(ID:PassJava666) 本篇主要内容如下: 本篇主要内容 本篇所有示例代码已更新到 我的Github 本篇文章已收纳到我的Java在线文档 集合,准备团战 一.线程不安全 ...

最新文章

  1. SharePoint使用BCS开发你第一个应用程序(三)
  2. b区计算机调剂学校,2021年b区研究生调剂院校有哪些
  3. OpenGL Tessellated Triangle镶嵌三角形的实例
  4. 动态壁纸安卓_安卓 高清 动态 壁纸
  5. linux修改mac ethtool,ethtool命令
  6. C# dataGridView控件实用属性及事件总结
  7. Log4j的使用说明
  8. Linux的shell编程(二)
  9. js 栈 html标签修复,js 打印错误堆栈
  10. 计算机图形学基础-第二章 VB.NET 绘图基础
  11. 环世界服务器显示不出来,环世界控制台代码 | 手游网游页游攻略大全
  12. 思科cisco模拟器路由器的基础配置
  13. android 仿小米便签,高仿小米便签
  14. 从0开始编写minecraft光影包(0)GLSL,坐标系,光影包结构介绍
  15. 强劲大小核结构 三星将推八核处理器
  16. pyqtgraph帮助手册
  17. flash火焰燃烧的文字效果
  18. 文心一言打开f12后进入空白页面
  19. 多线程编程模式之Single Threaded Execution 模式
  20. 旋转矩阵,矩阵,共轭矩阵

热门文章

  1. 把所有圆圈连接起来的游戏_【实用教案】赶紧收藏!幼儿园秋季户外游戏大全、好玩易操作!...
  2. latex附录中放python代码_在Latex中插入Python代码
  3. dubbo全局异常处理_详解Dubbo无法处理自定义异常及解决方案
  4. python格式化转换_(转)python 格式化输出及%用法
  5. python大作业爬虫_爬虫大作业
  6. Linux学习笔记-生成动态库(补充说明)
  7. Java笔记-2种发送接收表单的数据
  8. ajax视频播放,XMLHttpRequest加载视频并播放
  9. java excel 兼容问题_java--POI解析excel兼容性问题
  10. HashMap 源码