Java数据结构中的HashMap和HashSet详解

 更新时间:2023年10月24日 09:12:13   作者:不是懒大王  
HashMap和HashSet都是存储在哈希桶之中,通过本文我们可以先了解一些哈希桶是什么,本文结合实例代码给大家介绍的非常详细,需要的朋友参考下吧

HashMap和HashSet都是存储在哈希桶之中,我们可以先了解一些哈希桶是什么。

像这样,一个数组数组的每个节点带着一个链表,数据就存放在链表结点当中。哈希桶插入/删除/查找节点的时间复杂度是O(1)

map代表存入一个key值,一个val值。map可多次存储,当第二次插入时,会更新val值。

set代表只存入一个key值,但在实际源码中,set的底层其实也是靠map来实现的。set只能存入数据一次,当第二次插入时,若哈希桶中存在元素则返回false。

下面是代码实现

// key-value 模型
public class HashBucket {
private static class Node {
private int key;
private int value;
Node next;
public Node(int key, int value) {
this.key = key;
this.value = value;
}
}
private Node[] array;
private int size; // 当前的数据个数
private static final double LOAD_FACTOR = 0.75;
public int put(int key, int value) {
int index = key % array.length;
// 在链表中查找 key 所在的结点
// 如果找到了,更新
// 所有结点都不是 key,插入一个新的结点
for (Node cur = array[index]; cur != null; cur = cur.next) {
if (key == cur.key) {
int oldValue = cur.value;
cur.value = value;
return oldValue;
}
} N
ode node = new Node(key, value);
node.next = array[index];
array[index] = node;
size++;
if (loadFactor() >= LOAD_FACTOR) {
resize();
} r
eturn -1;
}
private void resize() {
Node[] newArray = new Node[array.length * 2];
for (int i = 0; i < array.length; i++) {
Node next;
for (Node cur = array[i]; cur != null; cur = next) {
next = cur.next;
int index = cur.key % newArray.length;
cur.next = newArray[index];
newArray[index] = cur;
}
} a
rray = newArray;
}
private double loadFactor() {
return size * 1.0 / array.length;
}
public HashBucket() {
array = new Node[8];
size = 0;
}
public int get(int key) {
int index = key % array.length;
Node head = array[index];
for (Node cur = head; cur != null; cur = cur.next) {
if (key == cur.key) {
return cur.value;
}
} 
return -1;
}
}

到此这篇关于Java数据结构中的HashMap和HashSet的文章就介绍到这了,更多相关java HashMap和HashSet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud引入feign失败或找不到@EnableFeignClients注解问题

    SpringCloud引入feign失败或找不到@EnableFeignClients注解问题

    这篇文章主要介绍了SpringCloud引入feign失败或找不到@EnableFeignClients注解问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring中BeanFactory解析bean详解

    Spring中BeanFactory解析bean详解

    本篇文章主要介绍了Spring中BeanFactory解析bean详解 ,详细的介绍了使用BeanFactory对bean进行解析的实例,有兴趣的可以了解一下。
    2017-04-04
  • 通过dom4j解析xml字符串(示例代码)

    通过dom4j解析xml字符串(示例代码)

    本篇文章主要是对通过dom4j解析xml字符串的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • Java反射的使用和原理详解

    Java反射的使用和原理详解

    这篇文章主要介绍了Java反射的使用和原理详解,反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作,需要的朋友可以参考下
    2024-01-01
  • Spring MVC 关于controller的字符编码问题

    Spring MVC 关于controller的字符编码问题

    在使用springMVC框架构建web应用,客户端常会请求字符串、整型、json等格式的数据,通常使用@ResponseBody注解使 controller回应相应的数据而不是去渲染某个页面。
    2017-03-03
  • java Object类中常用API分享

    java Object类中常用API分享

    Object类是java中所有类的祖宗类,因此java中所有的类的对象都可以直接使用Object类中提供的一些方法,下面小编为大家整理了Object类中常用API,希望对大家有所帮助
    2023-10-10
  • 使用maven-assembly-plugin如何打包多模块项目

    使用maven-assembly-plugin如何打包多模块项目

    这篇文章主要介绍了使用maven-assembly-plugin如何打包多模块项目,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java截取中英文混合字符串的方法

    Java截取中英文混合字符串的方法

    这篇文章主要为大家详细介绍了Java截取中英文混合字符串的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • java如何导出insert语句并生成sql脚本

    java如何导出insert语句并生成sql脚本

    这篇文章主要介绍了java导出insert语句并生成sql脚本的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java 中file.encoding的设置详解

    java 中file.encoding的设置详解

    这篇文章主要介绍了java 中file.encoding的设置详解的相关资料,需要的朋友可以参考下
    2017-04-04

最新评论