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

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

HashNode代码如下:

  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实现如下:

  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. }

测试代码:

  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. }

输出结果:

java中HashSet实现(转)的更多相关文章

  1. Java中HashSet的解读

    一. HashSet源代码 HashSet 的实现   对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的 ...

  2. Java中HashSet和HashMap

    Set中存储元素为什么不重复(即使hashCode相同)? HashSet中存放自定义类型元素时候,需要重写对象中的hashCode方法和equals方法, HashSet中存放自定义类型元素时候,需 ...

  3. Java中HashSet的重复性与判等运算重载

    目录 还有一个故事--(平行世界篇) 还有一个美丽的梦幻家园:java.util 并且还有一个善战的达拉崩巴:HashSet 还有另外一个故事(不是虚假传说) 还有一对涂满毒药的夺命双匕:equals ...

  4. Java中HashSet,HashMap和HashTable的区别

    HashMap.HashSet.HashTable之间的区别是Java程序员的一个常见面试题目,在此仅以此博客记录,并深入源代码进行分析: 在分析之前,先将其区别列于下面 1:HashSet底层采用的 ...

  5. java中HashSet详解(转)

    HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSe ...

  6. java中HashSet详解

    HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSe ...

  7. java集合(4)- java中HashSet详解

    HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSe ...

  8. java中hashSet原理

    转自: http://blog.csdn.net/guoweimelon/article/details/50804799 HashSet是JavaMap类型的集合类中最常使用的,本文基于Java1. ...

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

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

随机推荐

  1. BZOJ 1062 糖果雨

    http://www.lydsy.com/JudgeOnline/problem.php?id=1062 思路:找到平行四边形以后,变换坐标:y->y-kx,k为斜率,这样变成了矩形,然后只要二 ...

  2. 在COM组件中调用JavaScript函数

    转载自: http://blog.csdn.net/cheungmine/article/details/1451489 要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS) ...

  3. Oracle游标动态赋值

    1. oracle游标动态赋值的小例子 -- 实现1:动态给游标赋值 -- 实现2:游标用表的rowtype声明,但数据却只配置表一行的某些字段时,遍历游标时需fetch into到精确字段 CREA ...

  4. struct2-json

    一.JSON是什么? :JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解 析和生成.它基于JavaScript(Stan ...

  5. Bridging signals(二分 二分+stl dp)

    欢迎参加——每周六晚的BestCoder(有米!) Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 6 ...

  6. [Node.js]在windows下不得不防的小错误

    TypeError: Arguments to path.join must be strings at f (path.js:204:15) at Object.filter (native) at ...

  7. hdu 4930 Fighting the Landlords--2014 Multi-University Training Contest 6

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 Fighting the Landlords Time Limit: 2000/1000 MS ...

  8. 安装sql server 2008 management studio时,提示升级VS2008 到 SP1

    安装sql server 2008 management studio时,提示错误:此计算机上安装了 Microsoft Visual Studio 2008 的早期版本.请在安装 SQL Serve ...

  9. Windows Live Writer针对CNBLOG的代码高亮插件

    一,CodeHighlighter 1. 下载插件 下载地址:http://files.cnblogs.com/files/cmt/WindowsLiveWriter.CNBlogs.CodeHigh ...

  10. yum安装epel库后,安装软件总是提示Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again(无法检索epel仓库)

    解决方法: vi /etc/yum.repos.d/epel.repo 将baseurl中的注释取消,将mirrorlist该列注释掉即可. 附图如下: