java中的hashmap、hashset、hashcode是什么,有什么区别与用法
时间: 2025-03-15 13:20:28 浏览: 24
在Java中,HashMap
、HashSet
和 hashCode()
都与哈希相关的数据结构和技术有关。它们各自有不同的用途和特点,下面我们逐一进行讲解。
1. HashMap
定义:
HashMap<K,V>
是基于哈希表实现的一种集合框架类,它允许我们存储键值对 (key-value
) 数据,并通过键快速访问对应的值。内部会利用键对象的 hashCode()
方法生成哈希码,再结合哈希函数定位到相应的桶(bucket)上。
特性:
- 键不允许重复;如果尝试放入相同键的新值,则旧值会被覆盖。
- 允许有一个 null 键以及任意数量的 null 值。
典型用法:
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 25);
map.put("Bob", 30);
int ageOfAlice = map.get("Alice"); // 获取 Alice 对应年龄
System.out.println(ageOfAlice); // 输出结果:25
2. HashSet
定义:
HashSet<E>
实际是一个不包含重复元素的集合工具类,它是通过包装一个内部的 HashMap
来完成其功能的。换句话说,HashSet 利用了 HashMap 的 key 存储元素的特点——因为 Map 中 keys 是唯一确定不可重叠的性质。
特性:
- 只能保存唯一的元素;
- 内部实际上维护了一个 HashMap,其中所有的 set 成员都作为该 hashmap 的 “keys” 而无所谓的 value (固定为一个哑元 PRESENT)。
典型用法:
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
boolean containsOrange = set.contains("Orange"); // 返回 false
for(String fruit : set){
System.out.println(fruit); // 打印出 "Apple" 或者 "Banana"
}
3. hashCode()
定义:
hashCode()
是 Object 类提供的方法之一,默认返回的是此对象的内存地址的整数值表示形式。当我们创建子类时可以根据自身业务需求对其进行适当的覆写,以便提供更有效的散列计算依据给那些依赖于 hash 表的工作机制比如上面提到过的 HashMap 和 HashSet。
重要原则:
当你决定修改某个类的对象的行为并打算将他们添加进一些采用 equals/hashCode 规约的数据结构里之前,请务必遵守这两点基本准则:
- 相同的内容应该产生相等的 hash code 结果。(即 x.equals(y)==true -> x.hashCode()==y.hashCode())
- 单独考虑某次运行期间的话,对于特定实例来说每次调用它的 hashcode 都得保持一致。
示例 - 自定义 class 的 hashcode 和 equals:
class Person {
String name;
int id;
public Person(String name, int id) {this.name=name; this.id=id;}
@Override
public boolean equals(Object o){ ... }
@Override
public int hashCode(){ return Objects.hash(name,id);}
}
上述例子展示了如何针对自定义类型制定有意义的比较规则及其配套的hash generation logic.
区别总结表格对比
特征/属性 | HashMap | HashSet | HashCode |
---|---|---|---|
主要作用 | 存储 Key-Value 形式的关联数组 | 提供一种只含互异项目的集合作品 | 计算对象引用的特征标识符 |
是否允许多个nulls? | Keys 最多只能有一处null,value不限制 | No duplicates allowed | N/A |
默认初始容量 | 16 | 向内部使用的 HashMap 设定默认容积也是16 | Depends on JVM impl |
相关推荐


















