热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Javahashmap原理

Javahashmap原理-Javahashmap原理线性表:存储在连续的内存地址,查询快,插入和删除慢。链式表:存储在间断的,大小不固定,插入和删除快,但是查询的速度慢。h

Java hashmap原理

线性表:存储在连续的内存地址,查询快,插入和删除慢。
链式表:存储在间断的,大小不固定,插入和删除快,但是查询的速度慢。

hashmap是以上两种者折中的解决方案,插入或者删除只需要动一部分即可。

单个结点的属性有:

  • hash:用于快速定位;
  • key:标识符
  • Value:存储的数值
  • next:引用地址,便于插入、删除操作

注:a7的链式表 成为hash桶

通过hash查询的流程:

  • 1.先判断key是否为空
  • 2.在不为空的情况下,通过hash定位

hashmap的常用方法:\

存值: map.put(key,value)
读值: map.get(key)
判断是否为空:map.isEmpty()
判断是否含有key:map.containsKey(key)
判断是否含有value:map.containsValue(value)
删除key值下的value:map.remove(key) //只删除了Value
显示所有value值:map.values()
元素的个数:map.size()
显示所有key:map.keySet()
显示所有key和value:map.entrySet()
合并2个类型相同的map:map.putAll(map1)
删除这个key和Value:map.remove(key,value)
替换key下的value:map.replace(key,newValue)
清洗整个map:map.clear()
map的克隆:map.clone()

Hash线程安全:

1.多线程对相同key进行put操作
2.多线程同时对Node数组进行扩容,导致数据丢失
线程安全,避免多线程对共享数据进行操作时,产生的脏读、误读。

三种线程安全的方法:

a.hashtable 通过关键字synchroized标记临界区来实现
b.ConcurrentHashMap jdk1.8引入CAS算法 它的性能最好
c.SyschroniedMap 通过类间接使用 syschroized

HashCode和equals方法

使用hashmap时需要同时重写 HashCode和equals方法。

  • 单一重写HashCode和equals都不能保证数据的唯一性。
  • Hashcode()的作用:将对象的内部地址转换成一个整数返回。(即获取hash桶的编号)
  • equals()的作用:只是比较2个对象之间的内容是否相同

重写时注意:
1. equals true ->hashcode返回的int要相同
2. equals false ->hashcode 返回的int一定不相同
3. hashcode int 相同 ->equals 可以是true 也可以是false
4. hashcode int 不同 ->equals一定要是false

比较 HashSet 和 HashMap

HashSet:
1.必须要重写hasdcode 和 equals 从而确保对象的唯一性
2.利用对象获取hashcode 元素以对象的形式
3.add()增加元素

HashMap:
1.必须要重写hashcode 和equals
2.利用key获取hashcode 以的形式
3.put()增加元素


推荐阅读
  • Java之HashMap在多线程情况下导致死循环的问题
    PS:不得不说Java编程思想这本书是真心强大..学习内容:1.HashMap<K,V>在多线程的情况下出现的死循环现象当初学Java的时候只是知道HashMap< ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文深入解析了Java 8并发编程中的`AtomicInteger`类,详细探讨了其源码实现和应用场景。`AtomicInteger`通过硬件级别的原子操作,确保了整型变量在多线程环境下的安全性和高效性,避免了传统加锁方式带来的性能开销。文章不仅剖析了`AtomicInteger`的内部机制,还结合实际案例展示了其在并发编程中的优势和使用技巧。 ... [详细]
  • Java集合详解5:深入理解LinkedHashMap和LRU缓存
    Java集合详解5:深入理解LinkedHashMap和LRU缓存今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存。具体代码在我的 ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • 转载自:http:www.blogjava.netCarpenterLeearchive20160427430268.html总体介绍之所以把HashSet和HashMa ... [详细]
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • 将学生对象和学生的归属地通过键与值存储到map集合中。importjava.util.HashMap;importjava.util.Iterator;importjava.uti ... [详细]
  • 01Map集合概述A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同a:Collection中的集合 ... [详细]
  • 手写HashMap,快手面试官直呼内行
    手写HashMap,快手面试官直呼内行-手写HashMap?这么狠,面试都卷到这种程度了?第一次见到这个面试题,是在某个不方便透露姓名的Offer收割机大佬的文章:这……我当 ... [详细]
  • 在Java中有多种遍历HashMap的方法,注意Java中所有的Map类型都实现了共有的Map接口,所以接下来方法适用于所有Map(如:HaspMap,TreeMap,Linked ... [详细]
  • Java面试 HashMap、HashSet源码解析
    本章所有源代码基于JDK1.8版本HashMap和HashSet是JavaCollectionFramework的两个重要成员,其中HashMap是Map接口的常用实现类,Hash ... [详细]
  • 优化后的标题:Apache Cassandra数据写入操作详解
    本文详细解析了 Apache Cassandra 中的数据写入操作,重点介绍了 INSERT 命令的使用方法。该命令主要用于将数据插入到指定表的列中,其基本语法为 `INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...)`。通过具体的示例和应用场景,文章深入探讨了如何高效地执行数据写入操作,以提升系统的性能和可靠性。 ... [详细]
  • 类Hashtable<K,V>所有已实现的接口:Serializable,Cloneable,Map<K,V>此类实现一个哈希表,该哈希表将键映 ... [详细]
  • 本篇文章给大家分享的是有关Java中怎么对HashMap按键值排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话 ... [详细]
author-avatar
木维韵_538
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有