25,980
社区成员
发帖
与我相关
我的任务
分享
[/quote]
hashmap对处理hash冲突是通过链表处理的
k-v的v实际上存的不是一个单独的object,而是一个链表,链表里面存的是k-v,如果链表长度为1,直接返回v,如果有多个,则遍历链表,当k和请求的k一致时,返回v
所以只会影响性能,值不会被覆盖
1.线程安全,不论是读写锁还是concurrentHashMap都能解决这个问题,而且性能很高
2.对操作系统不太了解,不太清楚这个问题
package main;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Map<HashTestObject,HashTestObject> hash = new HashMap<>();
HashTestObject o1 = new HashTestObject(1);
HashTestObject o2 = new HashTestObject(2);
hash.put(o1, o1);
hash.put(o2, o2);
System.out.println("=====key,value的hashcode跟equals都返回任意两对象相等======");
System.out.println("o1=" + hash.get(o1).data);
System.out.println("o2=" + hash.get(o2).data);
Map<HashTestObject,String> hash2 = new HashMap<>();
hash2.put(o1, "o1");
hash2.put(o2, "o2");
System.out.println("=====key的hashcode跟equals都返回任意两key对象相等======");
System.out.println("o1=" + hash2.get(o1));
System.out.println("o2=" + hash2.get(o2));
}
static class HashTestObject{
public int data;
public HashTestObject(int data){
this.data = data;
}
public int hashCode(){
return 1;
}
public boolean equals(Object obj){
return true;
}
// public boolean equals(HashTestObject obj){
// if(obj == null)
// return false;
// if(obj == this)
// return true;
//
// if(obj instanceof HashTestObject){
// obj = (HashTestObject)obj;
// if(obj.data == data)
// return true;
// }
// return false;
// }
}
}
结果:
=====key,value的hashcode跟equals都返回任意两对象相等======
o1=2
o2=2
=====key的hashcode跟equals都返回任意两key对象相等======
o1=o2
o2=o2
[/quote]
这里的结果写错了:
=====key,value的hashcode跟equals都返回任意两对象相等======
o1=2
o2=2
=====key的hashcode跟equals都返回任意两key对象相等======
o1=o1
o2=o2
package main;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Map<HashTestObject,HashTestObject> hash = new HashMap<>();
HashTestObject o1 = new HashTestObject(1);
HashTestObject o2 = new HashTestObject(2);
hash.put(o1, o1);
hash.put(o2, o2);
System.out.println("o1=" + hash.get(o1).data);
System.out.println("o2=" + hash.get(o2).data);
}
static class HashTestObject{
public int data;
public HashTestObject(int data){
this.data = data;
}
public int hashCode(){
return 1;
}
// public boolean equals(Object obj){
// return true;
// }
public boolean equals(Object obj){
if(obj == null)
return false;
if(obj == this)
return true;
if(obj instanceof HashTestObject){
HashTestObject tmp = (HashTestObject)obj;
if(tmp.data == data)
return true;
}
return false;
}
}
}
结果:
o1=1
o2=2
package main;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Map<HashTestObject,HashTestObject> hash = new HashMap<>();
HashTestObject o1 = new HashTestObject(1);
HashTestObject o2 = new HashTestObject(2);
hash.put(o1, o1);
hash.put(o2, o2);
System.out.println("=====key,value的hashcode跟equals都返回任意两对象相等======");
System.out.println("o1=" + hash.get(o1).data);
System.out.println("o2=" + hash.get(o2).data);
Map<HashTestObject,String> hash2 = new HashMap<>();
hash2.put(o1, "o1");
hash2.put(o2, "o2");
System.out.println("=====key的hashcode跟equals都返回任意两key对象相等======");
System.out.println("o1=" + hash2.get(o1));
System.out.println("o2=" + hash2.get(o2));
}
static class HashTestObject{
public int data;
public HashTestObject(int data){
this.data = data;
}
public int hashCode(){
return 1;
}
public boolean equals(Object obj){
return true;
}
// public boolean equals(HashTestObject obj){
// if(obj == null)
// return false;
// if(obj == this)
// return true;
//
// if(obj instanceof HashTestObject){
// obj = (HashTestObject)obj;
// if(obj.data == data)
// return true;
// }
// return false;
// }
}
}
结果:
=====key,value的hashcode跟equals都返回任意两对象相等======
o1=2
o2=2
=====key的hashcode跟equals都返回任意两key对象相等======
o1=o2
o2=o2

