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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈JVM内存溢出原因和解决思路

    浅谈JVM内存溢出原因和解决思路

    本文主要介绍了浅谈JVM内存溢出原因和解决思路,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java基于Tcp协议的socket编程实例

    Java基于Tcp协议的socket编程实例

    这篇文章主要介绍了Java基于Tcp协议的socket编程实例,较为详细的分析了socket编程客户端与服务器端的具体实现步骤与使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • Java7到Java17之Switch语句进化史示例详解

    Java7到Java17之Switch语句进化史示例详解

    这篇文章主要为大家介绍了Java7到Java17之Switch语句进化史示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Spring Security学习笔记(一)

    Spring Security学习笔记(一)

    这篇文章主要介绍了Spring Security的相关资料,帮助大家开始学习Spring Security框架,感兴趣的朋友可以了解下
    2020-09-09
  • java 操作gis geometry类型数据方式

    java 操作gis geometry类型数据方式

    这篇文章主要介绍了java 操作gis geometry类型数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • mybatis执行批量更新batch update 的方法(oracle,mysql两种)

    mybatis执行批量更新batch update 的方法(oracle,mysql两种)

    这篇文章主要介绍了mybatis执行批量更新batch update 的方法,提供oracle和mysql两种方法,非常不错,需要的朋友参考下
    2017-01-01
  • 使用SpringMVC访问Controller接口返回400BadRequest

    使用SpringMVC访问Controller接口返回400BadRequest

    这篇文章主要介绍了使用SpringMVC访问Controller接口返回400BadRequest,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring @Conditional注解从源码层讲解

    Spring @Conditional注解从源码层讲解

    @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean,这篇文章主要介绍了Spring @Conditional注解示例详细讲解,需要的朋友可以参考下
    2023-01-01
  • 深入分析java文件路径的详解

    深入分析java文件路径的详解

    本篇文章是对java文件路径进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • SpringBoot整合JavaMail邮件的两种方式

    SpringBoot整合JavaMail邮件的两种方式

    这篇文章主要介绍了SpringBoot整合JavaMail邮件的两种方式,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-05-05

最新评论