看到这篇帖子,其实数据结构真实的存在于身边。模仿上文,弄个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实例hashmap实例hashmap实例
java hashmap 扩容因子为什么是0.75,官方给出的解释
Java HashMap类详解收藏的资料,供大家一起分享
主要介绍了java HashMap详解及实例代码的相关资料,需要的朋友可以参考下
详细分析HashMap的存储原理,key值的hash地址以及扩容
Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序...
HashMap是android中一种小型存储类,写了一个简单的实例,希望能对有兴趣的朋友有用。
提供了20道高难度的Java HashMap面试题及详细答案解析,涵盖了HashMap的内部实现原理、哈希冲突处理、扩容机制、线程安全性等方面的知识点,适合准备Java面试的开发者参考。
Java集合中HashMap的简单使用,比较详细,供大家分享
在这里写了关于如何在web servie应用HashMap的实例,哪位需要可以来这里下载
主要介绍了java HashMap扩容详解及实例代码的相关资料,需要的朋友可以参考下
NULL 博文链接:https://brucexx.iteye.com/blog/491449
疫苗:Java HashMap的死循环
用数据结构的思想实现java中的类hashmap
java中HashMap详解.pdf
结合Java的HashMap中的一些优点,改进了C++ 的hash_map。 详细说明见我的博客:http://blog.csdn.net/mdj67887500/article/details/6907702
哈希简单的说就是对变量/对象的属性应用某种算法后得到的一个唯一的串,用这个串来确 定变量/对象的唯一性。一个正确的哈希函数必须遵守这个准则。
简单地说,在keyset方法返回的set上做修改会改变原来hashmap,这也许不是你想要的,于是形成一个隐藏的bug
HashMap是Java中非常常用的一种数据结构,它实现了Map接口,用于存储键值对。HashMap内部使用哈希表来实现,通过将键映射到哈希表中的一个位置来快速查找和插入元素。 HashMap的主要特点是: 非线程安全:如果多个...