看到这篇帖子,其实数据结构真实的存在于身边。模仿上文,弄个Java版的。
1、重写hashcode,最好(一定)要重写equals。即hashcode相同则equals返回true
import java.util.HashMap;
public class TestWorstHashMap {
private static final int testSize = 100000;
private static final int specialId = 1;
private static final String specialName = "1";
/************************************ test1 **************************************/
class BadModel {
private int id;
private String name;
public BadModel(int id, String name) {
this.id = id;
this.name = name;
}
/**
* @see java.util.HashMap.put(K, V)
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof BadModel) {
return id == ((BadModel) obj).id && name.equals(((BadModel) obj).name);
}
return false;
}
@Override
public int hashCode() {
return id;
}
}
void testBadModel1() {
HashMap<BadModel, Object> map = new HashMap<BadModel, Object>();
long start = System.currentTimeMillis();
for (int i = 0; i < testSize; i++) {
BadModel model = new BadModel(specialId, "Name" + i);
map.put(model, "test" + i);
}
long end = System.currentTimeMillis();
System.out.println("BadModel the same id : " + (end - start));
}
void testBadModel2() {
HashMap<BadModel, Object> map = new HashMap<BadModel, Object>();
long start = System.currentTimeMillis();
for (int i = 0; i < testSize; i++) {
BadModel model = new BadModel(specialId, specialName);
map.put(model, "test" + i);
}
long end = System.currentTimeMillis();
System.out.println("BadModel the same id & name : " + (end - start));
}
/************************************ test2 **************************************/
class GoodModel {
private int id;
private String name;
public GoodModel(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof GoodModel) {
return id == ((GoodModel) obj).id && name.equals(((GoodModel) obj).name);
}
return false;
}
@Override
public int hashCode() {
return id + name.hashCode();
}
}
void testGoodModel() {
HashMap<GoodModel, Object> map = new HashMap<GoodModel, Object>();
long start = System.currentTimeMillis();
for (int i = 0; i < testSize; i++) {
GoodModel model = new GoodModel(specialId, "Name" + i);
map.put(model, "test" + i);
}
long end = System.currentTimeMillis();
System.out.println("GoodModel the same id : " + (end - start));
}
public static void main(String[] args) {
TestWorstHashMap test = new TestWorstHashMap();
test.testBadModel1();
test.testBadModel2();
test.testGoodModel();
}
}
测试结果:
BadModel the same id : 141454
BadModel the same id & name : 28
GoodModel the same id : 92
1、 table为一个Entry[] 数组。
2、以<key, value>的形式存储为一个Entry。
3、相同hashcode的key,以链头插入的方式保存。
从上图看出,我们造的数据都保存在table的一个Entry的链表中了。
- 大小: 81.2 KB
分享到:
相关推荐
哈希函数确保了键的快速查找,但可能会出现哈希冲突,HashMap通过链地址法解决这个问题,即将相同哈希值的键值对链接在一起形成链表。 下面是一些关于HashMap的基本操作: 1. **初始化**:可以无参数或指定容量和...
例如,通过以下代码创建了一个HashMap实例,并向其中添加了三个元素: ```java HashMap, Double> map = new HashMap, Double>(); map.put("key1", 80.0); map.put("key2", 89.0); map.put("key3", 78.2); ``` 在...
本文将深入解析HashMap的扩容机制,并通过实例代码来展示这一过程。 HashMap扩容的主要原因是避免过多的哈希冲突,从而保持查询性能。默认情况下,HashMap的初始容量为16,加载因子设置为0.75。这意味着当HashMap中...
4. **集合框架**:为了存储和管理数据,Java集合框架(如ArrayList、LinkedList、HashSet、HashMap等)是非常重要的。理解它们之间的区别和使用场景是必要的。 5. **Servlet与JSP**:如果这个博客实例涉及到Web开发...
这个实例教程将深入解析HashMap的遍历方法及其源代码,帮助开发者更好地理解和使用HashMap。以下是对这个主题的详细讲解: 1. **HashMap概述**: HashMap是一个基于哈希表实现的键值对数据结构,提供了快速的存取...
接着,书中可能详细介绍了Java集合框架,包括ArrayList、LinkedList、HashMap、HashSet等常见容器的使用,以及泛型、迭代器等概念,这些都是在实际项目中频繁使用的工具。理解并熟练运用这些集合框架能有效提高代码...
通过源码,你可以学习它们的内部结构和算法,比如`HashMap`的哈希函数和链表解决冲突的方式。 3. **多线程编程**:`java.util.concurrent`包提供了许多高级并发工具,如`ExecutorService`、`Semaphore`、`Future`等...
HashMap是Java编程语言中常用的集合类之一,它提供了一种以键值对形式存储数据的方式。HashMap基于哈希表的数据结构实现,具有快速查找、插入和删除的特点。本文将详细介绍HashMap的基本概念、构造函数、数据结构...
2. **集合框架**:Java集合框架如ArrayList、LinkedList、HashMap等用于存储和管理大量学生信息,提供高效的数据操作。 3. **Swing或JavaFX**:作为用户界面开发库,用于创建图形化用户界面(GUI),如添加、删除、...
Java 8之后,HashMap在冲突较多时会将链表转化为红黑树,进一步优化查找效率。 4. **线程安全**:HashMap本身是非线程安全的,因此如果要在多线程环境下使用,需要额外的同步控制,或者使用并发集合如`...
在示例代码中,我们创建了三个Map实例:HashMap、Hashtable和TreeMap。HashMap展示了无序的特性,而TreeMap则按顺序打印键值对。Hashtable是HashMap的线程安全版本,但在Java 5之后,推荐使用并发集合如...
在Java编程语言中,`HashMap`、`TreeMap`和`LinkedHashMap`都是`java.util.Map`接口的实现,它们提供了不同的数据存储和访问策略。本文将深入探讨这三种数据结构的特点、工作原理以及适用场景。 1. **HashMap** `...
HashMap内部维护了一个Entry数组,每个Entry是一个键值对(key-value)的实例。每个Entry不仅持有键值对,还包含一个next引用,用于链接相同哈希值的其他Entry,形成链表。当多个键具有相同的哈希值时,它们会被...
6. **集合框架**:Java集合框架包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。理解它们的特点和使用场景对于存储和管理数据至关重要。 7. **IO流**:输入/输出流是Java...
在Java编程语言中,HashMap是Java集合框架的重要组成部分,它提供了高效的存储和检索对象的能力,实现了"键-值"对的映射。本教程将深入分析2022年Java中HashMap的内部机制、关键属性和操作。 HashMap的核心属性包括...
如果多个线程同时访问一个 `HashMap` 实例,而其中至少一个线程修改了该 `HashMap` 结构,则必须保持外部同步。 - **HashTable**:是线程安全的,即同步的。它的所有公共方法都是 `synchronized` 的,这意味着可以...
HashMap是Java编程语言中最常用的集合类之一,尤其在面试中,HashMap的相关知识是考察...这套学习资料应该包含了HashMap的实例分析、源码解读、常见面试题以及实战演练等内容,确保你全面掌握这一核心Java数据结构。
在Java中,HashMap内部由一个数组和一组链表组成,用于处理哈希冲突。然而,由于本问题的描述中并没有提供完整的MyHashMap实现,我们将基于HashMap的一般工作原理进行解释。 HashMap的主要功能包括存储键值对、查找...
HashMap是Java编程语言中的一种重要数据结构,它是`java.util.HashMap`类的实例,实现了`Map`接口。HashMap主要用于存储键值对,其中键是唯一的,且键和值之间通过哈希函数建立关联,使得在理想情况下,查询、插入和...
哈希映射(HashMap)是Java编程语言中广泛使用的数据结构之一,主要提供键值对的存储和查找功能。...在实际编程中,应充分考虑哈希冲突的处理、负载因子的选择以及预估容量的设定,以提高HashMap的使用效率。