赶紧收藏!2024 年最常见 100道 Java 基础面试题(十一)

上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(十)-CSDN博客

二十一、HashMapHashtable有什么区别?

HashMapHashtable都是Java中实现散列表(hash table)的类,它们用于存储键值对映射。尽管它们的实现细节相似,但是存在一些关键的区别:

  1. 同步性

    • Hashtable是线程安全的,它的所有方法都是同步的,这意味着在多线程环境下,Hashtable能够保证数据的一致性。
    • HashMap在Java 7及以前的版本中不是线程安全的。从Java 8开始,虽然HashMap本身不是线程安全的,但是它提供了一些方法(如computeIfAbsent())来支持并发操作。通常,为了线程安全,可以使用ConcurrentHashMap作为替代。
  2. null键和值

    • Hashtable不允许使用null作为键(key)或值(value)。
    • HashMap允许一个null键和多个null值。
  3. 继承

    • Hashtable继承自Dictionary类,这是一个古老的类,现在已经不推荐使用。
    • HashMap实现了Map接口,并且可以作为Map接口的实现来使用。
  4. 性能

    • 由于同步的开销,Hashtable在单线程环境下的性能通常不如HashMap
    • 在单线程环境下,如果不需要线程安全的集合,推荐使用HashMap。如果需要线程安全的集合,可以考虑使用Collections.synchronizedMap()包装一个HashMap,或者使用ConcurrentHashMap
  5. 遍历方式

    • HashtableHashMap都允许使用迭代器来遍历它们的键和值。不过,由于Hashtable较老,它的遍历方式可能与HashMap略有不同。
  6. 遗留代码

    • Hashtable是一个遗留类,它的存在主要是为了兼容旧的代码。新的代码通常推荐使用HashMapConcurrentHashMap

示例代码

import java.util.HashMap;
import java.util.Hashtable;

public class HashMapVsHashtable {
    public static void main(String[] args) {
        // HashMap示例
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put(null, "nullValue"); // 可以存储null键
        System.out.println(hashMap.get(null)); // 输出"nullValue"

        // Hashtable示例
        Hashtable<String, String> hashtable = new Hashtable<>();
        // hashtable.put(null, "nullValue"); // 这将抛出NullPointerException
        System.out.println(hashtable.get("key")); // 输出null,因为没有为"key"设置值
    }
}

总结

  • HashMapHashtable在功能上相似,但是它们在同步性、对null值的支持、性能和使用场景上有所不同。
  • 在大多数情况下,应该优先使用HashMap,并且如果需要线程安全的集合,则使用ConcurrentHashMap或通过Collections.synchronizedMap()包装的HashMap

二十二、如何决定使用HashMap还是TreeMap

HashMapTreeMap都是Java中实现Map接口的类,它们都用于存储键值对映射,但是它们在内部实现、性能特性和使用场景上有所不同:

  1. 内部实现

    • HashMap是基于哈希表的数据结构,它使用哈希函数将键映射为数组的索引,从而访问和存储数据。
    • TreeMap是基于红黑树的数据结构,它将键值对按照键的自然顺序或提供的Comparator顺序进行排序。
  2. 性能特性

    • HashMap提供更快的访问速度,因为哈希表可以提供常数时间的查找、插入和删除操作(平均情况下)。
    • TreeMap提供有顺序的数据访问,但是查找、插入和删除操作的时间复杂度为O(log n),比HashMap慢。
  3. 键的顺序

    • HashMap不保证键的顺序,键的存储和迭代顺序可能取决于哈希函数的实现。
    • TreeMap保证了键的顺序,要么是自然排序顺序,要么是构造时提供的Comparator顺序。
  4. 空键(null key)和空值(null value)

    • HashMap允许一个空键和多个空值。
    • TreeMap不允许空键,但可以有一个空值。
  5. 使用场景

    • 当需要快速查找、插入和删除操作,且不关心键的顺序时,应该使用HashMap
    • 当需要按键的顺序遍历键值对,或者需要保持键的排序时,应该使用TreeMap
  6. 线程安全性

    • 两者都不是线程安全的。如果需要线程安全的实现,可以使用Collections.synchronizedMap()来包装HashMapTreeMap,或者使用ConcurrentHashMap

示例代码

import java.util.HashMap;
import java.util.TreeMap;

public class HashMapVsTreeMap {
    public static void main(String[] args) {
        // HashMap示例
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1, "Java");
        hashMap.put(2, "Python");
        hashMap.put(null, "Null Key"); // HashMap允许null键和null值

        // TreeMap示例
        TreeMap<Integer, String> treeMap = new TreeMap<>();
        treeMap.put(1, "Java");
        treeMap.put(2, "Python");
        // treeMap.put(null, "Null Key"); // TreeMap不允许null键,但允许null值

        // HashMap的迭代顺序可能依赖于哈希函数的实现,而TreeMap的迭代顺序是按键的自然顺序
    }
}

总结

  • 选择HashMap还是TreeMap取决于应用场景的需求。如果需要快速的搜索且键的顺序不重要,则使用HashMap
  • 如果需要按键的自然顺序或特定顺序遍历键值对,则使用TreeMap
  • 考虑线程安全性时,可以使用ConcurrentHashMap或通过Collections.synchronizedMap()包装的Map实现。
  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值