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. js 实现二叉树

    二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree),右边的总是大于左边的!二叉树的每个结点至多只有二棵子树(不存 ...

  2. Ice笔记-利用Ice::Application类简化Ice应用

    Ice笔记-利用Ice::Application类简化Ice应用 作者:ydogg,转载请申明. 在编写Ice相关应用时,无论是Client还是Server端,都必须进行一些必要的动作,如:Ice通信 ...

  3. UESTC_Frozen Rose-Heads CDOJ 791

    The winter is coming and all the experts are warning that it will be the coldest one in the last hun ...

  4. Minimum Size Subarray Sum 解答

    Question Given an array of n positive integers and a positive integer s, find the minimal length of ...

  5. printf "%.*s" 分类: 小细节 2015-07-04 14:36 2人阅读 评论(0) 收藏

    ref : http://www.cnblogs.com/yuaqua/archive/2011/10/21/2219856.html 小数点.后"*"表示输出位数,具体的数据来自 ...

  6. Code Generation and T4 Text Templates

    Code Generation and T4 Text Templates Code Generation and T4 Text Templates

  7. Median of Two Sorted Arrays (找两个序列的中位数,O(log (m+n))限制) 【面试算法leetcode】

    题目: There are two sorted arrays A and B of size m and n respectively. Find the median of the two sor ...

  8. GDB+GDBServer调试Linux应用程序

    参考:http://blog.csdn.net/shanghaiqianlun/article/details/7820401 一.gdb+gdbserver总体介绍 远程调试环境由宿主机GDB和目标 ...

  9. 很少人知道的office专用卸载工具

    Microsoft Office是微软公司开发的一套基于 Windows 操作系统的办公软件套装.常用组件有 Word.Excel.Powerpoint等.当我们不需要再用了或者想安装旧版本的话,首先 ...

  10. Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7867340 在前面一篇文章中,我们分析了And ...