hashset底层的数据结构是hash表,hash表实现方式采用数组+链表,数组类型为HashNode,每个数组元素为链表的头指针,链表中存储经过hash函数散列后冲突的元素,数组的长度为26

hashset存储的元素类型为字符串,取每个字符串的首字符的ascall码作为hash函数的输入,数组的长度为10,散列函数h(x)=x%10。

HashNode代码如下:

[java] view plaincopy
  1. public class HashNode {
  2. private String msg;
  3. private HashNode next;
  4. public String getMsg() {
  5. return msg;
  6. }
  7. public void setMsg(String msg) {
  8. this.msg = msg;
  9. }
  10. public HashNode getNext() {
  11. return next;
  12. }
  13. public void setNext(HashNode next) {
  14. this.next = next;
  15. }
  16. public HashNode(String msg, HashNode next) {
  17. this.msg = msg;
  18. this.next = next;
  19. }
  20. public HashNode() {
  21. }
  22. }

hashset实现如下:

[java] view plaincopy
  1. public class MyHashSet {
  2. private HashNode[] nodes = new HashNode[10];
  3. private int size = 0;
  4. public MyHashSet() {
  5. for (int i = 0; i < nodes.length; i++) {
  6. nodes[i] = new HashNode();
  7. }
  8. }
  9. public boolean add(String value) {
  10. if (contains(value)) { // 如果有这个元素,就不插入
  11. return false;
  12. }
  13. HashNode node = new HashNode(value, null);
  14. int index = (int) value.charAt(0) % nodes.length; // 取第一个字符作为hash函数的输入
  15. // 如果该链为空,直接插入,否则采用头插法
  16. if (nodes[index].getNext() == null) {
  17. nodes[index].setNext(node);
  18. } else {
  19. node.setNext(nodes[index].getNext());
  20. nodes[index].setNext(node);
  21. }
  22. size++;
  23. return true;
  24. }
  25. public boolean remove(String value) {
  26. if (!contains(value)) {
  27. return false;
  28. }
  29. int index = (int) value.charAt(0) % nodes.length;
  30. HashNode node = nodes[index];
  31. HashNode node2 = node.getNext();
  32. while (node2 != null) {
  33. if (node2.getMsg().equals(value)) {
  34. node.setNext(node2.getNext());
  35. size--;
  36. break;
  37. }
  38. node = node.getNext();
  39. node2 = node.getNext();
  40. }
  41. return true;
  42. }
  43. public void display() {
  44. for (int i = 0; i < nodes.length; i++) {
  45. HashNode node = nodes[i].getNext();
  46. System.out.print(i + " :");
  47. while (node != null) {
  48. System.out.print(node.getMsg() + "  ");
  49. node = node.getNext();
  50. }
  51. System.out.println();
  52. }
  53. }
  54. public int size() {
  55. return size;
  56. }
  57. public boolean contains(String value) {
  58. int index = (int) value.charAt(0) % nodes.length;
  59. HashNode node = nodes[index].getNext();
  60. while (node != null) {
  61. if (node.getMsg().equals(value)) {
  62. return true;
  63. }
  64. node = node.getNext();
  65. }
  66. return false;
  67. }
  68. }

测试代码:

[java] view plaincopy
  1. public class TestMyHashSet {
  2. public static void main(String[] args) {
  3. MyHashSet myHashSet = new MyHashSet();
  4. myHashSet.add("hello");
  5. myHashSet.add("hey");
  6. myHashSet.add("apply");
  7. myHashSet.add("你好");
  8. myHashSet.add("你是谁");
  9. myHashSet.add("cat");
  10. myHashSet.add("dog");
  11. myHashSet.add("cat");
  12. myHashSet.add("你好");
  13. System.out.println("包含'你好'? " + myHashSet.contains("你好"));
  14. System.out.println("元素个数: " + myHashSet.size());
  15. myHashSet.display();
  16. myHashSet.remove("hello");
  17. System.out
  18. .println("*****************after remove 'hello'**********************");
  19. myHashSet.display();
  20. System.out.println("元素个数: " + myHashSet.size());
  21. }
  22. }

输出结果:

转载于:https://www.cnblogs.com/suifengbingzhu/p/4990032.html

java中HashSet实现(转)相关推荐

  1. java中Hashset集合删除元素_从Java中的HashSet中删除单个元素

    要从HashSet中删除单个元素,请使用remove()方法. 首先,创建一个HashSet-HashSet hs = new HashSet(); 现在,将元素添加到HashSet-hs.add(& ...

  2. java中HashSet对象内的元素的hashCode值不能变化

    因为不管是HashMap(或HashTable,还是HashSet),key值是以hashCode值存进去的,加入key值变了,将无法从集合内删除对象,导致内存溢出. 转载于:https://www. ...

  3. 利用JAVA中HashSet制作三人斗地主

    一.存牌 HashMap<Integer,String> hm = new HashMap<Integer,String>(); ArrayList<Integer> ...

  4. java中hashset_Java HashSet – Java中的HashSet

    java中hashset Java HashSet is the most popular implementation of Set interface. java.util.HashSet is ...

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

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

  6. 用Java中的HashSet写一个学生管理系统(添加、删除、修改、查询学生信息)

    不废话,上代码: 先创建一个Student类: public class Student {private String id;private String name;private String m ...

  7. java中的hashset_Java中的HashSet

    java中的hashset 介绍: Java中的HashSet实现Set接口,即它不允许重复. 它在内部由HashMap支持,该哈希表基于哈希原理. 我们可以在HashSet中存储一个空值. 默认容量 ...

  8. Java中的HashSet

    介绍: Java中的HashSet实现Set接口,即它不允许重复. 它在内部由HashMap支持,该哈希表基于哈希原理. 我们可以在HashSet中存储一个空值. 默认容量为16,负载系数为0.75, ...

  9. Java中如何克隆集合——ArrayList和HashSet深拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法 ...

  10. 聊聊传说中的散列哈希Hash算法,以及Java中的HashTable,HashMap,HashSet,ConcurrentHashMap......

    建议本文结合java源码来阅读,看了之后就什么都懂了,还有参考文献. 散列(Hash) 是一种按关键字编址的存储和检索方法 散列表(HashTable)根据元素的关键字确定元素的位置 散列函数(Has ...

最新文章

  1. benet 3.0的windows服务视频 第二章DNS
  2. iBATIS:xml中定义返回值
  3. IDEA下maven项目Plugins和Dependencies红线
  4. openWRT自学---针对backfire版本的主要目录和文件的作用的分析整理
  5. 简析 JSON 中的{}与[]
  6. linux vsftpd
  7. python是一种跨平台开源免费的高级动态编程_Python是一种跨平台、开源、免费的高级动态编程语言。...
  8. 通过注册表修改键盘映射
  9. 安川机器人程序还原_安川机器人报错代码:上传操作和判断CF卡故障
  10. python网课期中答案_中国大学python答案网课期末慕课MOOC答案
  11. python玩微信小程序游戏_使用python实现微信小程序自动签到功能
  12. 本地滑块识别DLL/本地通用验证码识别DLL/文字点选/图标点选/本地识别DLL
  13. 利用网络爬虫爬取知乎回答者的信息及回答内容
  14. SSRF(10)302跳转 Bypass
  15. mysql表分区备份_ZRM 2.1:备份MySQL分区表
  16. 活久见!这么好的图文电子书制作工具我竟然才发现
  17. 探讨刀塔传奇是怎么防止客户端作弊的
  18. 最近设计的一个无人机app的界面
  19. 地理信息产业总产值今年将达2600亿元
  20. 周末读书:《红楼梦》

热门文章

  1. 任正非谈鸿蒙系统研究,任正非谈鸿蒙系统 有优势 有信心打造生态
  2. java判断闰年代码_根据输入的年份判断是否是闰年?(在JAVA用if-else)
  3. 计算机硬件不仅使用二进制,【判断题】计算机硬件中不仅使用二进制表示数据,也经常使用十六进制。...
  4. 324.摆动排序II
  5. 129.求根到叶子节点数字之和
  6. 梯度下降法与正规方程的比较
  7. 【AtCoder Grand Contest 036 B】Do Not Duplicate【循环节】
  8. ++递归 字符串全排列_Ann全排列的枚举_递归实现(基于Python)
  9. 易考防作弊功能有哪些_浙江考试院发公告,上百名考生考研违规,你可以不努力但不能作弊...
  10. 入坑AI一路过来走过的弯路和思考