`

HashMap HashTable 中equals的实现

    博客分类:
  • J2SE
 
阅读更多

HashMap

    public boolean equals(Object o) {
	if (o == this)
	    return true; //如果句柄地址一致,肯定相等

	if (!(o instanceof Map))
	    return false; //如果不是Map对象肯定falsh
	Map<K,V> m = (Map<K,V>) o;
	if (m.size() != size())
	    return false; //如果长度不一致,肯定falsh

        //如果键值对不一致,falsh
        try {
            Iterator<Entry<K,V>> i = entrySet().iterator();
            while (i.hasNext()) {
                Entry<K,V> e = i.next();
		K key = e.getKey();
                V value = e.getValue();
                if (value == null) {
                    if (!(m.get(key)==null && m.containsKey(key)))
                        return false;
                } else {
                    if (!value.equals(m.get(key)))
                        return false;
                }
            }
        } catch (ClassCastException unused) {
            return false;
        } catch (NullPointerException unused) {
            return false;
        }

	return true;
    }

 HashTable

    public synchronized boolean equals(Object o) {
	if (o == this)
	    return true;

	if (!(o instanceof Map))
	    return false;
	Map<K,V> t = (Map<K,V>) o;
	if (t.size() != size())
	    return false;

        try {
            Iterator<Map.Entry<K,V>> i = entrySet().iterator();
            while (i.hasNext()) {
                Map.Entry<K,V> e = i.next();
                K key = e.getKey();
                V value = e.getValue();
                if (value == null) {
                    if (!(t.get(key)==null && t.containsKey(key)))
                        return false;
                } else {
                    if (!value.equals(t.get(key)))
                        return false;
                }
            }
        } catch (ClassCastException unused)   {
            return false;
        } catch (NullPointerException unused) {
            return false;
        }

	return true;
    }

 

可以看出两者的实现原理都是一样的!

 

都是先比较对象的句柄地址,如果一样就直接true,再比较是不是Map对象,是不是长度一致,是不是键值对一致。

分享到:
评论

相关推荐

    HashMap底层实现原理HashMap与HashTable区别HashMap与HashSet区别.docx

    HashMap是Java中常用的一种数据结构,它基于哈希表实现,提供快速的键值对存储和检索。HashMap的核心原理是通过散列函数将键对象转换为哈希码,然后使用这个哈希码来确定键值对在内部数组中的位置。哈希函数的设计...

    HashTable和HashMap的区别_动力节点Java学院整理

    HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有...

    Java中HashMap和Hashtable及HashSet的区别

    在Java编程语言中,`HashMap`、`Hashtable`和`HashSet`都是集合框架的重要组成部分,分别用于存储键值对和不重复元素。下面将详细解释它们之间的区别。 首先,`Hashtable`是`Map`接口的一个早期实现,它提供了一个...

    Java容器HashMap与HashTable详解

    HashMap和HashTable是Java中两种重要的数据结构,它们都是用于存储键值对的数据容器,但两者在设计和使用上有显著的差异。 HashMap是Java集合框架的一部分,它继承自AbstractMap并实现了Map、Cloneable和...

    Java中Hashtable类与HashMap类的区别详解

    Java中的`Hashtable`和`HashMap`都是用于存储键值对的数据结构,它们都实现了`Map`接口,但在一些关键特性上有所不同。以下是这两者的主要区别: 1. **线程安全性**: - `Hashtable`是线程安全的,这意味着在多...

    05.HashMap相关面试题

    ConcurrentHashMap 是 Java 中的一个线程安全的 HashMap 实现,它使用了分段锁(Segment)来实现高效的并发访问。 * ConcurrentHashMap 使用多个锁来实现并发访问,每个锁对应一个 segment。 * 当多个线程访问同一...

    在Java中运用Hashtable.doc

    在Java中,`Hashtable`和`HashMap`都是基于哈希表实现的,但它们之间存在一些差异: 1. 线程安全性:`Hashtable`是线程安全的,这意味着在多线程环境下,它内部的同步机制保证了并发访问的正确性,而`HashMap`则...

    Java容器类List、ArrayList、Vector及map、HashTable应用

    Hashtable和HashMap是Java中常用的Map实现类,它们提供了key-value型的存储方式。Hashtable和HashMap的主要区别在于Hashtable使用了synchronized方法,线程安全,而HashMap则没有。Hashtable和HashMap都提供了put、...

    java中Hashtable和HashMap的区别分析

    - `Hashtable`不区分键的`equals()`和`hashCode()`方法,而`HashMap`要求键的`equals()`和`hashCode()`方法正确实现,以确保正确的键值对匹配。 综上所述,`Hashtable`和`HashMap`在性能、线程安全性和功能特性上...

    java的hashtable的用法.pdf

    在Java编程语言中,`Hashtable`是`Dictionary`类的一个具体实现,它是早期Java版本中的一个线程安全的键值对存储容器。`Hashtable`遵循了一些基本的映射概念,如存储键值对、根据键查找值以及添加、删除键值对等。...

    java的hashtable的用法.docx

    在Java编程语言中,`Hashtable`是`Dictionary`类的一个具体实现,它提供了一个基于键值对的数据结构,允许程序员存储和检索对象。`Hashtable`类是线程安全的,因此可以在多线程环境中直接使用,而无需额外的同步控制...

    关于重写equals,hashcode以及compareTo方法!

    例如,在Hashtable、HashMap、HashSet、LinkedHashMap等容器中,我们需要重写hashcode()方法,使其生成对象的哈希码,以便于快速地查找和比较对象。 compareTo()方法是Comparable接口中的一个方法,它用于比较两个...

    2022 最全 Java 面试笔试题汇总

    * HashMap 和 ConcurrentHashMap 的实现原理是什么?ConcurrentHashMap 是如何保证线程安全的? * ArrayList 和 LinkedList 的底层实现是什么?它们之间的区别是什么? * HashMap 和 Hashtable 的区别是什么?...

    Java大数据面试常见问题.docx

    StringBuffer 的区别、ArrayList、Vector、LinkedList 的存储性能和特性、HashMap 和 Hashtable 的区别、final、finally、finalize 的区别、switch 语句的使用、多线程的实现方法、Java 中的流类型、main 方法的访问...

    面试题-37道.docx

    - Map:存储键值对,如HashMap、TreeMap和Hashtable,其中HashMap是常用的实现,提供了快速的查找和插入。 以上是Java开发面试中常见的问题,理解并掌握这些知识点对于Java开发者来说至关重要,特别是在处理数据...

    全面解析java中的hashtable

    在Java编程语言中,`Hashtable`是一个古老的容器类,它实现了`Map`接口,提供了存储键值对(key-value pairs)的功能。`Hashtable`的主要特点是它是一个同步的容器,这意味着它是线程安全的,可以在多线程环境中直接...

    解析Java对象的equals()和hashCode()的使用

    这些对象是HashMap, Hashtable, HashSet,等等。 在设计hashCode()函数时,需要注意以下几点: * 如果x.equals(y)“返回true”,那么x和y的hashCode()必须相等。 * 如果x.equals(y)“返回false”,那么x和y的...

Global site tag (gtag.js) - Google Analytics