java中HashSet实现(转)
hashset底层的数据结构是hash表,hash表实现方式采用数组+链表,数组类型为HashNode,每个数组元素为链表的头指针,链表中存储经过hash函数散列后冲突的元素,数组的长度为26
hashset存储的元素类型为字符串,取每个字符串的首字符的ascall码作为hash函数的输入,数组的长度为10,散列函数h(x)=x%10。
HashNode代码如下:
- public class HashNode {
- private String msg;
- private HashNode next;
- public String getMsg() {
- return msg;
- }
- public void setMsg(String msg) {
- this.msg = msg;
- }
- public HashNode getNext() {
- return next;
- }
- public void setNext(HashNode next) {
- this.next = next;
- }
- public HashNode(String msg, HashNode next) {
- this.msg = msg;
- this.next = next;
- }
- public HashNode() {
- }
- }
hashset实现如下:
- public class MyHashSet {
- private HashNode[] nodes = new HashNode[10];
- private int size = 0;
- public MyHashSet() {
- for (int i = 0; i < nodes.length; i++) {
- nodes[i] = new HashNode();
- }
- }
- public boolean add(String value) {
- if (contains(value)) { // 如果有这个元素,就不插入
- return false;
- }
- HashNode node = new HashNode(value, null);
- int index = (int) value.charAt(0) % nodes.length; // 取第一个字符作为hash函数的输入
- // 如果该链为空,直接插入,否则采用头插法
- if (nodes[index].getNext() == null) {
- nodes[index].setNext(node);
- } else {
- node.setNext(nodes[index].getNext());
- nodes[index].setNext(node);
- }
- size++;
- return true;
- }
- public boolean remove(String value) {
- if (!contains(value)) {
- return false;
- }
- int index = (int) value.charAt(0) % nodes.length;
- HashNode node = nodes[index];
- HashNode node2 = node.getNext();
- while (node2 != null) {
- if (node2.getMsg().equals(value)) {
- node.setNext(node2.getNext());
- size--;
- break;
- }
- node = node.getNext();
- node2 = node.getNext();
- }
- return true;
- }
- public void display() {
- for (int i = 0; i < nodes.length; i++) {
- HashNode node = nodes[i].getNext();
- System.out.print(i + " :");
- while (node != null) {
- System.out.print(node.getMsg() + " ");
- node = node.getNext();
- }
- System.out.println();
- }
- }
- public int size() {
- return size;
- }
- public boolean contains(String value) {
- int index = (int) value.charAt(0) % nodes.length;
- HashNode node = nodes[index].getNext();
- while (node != null) {
- if (node.getMsg().equals(value)) {
- return true;
- }
- node = node.getNext();
- }
- return false;
- }
- }
测试代码:
- public class TestMyHashSet {
- public static void main(String[] args) {
- MyHashSet myHashSet = new MyHashSet();
- myHashSet.add("hello");
- myHashSet.add("hey");
- myHashSet.add("apply");
- myHashSet.add("你好");
- myHashSet.add("你是谁");
- myHashSet.add("cat");
- myHashSet.add("dog");
- myHashSet.add("cat");
- myHashSet.add("你好");
- System.out.println("包含'你好'? " + myHashSet.contains("你好"));
- System.out.println("元素个数: " + myHashSet.size());
- myHashSet.display();
- myHashSet.remove("hello");
- System.out
- .println("*****************after remove 'hello'**********************");
- myHashSet.display();
- System.out.println("元素个数: " + myHashSet.size());
- }
- }
输出结果:
转载于:https://www.cnblogs.com/suifengbingzhu/p/4990032.html
java中HashSet实现(转)相关推荐
- java中Hashset集合删除元素_从Java中的HashSet中删除单个元素
要从HashSet中删除单个元素,请使用remove()方法. 首先,创建一个HashSet-HashSet hs = new HashSet(); 现在,将元素添加到HashSet-hs.add(& ...
- java中HashSet对象内的元素的hashCode值不能变化
因为不管是HashMap(或HashTable,还是HashSet),key值是以hashCode值存进去的,加入key值变了,将无法从集合内删除对象,导致内存溢出. 转载于:https://www. ...
- 利用JAVA中HashSet制作三人斗地主
一.存牌 HashMap<Integer,String> hm = new HashMap<Integer,String>(); ArrayList<Integer> ...
- java中hashset_Java HashSet – Java中的HashSet
java中hashset Java HashSet is the most popular implementation of Set interface. java.util.HashSet is ...
- Java中哈希集(HashSet)概念,实现以及操作
Java中HashSet的用法 1. HashSet概念 2.Java文档中HashSet的实现 3.HashSet的构造函数 3.1 HashSet() 3.2 HashSet(int initia ...
- 用Java中的HashSet写一个学生管理系统(添加、删除、修改、查询学生信息)
不废话,上代码: 先创建一个Student类: public class Student {private String id;private String name;private String m ...
- java中的hashset_Java中的HashSet
java中的hashset 介绍: Java中的HashSet实现Set接口,即它不允许重复. 它在内部由HashMap支持,该哈希表基于哈希原理. 我们可以在HashSet中存储一个空值. 默认容量 ...
- Java中的HashSet
介绍: Java中的HashSet实现Set接口,即它不允许重复. 它在内部由HashMap支持,该哈希表基于哈希原理. 我们可以在HashSet中存储一个空值. 默认容量为16,负载系数为0.75, ...
- Java中如何克隆集合——ArrayList和HashSet深拷贝
2019独角兽企业重金招聘Python工程师标准>>> 编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法 ...
- 聊聊传说中的散列哈希Hash算法,以及Java中的HashTable,HashMap,HashSet,ConcurrentHashMap......
建议本文结合java源码来阅读,看了之后就什么都懂了,还有参考文献. 散列(Hash) 是一种按关键字编址的存储和检索方法 散列表(HashTable)根据元素的关键字确定元素的位置 散列函数(Has ...
最新文章
- benet 3.0的windows服务视频 第二章DNS
- iBATIS:xml中定义返回值
- IDEA下maven项目Plugins和Dependencies红线
- openWRT自学---针对backfire版本的主要目录和文件的作用的分析整理
- 简析 JSON 中的{}与[]
- linux vsftpd
- python是一种跨平台开源免费的高级动态编程_Python是一种跨平台、开源、免费的高级动态编程语言。...
- 通过注册表修改键盘映射
- 安川机器人程序还原_安川机器人报错代码:上传操作和判断CF卡故障
- python网课期中答案_中国大学python答案网课期末慕课MOOC答案
- python玩微信小程序游戏_使用python实现微信小程序自动签到功能
- 本地滑块识别DLL/本地通用验证码识别DLL/文字点选/图标点选/本地识别DLL
- 利用网络爬虫爬取知乎回答者的信息及回答内容
- SSRF(10)302跳转 Bypass
- mysql表分区备份_ZRM 2.1:备份MySQL分区表
- 活久见!这么好的图文电子书制作工具我竟然才发现
- 探讨刀塔传奇是怎么防止客户端作弊的
- 最近设计的一个无人机app的界面
- 地理信息产业总产值今年将达2600亿元
- 周末读书:《红楼梦》
热门文章
- 任正非谈鸿蒙系统研究,任正非谈鸿蒙系统 有优势 有信心打造生态
- java判断闰年代码_根据输入的年份判断是否是闰年?(在JAVA用if-else)
- 计算机硬件不仅使用二进制,【判断题】计算机硬件中不仅使用二进制表示数据,也经常使用十六进制。...
- 324.摆动排序II
- 129.求根到叶子节点数字之和
- 梯度下降法与正规方程的比较
- 【AtCoder Grand Contest 036 B】Do Not Duplicate【循环节】
- ++递归 字符串全排列_Ann全排列的枚举_递归实现(基于Python)
- 易考防作弊功能有哪些_浙江考试院发公告,上百名考生考研违规,你可以不努力但不能作弊...
- 入坑AI一路过来走过的弯路和思考