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

打印 上一主题 下一主题

主题 705|帖子 705|积分 2115

 
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 的键存储元素

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表