比较两个HashMap是否相同, 刚看到一个面试题, 就写了下, 如有错误, 还请看到的指正啊. 效果应该是使用entrySet较快
import java.util.HashMap;
import java.util.Map;
public class Test {
public static boolean compareMapByKeySet(Map<String,String> map1,Map<String,String> map2){
if(map1.size()!=map2.size()){
return false;
}
String tmp1;
String tmp2;
boolean b=false;
for(String key:map1.keySet()){
if(map2.containsKey(key)){
tmp1=map1.get(key);
tmp2=map2.get(key);
if(null!=tmp1 && null!=tmp1){
if(tmp1.equals(tmp2)){
b=true;
continue;
}else{
b=false;
break;
}
}else if(null==tmp1 && null==tmp2){
b=true;
continue;
}else{
b=false;
break;
}
}else{
b=false;
break;
}
}
return b;
}
public static boolean compareMapByEntrySet(Map<String,String> map1,Map<String,String> map2){
if(map1.size()!=map2.size()){
return false;
}
String tmp1;
String tmp2;
boolean b=false;
for(Map.Entry<String, String> entry:map1.entrySet()){
if(map2.containsKey(entry.getKey())){
tmp1=entry.getValue();
tmp2=map2.get(entry.getKey());
if(null!=tmp1 && null!=tmp1){ //都不为null
if(tmp1.equals(tmp2)){
b=true;
continue;
}else{
b=false;
break;
}
}else if(null==tmp1 && null==tmp2){ //都为null
b=true;
continue;
}else{
b=false;
break;
}
}else{
b=false;
break;
}
}
return b;
}
public static void main(String[] args) {
Map<String,String> hs1=new HashMap<String,String>();
Map<String,String> hs2=new HashMap<String,String>();
hs1.put("001key","001value");
hs1.put("002key","002value");
hs1.put("003key","003value");
hs1.put("004key","004value");
hs1.put("005key","005value");
hs1.put("006key","006value");
hs1.put("007key","007value");
hs2.put("001key","001value");
hs2.put("002key","002value");
hs2.put("006key","006value");
hs2.put("005key","005value");
hs2.put("007key","007value");
hs2.put("004key",null);
hs2.put("003key","003value");
long st1=System.currentTimeMillis();
boolean b1=compareMapByKeySet(hs1, hs2);
long et1=System.currentTimeMillis();
System.out.println("使用keySet方法比较的结果是: "+b1+", 耗时是: "+(et1-st1));
long st2=System.currentTimeMillis();
boolean b2=compareMapByEntrySet(hs1, hs2);
long et2=System.currentTimeMillis();
System.out.println("使用entrySet方法比较的结果是: "+b2+", 耗时是: "+(et2-st2));
/*
long starttime1=System.currentTimeMillis();
for(String key:hs1.keySet()){
System.out.println(hs1.get(key));
}
long endtime1=System.currentTimeMillis();
System.out.println(endtime1-starttime1);
long starttime2=System.currentTimeMillis();
for(Map.Entry<String, String> entry:hs1.entrySet()){
System.out.println(entry.getValue());
}
long endtime2=System.currentTimeMillis();
System.out.println(endtime2-starttime2);
*/
}
}
分享到:
相关推荐
在HashMap中,equals方法用于比较两个Key是否相等,而hashCode方法用于将Key转换为一个哈希码。如果两个Key具有相同的hashCode,但equals结果不同,那么他们就是不同的Key。 5. Java中HashMap的应用和实现 HashMap...
当两个键的`hashCode()`相同,HashMap会使用`equals()`方法来比较键的等价性,从而确定键值对在链表中的位置。 在Java中,HashMap的初始化涉及两个重要属性:initialCapacity(初始容量)和loadFactor(负载因子)...
在HashMap中,键和值可以是任何类型的对象,只要它们实现了equals()和hashCode()方法,这两个方法用于确定对象的哈希值以及比较两个对象是否相等。 HashMap的存储机制基于以下几个关键点: 1. **哈希函数**:...
7. **键的唯一性**:HashMap中的键是唯一的,这意味着不能有两个相同的键存在。如果尝试插入一个已经存在的键,新的值将会替换旧的值。 8. **迭代器**:HashMap提供了迭代器`keySet()`、`values()`和`entrySet()`,...
假设数组长度为16(2的4次方),如两个键的哈希值分别为8和9,进行按位与操作后结果相同(均为0),这会导致哈希碰撞。因此,8和9会存放在数组的同一位置,形成链表。 然而,如果数组长度为非2的幂,如15(1111二...
HashMap 使用链表来解决哈希冲突的问题,即当两个键的哈希值相同时,HashMap 使用链表来存储这些键值对。 HashMap 的应用场景 1. 缓存机制:HashMap 可以用来实现缓存机制,例如缓存用户信息、缓存查询结果等。 2....
为了确保两个相等的对象在哈希表中可以被正确地映射到相同的“桶”(bucket)里,这些对象必须返回相同的哈希码,这通常通过重写hashCode()和equals()方法来实现。 HashMap在Java中的实现正是基于这样的哈希机制。...
HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,虽然它们实现的接口规范不同,但它们底层的 Hash 存储机制完全一样。甚至 HashSet 本身就采用 HashMap 来实现的。 2. Hash 存储机制 HashMap ...
如果两个键的哈希码相同,HashMap会使用equals()方法来区分它们,这就是所谓的哈希碰撞。为了优化性能,HashMap通常会动态调整其容量,以保持较低的装载因子(load factor),通常是0.75,以减少冲突。 在实际项目...
当两个键的哈希值相同时,即发生了哈希冲突。HashMap通过链表来解决这个问题,每个数组元素(桶)实际上是一个链表,相同的哈希值的键值对会被链接在一起。在Java 8之后,如果链表长度超过一定阈值(通常是8),...
HashMap 的数据结构可以分为两部分:数组和链表。数组是 HashMap 的基本结构,链表是数组元素的具体实现。每个数组元素是一个链表,链表中的每个节点都是一个键值对(key-value)。链表的每个节点都有一个指向下一个...
`equals()`方法会检查两个数组的引用是否指向同一个对象,以及两个数组的长度是否相同,如果这两个条件都满足,再逐个比较每个元素是否相等。但是,这并不适用于找出相同或不同的元素,它只能告诉我们两个数组是否...
4. **处理冲突**:虽然HashMap尽力避免冲突,但在实际应用中,可能存在两个单词哈希码相同的情况。这时,HashMap会使用链表或红黑树来存储这些冲突的键值对,确保查找性能不会显著下降。 5. **查询操作**:用户输入...
在HashMap中,如果两个键的哈希值相同但并不相等,它们会在同一个桶(数组索引位置)形成链表。JDK 8之后,为了优化冲突处理,当链表长度达到一定阈值(8)时,会将链表转换为红黑树,以保持查找、插入和删除的高效...
HashSet的相等判断先比较两个对象hashCode()方法返回的值是否相等,如果不相等就认为两个对象是不相等的,如果两个对象的hashCode相等就继续调用equals()方法进一步判断两个对象是否相等。如果equals()方法返回true...
当两个键通过哈希函数计算出相同的索引时,它们会被链接到同一个链表上,这就是所谓的哈希碰撞。 在Java中,HashMap的工作流程如下: 1. 当我们插入键值对时,先计算键的哈希值,然后使用这个哈希值作为数组的索引...
当两个不同的键被哈希到相同的索引时,会发生哈希冲突。为了处理这种情况,HashMap通常采用开放寻址法或链地址法。在Delphi的实现中,更常见的是链地址法,即将冲突的键值对链接成链表。 1. **HashMap的特性:** -...
8. null键和值:HashMap允许键和值为null,但只有一个键可以为null,如果有两个键为null,后插入的会覆盖前一个。而值可以有多个为null。 9. 其他特性:HashMap还提供了containsKey()、containsValue()、clear()等...
在出现散列冲突时,如两个键的hashCode()值相同,则会检查它们的equals()方法。如果equals()返回true,表明它们是相同的键,新的值将覆盖旧的值。如果equals()返回false,则将这个新的Entry对象放入链表中。 在添加...
`List`接口有两个常见的实现类:`ArrayList`和`LinkedList`。`ArrayList`基于动态增长的数组实现,而`LinkedList`则是由双向链表构成。在`ArrayList`中,查找元素需要从头到尾遍历,时间复杂度为O(n);而`LinkedList...