Java中TreeMap,HashMap和LinkedHashMap的区别

先决条件:Java 中的 HashMap 和 TreeMap

TreeMap、HashMap 和 LinkedHashMap:有什么相似之处?
 

        所有类都提供键->值映射和遍历键的方法。这些类之间最重要的区别是时间保证和键的顺序。
HashMap、TreeMap 和LinkedHashMap三个类都实现了java.util.Map接口,并表示从唯一键到值的映射。
 
关键点

1. HashMap:HashMap提供0(1)查找和插入。但是,如果迭代键,则键的顺序基本上是任意的。它由链接列表数组实现。 语法:

public class HashMap extends AbstractMap 
implements Map,Cloneable, Serializable

HashMap 包含基于键的值。

它仅包含唯一元素。

它可能有一个空键和多个空值。

它没有维持任何秩序。

2. LinkedHashMap: LinkedHashMap 提供0(1)查找和插入。键按其插入顺序排序。它由双向链接的桶实现。 
语法: 

public class LinkedHashMap extends HashMap 
implements Map

LinkedHashMap 包含基于键的值。

它仅包含唯一元素。

它可能有一个空键和多个空值。

它与 HashMap 相同,但维护插入顺序。

3.TreeMap:TreeMap提供O(log N)查找和插入。键是有序的,因此如果您需要按排序顺序遍历键,则可以。这意味着键必须实现 Comparable 接口。TreeMap 由红黑树实现。 语法:

public class TreeMap extends AbstractMap implements
NavigableMap, Cloneable, Serializable

TreeMap 包含基于键的值。它实现 NavigableMap 接口并扩展 AbstractMap 类。

它仅包含唯一元素。

TreeMap 中第一个插入的条目(键,值)可以包含空键,之后其他键都不能为空,并且可以有多个空值。

它与 HashMap 相同,但保持升序(使用其键的自然顺序排序)。

4. Hashtable: “ Hashtable ”是基于哈希表的映射的通用名称。 
语法: 

public class Hashtable extends Dictionary implements
Map, Cloneable, Serializable

        Hashtable 是一个列表数组。每个列表称为一个 bucket。通过调用 hashcode() 方法来识别 bucket 的位置。Hashtable 包含基于键的值。

它仅包含唯一元素。

它可能没有任何空键或空值。

它是同步的。

它是一个遗留类。

HashMap 示例:

// Java program to print ordering 
// of all elements using HashMap
import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
    // This function prints ordering of all elements
    static void insertAndPrint(AbstractMap<Integer, String> map)
    { 
        int[] array= {1, -1, 0, 2,-2};
        for (int x: array) 
        { 
            map.put(x, Integer.toString(x)); 
        } 
        for (int k: map.keySet())
        {
            System.out.print(k + ", "); 
        }
    } 
 
    // Driver method to test above method
    public static void main (String[] args)
    {
        HashMap<Integer, String> map = new HashMap<Integer, String>();
        insertAndPrint(map);
    }
}

HashMap 的输出: 
 

-1, 0, 1, -2, 2,      
// 键的排序本质上是任意的(任何排序)

LinkedHashMap 示例:

// Java program to print ordering 
// of all elements using LinkedHashMap
import java.util.*;
import java.lang.*;
import java.io.*;
 
class Main
{
    // This function prints ordering of all elements
    static void insertAndPrint(AbstractMap<Integer, String> map)
    { 
        int[] array= {1, -1, 0, 2,-2};
        for (int x: array) 
        { 
            map.put(x, Integer.toString(x)); 
        } 
        for (int k: map.keySet())
        {
            System.out.print(k + ", "); 
        }
    } 
     
    // Driver method to test above method
    public static void main (String[] args)
    {
        LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();
        insertAndPrint(map);
    }
}

LinkedHashMap 的输出: 
 

1, -1, 0, 2, -2,      
// 键按其插入顺序排序

TreeMap 示例:

// Java program to print ordering of
// all elements using TreeMap
 
import java.util.*;
import java.lang.*;
import java.io.*;
 
class Main
{
    // This function prints ordering of all elements
    static void insertAndPrint(AbstractMap<Integer, String> map)
    { 
        int[] array= {1, -1, 0, 2,-2};
        for (int x: array) 
        { 
            map.put(x, Integer.toString(x)); 
        } 
        for (int k: map.keySet())
        {
            System.out.print(k + ", "); 
        }
    } 
 
    // Driver method to test above method
    public static void main (String[] args)
    {
        TreeMap<Integer, String> map = new TreeMap<Integer, String>();
        insertAndPrint(map);
    }
}

TreeMap 的输出: 
 

-2, -1, 0, 1, 2,    
// 键按排序顺序排列

比较表

实际应用

  1. 假设您正在创建姓名到 Person 对象的映射。您可能希望定期按姓名字母顺序输出人员。TreeMap 可让您做到这一点。
  2. TreeMap 还提供了一种方法,可以根据姓名输出接下来的 10 个人。这对于许多应用程序中的“更多”功能非常有用。
  3. 当您需要键的顺序与插入顺序相匹配时,LinkedHashMap 非常有用。当您想删除最旧的项目时,这在缓存情况下可能很有用。
  4. 一般来说,除非有理由不这样做,否则你会使用 HashMap。也就是说,如果你需要按插入顺序取回键,那么使用 LinkedHashMap。如果你需要按真实/自然顺序取回键,那么使用 TreeMap。否则,HashMap 可能是最好的。它通常更快,并且需要的开销更少。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】【队列】算法汇总

一、顺序队列【相当于一维数组】 1.准备工作 #define MAXQSIZE 100 typedef struct{QElemType*base;int front;int rear; }SqQueue; 2.队满&#xff0c;队空。入队&#xff0c;出队 二、链式队列 1.准备工作 typedef struct Qnode{ElemType data;struct Qnode*next; }Qnod…

Github优质项目推荐 - 第五期

文章目录 Github优质项目推荐 - 第五期一、【localsend】&#xff0c;47.5k stars - 附近设备文件互传二、【Pake】&#xff0c;29.9k stars - 网页变成桌面应用三、【laravel-crm】&#xff0c;10.7k stars - CRM 解决方案四、【localstack】&#xff0c;55.7k stars - 本地 A…

RabbitMQ(学习前言)

目录 学习MQ之前有必要先去温故下微服务知识体系&#xff0c;以加深本章节的理解 一、微服务间的通讯方式 1. 基本介绍 2. 同步通讯 2.1. 什么是同步通讯 2.2. 同步通讯存在的问题 问题一&#xff1a;耦合度高 问题二&#xff1a;性能和吞吐能力下降 问题三&#xff1a…

时序必读论文16|ICLR24 CARD:通道对齐鲁棒混合时序预测Transformer

论文标题&#xff1a;CARD: Channel Aligned Robust Blend Transformer for Time Series Forecasting 论文链接&#xff1a;https://arxiv.org/abs/2305.12095 代码链接&#xff1a;https://github.com/wxie9/CARD 前言 Transformer取得成功的一个关键因素是通道独立&#…

SpringBoot框架下旅游管理系统的创新设计与实现

第二章 相关技术简介 2.1 JAVA技术 本次系统开发采用的是面向对象的Java作为软件编程语言&#xff0c;Java表面上很像C&#xff0c;但是Java仅仅是继承了C的某些优点&#xff0c;程序员很少使用的C语言的特征在Java设计中去掉了。Java编程语言并没有什么结构&#xff0c;它把数…

Arduino UNO R3自学笔记21 之 Arduino电机的闭环控制(PID)

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;上篇写了电机速度测定&#xff0c;这篇主要是讲测定出的速度用于反馈&#xff0c;使得实际速度快速响应到需要的速度。 1.控制系统介绍 分2大类&#x…

​​​​​​​如何使用Immersity AI将图片转换成3D效果视频

随着技术的进步&#xff0c;图片处理变得越来越强大和直观。借助Immersity AI这样的工具&#xff0c;我们现在可以轻松地将平面图片转换成3D效果视频。以下是如何使用Immersity AI进行这一转换的详细步骤。 第一步&#xff1a;访问Immersity AI网站 首先&#xff0c;打开你的…

Spring开发最佳实践之跨域处理

1. 跨域处理 1.1 异常现象 1.2 异常原因分析 跨源资源共享的官方定义如下&#xff1a; 跨源资源共享&#xff08;CORS&#xff0c;Cross Origin Resource Sharing。或通俗地译为跨域资源共享&#xff09;是一种基于 HTTP 头的机制&#xff0c;该机制通过允许服务器标示除了它自…

在mac中通过ip连接打印机并实现双面打印

首先需要找到电脑自带的打印。添加打印机。 填写好打印机的ip地址&#xff0c;然后添加。 填写好ip地址后&#xff0c;直接添加就行 添加完打印机后其实就可以打印了。但是有些功能可能实现不了&#xff0c;比如说双面打印。为了实现双面打印的功能&#xff0c;需要再进行设置…

Vue83 引入elementUI

笔记 安装插件 安装按需引入插件 代码 ### App.vue <template><div><button>原生的按钮</button><input type"text"><atguigu-row><atguigu-button>默认按钮</atguigu-button><atguigu-button type"pr…

Arduino UNO R3自学笔记22 之 Arduino基础篇学习总结

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;目前将Arduino的大多数基础内容学习了&#xff0c;做个总结。 1.编程语言 学习单片机&#xff0c;在面向单片机编程时&#xff0c;语言是最基础的&#…

localhost与127.0.0.1傻傻分不清楚,区别详解来了

对应程序员来说&#xff0c;localhost和127.0.0.1经常使用&#xff0c;但是却又傻傻分不清楚&#xff01;尽管它们在实际应用中经常互换使用&#xff0c;但它们之间确实存在一些细微的差别。本文我将详细探讨localhost与127.0.0.1的区别。 一、定义与解析方式 localhost 定…

SSM外卖点餐软件APP-计算机毕业设计源码30768

目 录 摘要 1 绪论 1.1 研究背景 1.2研究目的 1.3论文结构与章节安排 2 外卖点餐软件APP系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能…

旅游管理自动化:SpringBoot系统设计与实现

第二章 相关技术简介 2.1 JAVA技术 本次系统开发采用的是面向对象的Java作为软件编程语言&#xff0c;Java表面上很像C&#xff0c;但是Java仅仅是继承了C的某些优点&#xff0c;程序员很少使用的C语言的特征在Java设计中去掉了。Java编程语言并没有什么结构&#xff0c;它把数…

【爬虫】网站反debugger、内存爆破以及网站限制开发者工具

【爬虫】网站反debugger、内存爆破以及网站直接限制开发者工具 声明&#xff1a;本文中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0…

就业市场需求分析:基于前程无忧岗位数据分析

背景介绍&#xff1a;在前程无忧网站&#xff0c;以"数据分析师""武汉"作为搜索关键词&#xff0c;爬取50页岗位数据合计980条。以该数据为基础&#xff0c;从岗位搜索匹配度、HR活跃度、不同区域/行业/企业的岗位数量和薪资分布等角度进行分析。 1、原始数…

电商平台数据批量获取自动抓取的实现方法分享(API)

电商竞争白热化的今天&#xff0c;一个电商卖家往往会在多个平台铺设店铺来获取更多的客户。有没有什么高效的电商数据采集工具可以整合多个店铺的数据呢。 在这里给大家推荐使用API&#xff0c;完成主流电商平台数据采集、ERP、OA等业务系统数据采集、行业数据采集。 API取数…

UE5 武器IK瞄准系统

创建空项目 创建基础蓝图类My_GameMode,My_HUD,My_PlayChar,My_PlayController 项目设置地图模式 近裁平面 0.1 My_PlayChar蓝图中添加摄像机,角色骨骼网格体,武器骨骼网格体 编辑角色骨骼,预览控制器使用特定动画,动画选择ANM_ark-47-Idle hand_r 添加插槽WeaponMes…

​​​​​​​如何使用Hugging Face上的FacePoke工具调整照片中人的头部位置

在照片处理中&#xff0c;调整人物的头部位置可以为你带来创意无限的效果。借助Hugging Face上的FacePoke工具&#xff0c;这一操作变得前所未有的简单和高效。以下是详细步骤&#xff0c;教你如何使用FacePoke来调整照片中人的头部位置。 第一步&#xff1a;访问FacePoke工具…

Matlab|考虑阶梯式碳交易机制与电制氢的综合能源系统热电优化

目录 1 主要内容 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序复现《考虑阶梯式碳交易机制与电制氢的综合能源系统热电优化》&#xff0c;主要内容&#xff1a;“双碳”背景下&#xff0c;为提高能源利用率&#xff0c;优化设备的运行灵活性&#xff0c;进一步降低…