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. TF卡座(外焊、内焊、掀盖式、全塑、简易)

    TF卡座(外焊.内焊.掀盖 式.全塑.简易

  2. socket基础(二)

    Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类 ...

  3. Randomized QuickSelect

    In this blog, we give a solution for Quick Select. Here, we have an improvement. The idea is to rand ...

  4. cc150 Chapter 2 | Linked Lists 2.5 add two integer LinkedList, return LinkedList as a sum

    2.5 You have two numbers represented by a linked list, where each node contains a single digit. The ...

  5. 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms

    Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. vmware tools 安装

    转到虚拟机 > 安装 VMware Tools(或 VM > 安装 VMware Tools).注意:如果您运行的是轻量版的 Fusion.不带 VMware Tools 的 Workst ...

  7. 简单随笔——如何在gridview的页脚显示信息。。。。

    我是超级大菜鸟...哈哈 先上图看看是不是你需要的 第一步,右击gridview,在事件中,单击RowdataBond事件. 在这之前一定要记得在gridview属性中的ShowFooter设置为“t ...

  8. java学习之部分笔记2

    1.变量 实例变量和局部变量 实例变量系统会自动初始化为0和null(string),局部变量必须设定初始值. 静态方法里只能引用静态变量 数据类型的自动转换! int—>long 2.构造方法 ...

  9. 《JavaScript 闯关记》之变量和数据类型

    当程序需要将值保存起来以备将来使用时,便将其赋值给一个变量,值的类型称作数据类型. 变量 JavaScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据.换句话说,每个变量仅仅是 ...

  10. struts2 <s:iterator> 遍历方法

    1.MapAction.java import java.util.ArrayList;   import java.util.HashMap;   import java.util.List;    ...