今天网上有人问怎么比较两个map是否相等,有人说直接可以equals,以前没注意,直接查了查还真的可以,发现不仅map,常用的list、set都实现了自己的equals,都怪自己没学好基础啊,看代码,先新建空的集合
import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; public class ArrayTest { public static void main(String[] args) { HashMap map1 = new HashMap<>(); HashMap map2 = new HashMap<>(); List list1 = new ArrayList<>(); List list2 = new ArrayList<>(); HashSet set1 = new HashSet<>(); HashSet set2 = new HashSet<>(); System.out.println("判断两个新建的map是否相等..."+map1.equals(map2)); System.out.println("判断两个新建的list是否相等..."+list1.equals(list2)); System.out.println("判断两个新建的set是否相等..."+set1.equals(set2)); } }
打印结果:
判断两个新建的map是否相等...true
判断两个新建的list是否相等...true
判断两个新建的set是否相等...true
——————————————————————————————————————————————
修改下代码可以在map 、list、set里加些数据
import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; public class ArrayTest { @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { HashMap map1 = new HashMap<>(); HashMap map2 = new HashMap<>(); //给两个map对象加入同样的key和同样的value map1.put("one", 1); map1.put("two", 2); map1.put("three", 3); map2.put("one", 1); map2.put("three", 3); map2.put("two", 2); List list1 = new ArrayList<>(); List list2 = new ArrayList<>(); //给两个list对象加入同样的值 list1.add(1); list1.add(2); list1.add(3); list2.add(1); list2.add(2); list2.add(3); HashSet set1 = new HashSet<>(); HashSet set2 = new HashSet<>(); //给两个set对象加入同样的值 set1.add("one"); set1.add("two"); set1.add("three"); set1.add(3); set2.add("two"); set2.add("three"); set2.add(3); set2.add("one"); System.out.println("判断两个新建的map是否相等..."+map1.equals(map2)); System.out.println("判断两个新建的list是否相等..."+list1.equals(list2)); System.out.println("判断两个新建的set是否相等..."+set1.equals(set2)); }
运行结果:
判断两个新建的map是否相等...true
判断两个新建的list是否相等...true
判断两个新建的set是否相等...true。
大家发现map和set插入值时顺序不同,但结果仍是true,而list如果插入顺序不同最后比较会是false(代码就不贴了,大家可以自己试下)。大家知道HashMap和HashSet两个是无序的,不管插入时顺序是什么样,list集合是有序的,和插入时顺序一样。所以在equals方法时,set、map和list,jdk实现也是不同的(哈哈,废话啊)。顺便贴出HashMap、HashSet和ArrayList实现equals的jdk源码,很好理解的
HashMap的父类AbstractMap实现的equals源码
public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Map)) return false; Map<K,V> m = (Map<K,V>) o; if (m.size() != size()) return false; 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; }
HashSet的父类AbstractSet实现的equals源码
public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Set)) return false; Collection c = (Collection) o; if (c.size() != size()) return false; try { return containsAll(c); } catch (ClassCastException unused) { return false; } catch (NullPointerException unused) { return false; } }
ArrayList的父类AbstractList实现的equals源码
public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof List)) return false; ListIterator<E> e1 = listIterator(); ListIterator e2 = ((List) o).listIterator(); while (e1.hasNext() && e2.hasNext()) { E o1 = e1.next(); Object o2 = e2.next(); if (!(o1==null ? o2==null : o1.equals(o2))) return false; } return !(e1.hasNext() || e2.hasNext()); }
相关推荐
### 常用类的方法集合 #### String 类 **String 类** 在 Java 语言中扮演着极其重要的角色,它是不可变的对象(immutable object),这意味着一旦一个 `String` 对象被创建,它的值就不能被更改。这特性使得 `...
### Java中常用集合类和接口详解 #### 一、引言 在Java编程中,集合类(Collections)是非常重要的组成部分,它们提供了灵活的数据管理和组织方式。本文将详细介绍Java中的主要集合类及其接口,帮助读者更好地理解...
Java中的集合类是编程中不可或缺的部分,它们提供了一种组织和管理对象的方式。在这个总结中,我们将深入探讨Java集合框架中的主要组件,包括ArrayList、LinkedList、HashSet、HashMap等,并了解如何进行基本操作如...
以上是对Java编程中集合类的相关知识点进行了详细的介绍,包括了集合类的概念、分类、常用接口及其实现类、异常处理以及泛型的使用等重要内容。掌握这些知识点对于深入理解和使用Java集合框架至关重要。
### Java常用类及集合操作详解 #### 一、Java常用类概述 在Java编程语言中,内置了许多实用的类,这些类提供了丰富的功能,能够帮助开发者高效地完成各种任务。本节将详细介绍其中的一些关键类及其用法。 ##### ...
在Object类中,equals方法的默认实现是使用“==”比较两个对象的内存地址,而不是比较两个对象的内容。因此,在大多数情况下,我们需要重写equals方法,以便比较两个对象的内容是否相等。 重写equals方法需要遵守...
List接口是Java集合类中最基本的接口,提供了基本的添加、删除、获取元素的方法。ArrayList和LinkedList是List接口的两个常用的实现类。ArrayList是一个动态数组,实现了List接口,提供了快速的随机访问和插入元素的...
这个压缩包“C#基础类 常用类 常用方法源码 .NET 工具类 源码”包含了C#编程中的基础类和常用工具类的源代码,对于学习和理解C#的编程实践非常有帮助。下面,我们将详细探讨这些关键知识点。 1. **基础类**:在C#中...
数据结构—集合运算实现 实现报告(含代码) 在计算机科学中,数据结构是组织、存储和...通过实际操作,学习者可以深化对单链表的理解,并掌握集合运算的实现方法,这对于理解和开发更复杂的数据结构和算法至关重要。
- 所有集合类的元素都是Object类型的引用,这意味着它们可以存储任何类型的对象,但这也导致需要进行类型转换(造型)。 2. **新集合类体系** - 自Java 1.2起,Java引入了一个庞大的集合框架,包括Collection、...
这两个方法来源于 `Object` 类,是所有Java类的基类,因此,每个自定义类如果不重写它们,将会继承 `Object` 类的默认实现。 `hashCode()` 方法返回一个整数值,代表当前对象的哈希码,通常用于哈希表中快速定位...
在C#编程中,`List<T>` 是一个常用的泛型集合类,用于存储同类型的元素。这个类提供了许多方便的方法,如添加、删除、查找等。本文主要关注 `List<T>` 的两个关键方法:`Contains()` 和 `Equals()`,以及它们在处理...
这些集合类被定义在`java.util`包中,为开发者提供了灵活的数据结构来实现各种应用程序的需求。由于集合类数量众多且功能各异,初学者可能会感到困惑。本篇文章旨在对Java集合类进行系统的总结,帮助读者更好地理解...
`Collection`是Java集合框架的根接口,所有具体集合类都是它的子类。`Collection`提供了一组通用的方法来处理元素集合。 #### 1.2.1 常用方法 - `add(E e)`:向集合中添加一个元素。 - `remove(Object o)`:从集合...
本文将深入探讨Java集合框架中的主要组件:Collection、List、Set和Map,以及它们的特点、常用方法和实现原理。 1. **集合框架概述** - **容器简介**:在Java中,集合框架是一种容器,用于存储一组对象。这些容器...
2. `ArrayList` 和 `LinkedList` 类:这两个类都是`List`接口的实现,用于存储有序的元素集合。`ArrayList`基于动态数组,适用于随机访问,而`LinkedList`基于双向链表,适合于频繁插入和删除。通过源码分析,我们...
* 集合框架提供了许多种集合类,例如ArrayList、LinkedList、HashSet等 知识点八:String类的getChars()方法 * getChars()方法用于将字符串的一部分转换为字符数组 * getChars()方法的参数包括开始索引、结束索引...
每个类都直接或间接地继承自它,包含了一些基本的方法,如`ToString()`、`Equals()`和`GetHashCode()`,这些方法用于对象的表示、比较和哈希计算。 接下来是`System.String`类,它代表不可变的字符序列。字符串在C#...
- **常用方法**:Collection接口是所有集合的父接口,提供了add、remove、clear等基本操作方法。 - **迭代器**:Collection的迭代器(Iterator)是遍历集合元素的主要方式,它支持next()和hasNext()方法来访问和...