比较两个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);
*/
}
}
分享到:
相关推荐
HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有...
当两个或更多的键的哈希值相同时,就会发生哈希冲突,此时,这些键值对就会存储在链表中。 在JDK1.8之前,当链表长度大于阈值(默认为8)时,链表会被转化为红黑树,以减少搜索时间。而在JDK1.8之后,这个阈值被改...
之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。 HashMap实现了Map...
HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有...
要求:从键盘输入5本书的名称、单价、购买数量,将这些信息存入一个HashMap,然后将该HashMap作为参数调用方法getSum(HashMap books),该方法用于计算书的总价并返回。【说明:键盘输入可以使用Scanner类】 使用两...
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
每个红色结点的两个子结点一定都是黑色。 任意一结点到每个叶子结点的路径都包含数量相同的黑结点。 每当对红黑树结点进行增删改的时候可能会破坏红黑树的性质,因此我们需要维持这5条性质。有三种方式:变色、...
· 如果两个key有相同的hash值,他们会被放在table数组的同一个桶里面。 · key的equals()方法用来确保key的唯一性。 · value对象的equals()和hashcode()方法根本一点用也没有。 HashMap是基于哈希表实现的,每...
同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。 看一下一个极端的类: Class ...
使用(数据库脚本包含在内)HashMap+HttpSessionListener, 对于非正常退出 可在 浏览器 unload 时 使用 AJAX 实现(简单的很,大家自己写吧)NOTE:解压缩后 文件夹内还有两个压缩包,压缩包内文件名是相同的 ...
从这两个核心方法(get/put)可以看出 1.8 中对大链表做了优化,修改为红黑树之后查询效率直接提高到了 O(logn)。 但是 HashMap 原有的问题也都存在,比如在并发场景下使用时容易出现死循环。 final HashMap, ...
要求:从键盘输入5本书的名称、单价、购买数量,将这些信息存入一个HashMap,然后将该HashMap作为参数调用方法getSum(HashMap books),该方法用于计算书的总价并返回。【说明:键盘输入可以使用Scanner类】 2. ...
两个循环,第一个循环抛出列表,第二个循环检查每个值是否正确。 时间复杂度:O(n2) 2. HashMap 构建hashmap(K:value,V:index),对每个元素,检查索引是否为target-i。 如果是,则获取相应的值。 时间复杂度:(n) 3....
判断一个文件或目录是否存在 如何读写文件 7.Java多态的实现(继承、重载、覆盖) 8.编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和...
同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。所以当你是用equals方法判断对象的内容...
1.5.6. 输入两个整数 n 和 m,从数列 1,2,3.......n 中 随意取几个数 ....... 116 1.5.7. 输入一个表示整数的字符串,把该字符串转换成整数并输出.............. 118 1.5.8. 给出一个数列,找出其中最长的单调...
双指针,先快排形成有序,遍历一次选定第一个数,然后头尾指针遍历第一数右边的数,三数结果<0>0则往左移,避免重复需保证相邻的两个数不相等 p17 电话号码的字母组合 用一个二维数组作为字典代表每个数字对应的字母...
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什么作用? java 中操作字符串都有哪些类?它们之间有什么区别? 如何将字符串反转? String 类的常用方法都有那些? 接口和抽象...
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里...
18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 9 19、是否可以继承String 类? 9 20、以下二条语句返回值为true 的有: 10 21、当一个对象被当作参数传递到一个方法后,此方法可...