首页 > 编程语言 >java面试题: HashMap、HashSet 和 HashTable 的区别

java面试题: HashMap、HashSet 和 HashTable 的区别

时间:2024-06-11 23:58:00浏览次数:30  
标签:map 面试题 java HashMap HashSet 元素 Hashtable null

 

HashMap 常用方法

 

HashMap 是一个基于哈希表的 Map 接口的实现。它允许使用 null 值和 null 键。

 

java

复制

// 创建一个HashMap

HashMap<KeyType, ValueType> map = new HashMap<>();

 

// 添加元素

map.put(key, value);

 

// 获取元素

ValueType value = map.get(key);

 

// 删除元素

map.remove(key);

 

// 替换元素

map.replace(key, newValue);

 

// 如果指定的键尚未与值关联(或其值为null),则将其与该值关联

map.putIfAbsent(key, value);

 

// 判断键/值是否存在

boolean containsKey = map.containsKey(key);

boolean containsValue = map.containsValue(value);

 

// 获取集合

Set<KeyType> keySet = map.keySet();

Collection<ValueType> values = map.values();

Set<Map.Entry<KeyType, ValueType>> entrySet = map.entrySet();

 

// 遍历Map

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {

    KeyType key = entry.getKey();

    ValueType value = entry.getValue();

    // ...

}

 

// 其他常用方法

int size = map.size();

boolean isEmpty = map.isEmpty();

map.clear(); // 清空HashMap

 

HashSet 常用方法

 

HashSet 是一个不允许出现重复元素的集合。它基于 HashMap 实现,因此不包含重复元素的特性是由 HashMap 的键的唯一性保证的。

 

java

复制

// 创建一个HashSet

HashSet<ElementType> set = new HashSet<>();

 

// 添加元素

set.add(element);

 

// 删除元素

set.remove(element);

 

// 判断元素是否存在

boolean contains = set.contains(element);

 

// 遍历HashSet

for (ElementType element : set) {

    // ...

}

 

// 其他常用方法

int size = set.size();

boolean isEmpty = set.isEmpty();

set.clear(); // 清空HashSet

 

Hashtable 常用方法(不推荐使用)

 

Hashtable 是一个同步的 Map 接口的实现,因此是线程安全的。然而,由于同步的开销,它通常比 HashMap 慢。在现代Java开发中,Hashtable 很少被使用,因为它已经被 ConcurrentHashMap 所取代,后者提供了更好的并发性能。

 

java

复制

// 创建一个Hashtable

Hashtable<KeyType, ValueType> table = new Hashtable<>();

 

// 大部分方法与HashMap相同,但由于Hashtable是同步的,

// 所以其方法调用可能会有额外的性能开销。

 

// 示例:添加元素

table.put(key, value);

 

// 示例:获取元素

ValueType value = table.get(key);

 

// ... 其余方法与HashMap类似

 

 

注意:

 

由于 Hashtable 是同步的,因此在多线程环境下,如果你不需要同步,使用 HashMap 会更加高效。如果你需要并发安全的 Map,建议使用 ConcurrentHashMap。

HashMap 和 HashSet 的迭代顺序并不是基于插入顺序的,而是基于哈希码的。如果需要有序的集合,请考虑使用 LinkedHashMap 或 LinkedHashSet。

在使用集合时,要注意 null 值的处理。HashMap 允许使用 null 键和 null 值,但 HashSet 不允许 null 元素(因为 null 键在 HashMap 中是允许的,但 HashSet 是基于 HashMap 的键集合实现的)。而 Hashtable 也不允许使用 null 键或 null 值。

 1. 同步性(Synchronization):

 • HashMap: 不是同步的,不保证线程安全。多个线程同时访问和修改 HashMap 可能导致不确定的行为。典型情景: 实现一个缓存机制,需要高效地存储键值对。

 • HashSet: 与 HashMap 一样,也不是同步的。 典型情景: 需要存储一组唯一的元素。HashSet 确保元素的唯一性,并且对于基本操作(如添加、删除和包含)具有常数时间性能。

 • HashTable: 是同步的,对其操作进行了同步处理,可以用于多线程环境。

但是现实生活中需要线程安全的情况下我们较多使用ConcurrentHashmap。

 

 2. Null 元素:

 • HashMap: 允许一个键为 null,允许多个值为 null。

 • HashSet: 允许一个元素为 null。

 • HashTable: 不允许键或值为 null。

 

 3. 继承关系:

 • HashMap: 继承自 AbstractMap 类,实现了 Map 接口。

 • HashSet: 实现了 Set 接口,底层通过 HashMap 实现。

 • HashTable: 继承自 Dictionary 类,实现了 Map 接口。

 

HashSet、LinkedHashSet 和 TreeSet 的区别:

 

 1. 顺序性:

 • HashSet: 不保证元素的顺序,可能会发生变化。

 • LinkedHashSet: 保持元素插入的顺序,迭代顺序与插入顺序一致。

 • TreeSet: 保持元素的自然顺序或者通过构造函数提供的 Comparator 进行排序。

 2. 底层数据结构:

 • HashSet: 基于 HashMap 实现,使用 HashMap 的键存储元素。

 • LinkedHashSet: 基于 LinkedHashMap 实现,使用 LinkedHashMap 的键存储元素。

 • TreeSet: 基于 TreeMap 实现,使用 TreeMap 的键存储元素

标签:map,面试题,java,HashMap,HashSet,元素,Hashtable,null
From: https://blog.csdn.net/m0_63739234/article/details/139571284

相关文章

  • 【java攻城狮的一生:第一站—JDK安装】
    文章目录概要下载官方网址百度网盘(我这里只提供了我用到的)安装验证结果概要没啥概要,就是下载->安装->验证结果......
  • JavaEE
    JavaEE架构程序设计实验作业实验名称:一、实验项目功能使用Struts2+Hibernate+Spring结构完成了完整的学生信息管理系统,其中包括成绩管理、学生管理、课程管理、专业管理、班级管理。   二、实验过程使用Struts2+Hibernate+Spring结构完成了完整的学生信息管理......
  • 什么是Java泛型,它的优点是什么?
    什么是Java泛型?Java泛型(Generics)是一种使得类、接口和方法能够操作任意类型(类型参数化)的机制。它允许我们在编写代码时使用类型参数,从而使代码更加通用和灵活。泛型的主要目的是在编译时提供类型安全检查,并消除类型转换的需要。在Java5之前,集合类(如List、Set、Map)只能存储O......
  • 力控算法每日一练:209. 长度最小的子数组(java)
    给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。classSolution{publicintminSubArrayL......
  • 【练习代码】6.11 java学习记录:继承与多态(实例:媒体资料库的设计)
    设计一个媒体资料库,能存入不同类别的媒体资料,例如CD与DVD,并且能完成添加与列表等操作,需要些什么?最基础的想法一个代表整体库的DataBase类,内部的属性包括CD和DVD的Arraylist,对应操作通过定义自己的方法来实现,部分代码如下:publicclassDatabase{privateArrayList<CD>......
  • JAVA开发 PDF文件生成表格,表格根据内容自动调整高度
    1、展示效果2、相关功能实现JAVA开发使用ApachePDFBox库生成PDF文件,绘制表格3、实现代码importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.pdmodel.PDPage;importorg.apache.pdfbox.pdmodel.PDPageContentStream;importorg.apache.pdfbo......
  • 2024最强Java面试八股
    Java基础八股文(背诵版)Java语言具有哪些特点?Java为纯面向对象的语言。它能够直接反应现实生活中的对象。具有平台无关性。Java利用Java虚拟机运行字节码,无论是在Windows、Linux还是MacOS等其它平台对Java程序进行编译,编译后的程序可在其它平台运行。Java为解释型......
  • 使用 Flink SQL 读取本地csv文件(Java实现)
    data.csv内容:1,Tom,152,Lily,133,Mike,214,John,205,Emma,186,Sophia,197,David,228,James,169,Olivia,1710,Robert,2311,Emily,1412,Daniel,2513,Amelia,24代码:packagecom.auguigu.demo;importorg.apache.flink.streaming.api.datastream.DataStream;impo......
  • 线程介绍及其Java如何用Thread 类创建线程和操作线程方法
    目录一、进程和线程1.1进程特征2.2线程特征2.3区别二、利用Thread类创建线程2.1通过创建Thread子类,重写run()方法2.2通过实现Runnable接口,重写run()方法2.3.Callable接口+FutureTask创建线程2.3三种方法区别1.通过创建Thread子类,重写run()方法2.通过实......
  • 基本数据类型 String,null 和 undefined,运算符,流程控制,JavaScript之数组,数组常用
    Ⅰ基本数据类型String【一】String类型String类型就是字符串类型【二】定义变量【1】常规变量var变量名="变量值";//一般用这种var变量名='变量值';不支持三引号【2】可以先声明不赋值先用varb;再对变量b赋值varb='6';【三】字符串的格式化输出语法......