Hashtable、HashMap、TreeMap的区别

了解 Hashtable、HashMap、TreeMap

1)Hashtable

  • 是一个比较古老的实现,随 Java 1.0 引入。

  • 它是同步的,这意味着它是线程安全的,但这也意味着它通常比非同步的实现(如 HashMap )慢。

  • 不允许使用 null 键或 null 值。

  • 是一个基于散列表的 Map 实现。

2)HashMap

  • 是 Java 1.2引入的,作为 Hashtable 的一个更先进的替代品。

  • 它是非同步的,这意味着它不是线程安全的,但其性能在单线程环境下通常比 Hashtable 好。

  • 允许一个 null 键和多个 null 值。

  • 同样是基于散列的 Map 实现,但提供更快的迭代。

3)TreeMap

  • 基于红黑树( Red-Black tree )的 NavigableMap 实现。

  • 按照键的自然顺序或创建时提供的 Comparator 进行排序,因此它除了作为 Map 外,还可以用作双端队列。

  • 不是线程安全的。

  • 不允许 null 键(如果使用自然排序),但允许多个 null 值。

  • 提供了一些特殊的方法来处理键的有序性,如 firstKey()lastKey(),  headMap(),  tailMap() 等。

简单示例

Hashtable 示例


public class HashtableExample {public static void main(String[] args) {Map<String, Integer> numbers = new Hashtable<>();numbers.put("One", 1);numbers.put("Two", 2);// numbers.put(null, 3); // 这会抛出 NullPointerException// numbers.put("Four", null); // 这也会抛出 NullPointerExceptionSystem.out.println("Hashtable: " + numbers);}
}

在这个 Hashtable 示例中,尝试将 null 作为键或值添加到映射中会抛出 NullPointerException异常 。

HashMap 示例

public class HashMapExample {public static void main(String[] args) {Map<String, Integer> numbers = new HashMap<>();numbers.put("One", 1);numbers.put("Two", 2);numbers.put(null, 3); // HashMap 允许 null 键numbers.put("Four", null); // HashMap 也允许 null 值System.out.println("HashMap: " + numbers);}
}

 在 HashMap 示例中,可以看到它允许使用 null 作为键和值,这与 Hashtable 不同。

TreeMap 示例

public class TreeMapExample {public static void main(String[] args) {// 创建一个 TreeMap 实例TreeMap<String, Integer> treeMap = new TreeMap<>();// 添加几个非空键和值treeMap.put("Apple", 1);treeMap.put("Banana", 2);// 尝试添加 null 值 - 这是允许的treeMap.put("Cherry", null);// 打印 TreeMapSystem.out.println(treeMap);try {// 尝试添加 null 键 - 这会抛出 NullPointerExceptiontreeMap.put(null, 3);} catch (NullPointerException e) {System.out.println("Cannot insert null key into a TreeMap when using natural ordering.");}}
}

尝试向 TreeMap 中添加一个 null 键,这将导致抛出 NullPointerException,因为 TreeMap 在自然排序模式下无法处理 null 键。然而,向 TreeMap 添加 null 值是允许的,我们可以看到 Cherry 对应的值被成功添加为 null。

使用场景

Hashtable

  • 当需要确保数据的线程安全,且在多线程环境中共享 Map 时,可以考虑使用 Hashtable。

  • 由于其性能相对较低,推荐在遗留代码中或者特定要求线程安全的小规模数据集合中使用。

HashMap

  • 在非多线程环境中,或者在读多写少的场景下(可以通过外部同步来解决线程安全问题),HashMap 是一个优选,因为它提供了更好的性能。

  • 当需要快速查找、插入和删除键值对时,特别是在数据量较大的情况下。

TreeMap

  • 当需要一个总是保持排序状态的 Map 时,TreeMap 是最合适的选择。它适用于需要频繁地进行有序遍历或范围搜索的场景。

  • 在需要根据键进行排序的应用中,如时间线索引、自然排序的目录结构等。

  • 当数据结构的大小频繁变动,且需要保持有序状态时,TreeMap 通常比维护一个 ArrayList 之后再排序要高效。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

x264编码器 API 函数介绍

x264 x264是一个开源的视频编码库,用于将视频压缩为H.264/AVC(Advanced Video Coding)格式。它是一种广泛使用的视频编码标准,能够提供高质量的视频压缩和较低的比特率。 x264库提供了一个编码器,可以将原始视频序列转换为H.264/AVC压缩的比特流。它实现了各种H.264编码算…

【从Python基础到深度学习】12. 封包、解包

封包 将多个值赋值给一个变量时&#xff0c;Python 会自动将这些值封装成元组&#xff0c;这个特性称之为封包 a 1, 2, 3, 4 print(a) 解包 所有可迭代对象都支持解包 str list tuple dict set reversed range zip enumerate 赋值过程中的解包赋值符号左边变量和右边可迭代…

MongoDB实战面试指南:常见问题一网打尽

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! MongoDB是一款流行的非关系型数据库&#xff0c;以其高效、可扩展的特性受到开发者的青睐。了解MongoDB的架构、存储引擎和数据结…

ETH共识升级之路

简介 根据我们之前的介绍&#xff0c;了解到ETH网络的共识方式&#xff0c;已经从 PoW 切换到了 PoS&#xff0c;今天我们就回顾下升级之路&#xff0c;以及升级带来的影响 最早的共识机制 PoW 以太坊创建之初采用了类似比特币的工作量证明机制&#xff0c;即矿工通过计算哈希函…

java房屋中介(java+SQL2000)-391-(源码+说明资料)

转载地址: http://www.3q2008.com/soft/search.asp?keyword391 任务及要求&#xff1a;  1&#xff0e;设计&#xff08;研究&#xff09;内容和要求&#xff08;包括设计或研究内容、主要指标与技术参数&#xff0c;并根据课题性质对学生提出具体要求&#xff09;  本系统…

知识图谱中的数据服务是什么?

随着信息时代的飞速发展&#xff0c;数据已经成为了各行各业的重要资源。知识图谱作为大数据时代的一种新型数据组织形式&#xff0c;能够将分散、无序的数据进行结构化处理&#xff0c;并建立起相互之间的关系&#xff0c;从而更好地满足人们对知识的需求。而在知识图谱中&…

CircuitBreaker熔断器

CircuitBreaker熔断器 1、Hystrix目前也进入维护模式 ​ Hystrix是一个用于处理分布式系统的延迟和容错的开源库&#xff0c;在分布式系统里&#xff0c;许多依赖不可避免的会调用失败&#xff0c;比如超时、异常等&#xff0c;Hystrix能够保证在一个依赖出问题的情况下&…

C++演变历史

C 从 C 98 版本到今年确定的 C23&#xff0c;共经历了 6 个版本的迭代。上面这张图里&#xff0c;列出了每次版本更新变化的内容。顶部黑体字的大小说明了版本变化的大小&#xff0c;其中 C14 是字体最小&#xff0c;这个版本是 C11 的增量版本&#xff0c;之所以没有大的变动&…

Server-Sent Events (SSE) 实现从服务器到客户端的实时数据流

前期回顾 避免阻塞主线程 —— Web Worker 示例项目-CSDN博客https://blog.csdn.net/m0_57904695/article/details/136721297?spm1001.2014.3001.5501 目录 CSDN 彩色之外 &#x1f4dd; 前言 &#x1f6e0;️ 安装 ✂️ 运行服务器 ✂️ 运行index.html ♻️ 贡献…

身份证查询-身份认证-javascript实名认证接口-

翔云身份证实名认证接口将与网络平台携手共筑信息安全防线&#xff0c;守护每一笔交易的真实可信&#xff0c;助力您的企业在数字化浪潮中稳健前行&#xff01; 以下是javascript语言调用翔云身份证实名认证API的代码&#xff1a; var form new FormData(); form.append("…

引领短剧风尚,打造全新观影体验——短剧APP开发之旅

随着移动互联网的迅猛发展&#xff0c;短视频和短剧成为了大众休闲娱乐的新宠。为了满足用户对于高质量、快节奏内容的需求&#xff0c;我们决定开发一款全新的短剧APP&#xff0c;为用户带来前所未有的观影体验。 这款短剧APP将集合丰富多样的短剧资源&#xff0c;涵盖各种题…

了解什么是 Redis 的雪崩、穿透和击穿?Redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 Redis 的穿透?

目录 一、面试官心理分析 二、面试题剖析 1. 缓存雪崩 2. 缓存穿透 3. 缓存击穿 一、面试官心理分析 其实这是问到缓存必问的&#xff0c;因为缓存雪崩和穿透&#xff0c;是缓存最大的两个问题&#xff0c;要么不出现&#xff0c;一旦出现就是致命性的问题&#x…

B/S基于云计算的云HIS智慧医院管理系统源码带电子病历编辑器

目录 一、系统概述 二、开发环境 三、系统功能 1、门诊部分 2、住院部分 3、电子病历 4、药物管理 5、统计报表 6、综合维护 7、运营运维 云HIS系统&#xff1a;病案首页 云his系统源码 SaaS应用 功能易扩 统一对外接口管理 现如今&#xff0c;大数据、云计算、移动…

c# 编辑、删除一条数据

1、编辑数据 [HttpPost] public MessageModel<string> Put([FromBody] Dtable request) { var data new MessageModel<string>(); request.UPDATETIME DateTime.Now; if (request.ID>0) { …

案例:MySQL 主从复制与读写分离

1.案例环境 一、准备五台主机 Master&#xff1a;操作系统CentOS 7.3x86_74、IP地址192.168.17.10。Slave1&#xff1a;操作系统CentOS 7.3x86_74、IP地址192.168.17.20。Slave2&#xff1a;操作系统CentOS 7.3x86_74、IP地址192.168.17.30。Amoeba&#xff1a;操作系统CentO…

HDOJ 2048

神、上帝以及老天爷 Problem Description HDU 2006’10 ACM contest的颁奖晚会隆重开始了&#xff01; 为了活跃气氛&#xff0c;组织者举行了一个别开生面、奖品丰厚的抽奖活动&#xff0c;这个活动的具体要求是这样的&#xff1a; 首先&#xff0c;所有参加晚会的人员都将一…

python | pop()和remove()方法

pop()与remove()方法都是删除列表中的元素&#xff0c;但删除的位置不同 ① pop()&#xff1a;删除列表中的最后一个元素 ② remove()&#xff1a;可以删除列表中的某一个值 如果某一个值有多个&#xff0c;则删除第一个&#xff08;即最左边出现的那一个&#xff09; li[…

【WPF】Canvas的Path画线 颜色值偏差和面积不准确

图像中左上角2个红色线段 颜色值有偏差&#xff0c;且线段高度不准确&#xff08;我设置的是Red,1&#xff09;。 解决方案&#xff1a; 1、PathGeometry PathFigure LineSegment 2、Stretch设置Fill <Path Stretch"Fill" Stroke"Red"…

Axure软件安装汉化教程

Axure软件安装汉化教程 一、准备教程 下载Axure的软件&#xff0c;并解压打开 二、安装过程 双击Axure软件的运行程序&#xff0c;修改安装程序的路径&#xff0c;默认下一步即可。 三、软件汉化 打开Axure的软件安装路径&#xff0c;将汉化包复制粘贴进入到Axure RP 9安装…

C语言从入门到实战————数组和指针的深入理解

前言 在C语言中&#xff0c;数组和指针有的密切得联系&#xff0c;因为数组名本身就相当于一个指针常量。指针是一个变量&#xff0c;专门用来存储另一个变量的内存地址&#xff0c;通过这个地址可以访问和操作该变量的值&#xff0c;同时也包括数组。数组是一组连续存储的同类…