`
jishublog
  • 浏览: 869671 次
文章分类
社区版块
存档分类
最新评论

Java集合HashSet中的两个对象怎样算重复

 
阅读更多

集合HashSet中对象的特点是无序、不允许重复。无序好理解,那么两个什么样的对象算重复呢?

两个对象重复意味着这两个对象的内容相同hashcode值也相同

1两个对象AB内容相同,表示A.equals(B)的值为true

(不重写的话,默认equals()方法是调用=="进行判断的,=="判断的是两个对象的引用是否相同)

2如果你不重写hashCode()方法的话,两个对象的hashcode值在默认情况下是不可能相同的。

hashCode()方法继承自Object类。每个对象在创建的时候会被分配一个唯一的hashcode值(一个整形的值)。所以不重写hashCode()方法的话,两个对象的hashcode值是不会相同的。

注意StringhashCode()方法已经被重写,所以两个不同的String对象的hashcode值有可能相同,比如下面的式子的最终结果将是true,虽然str0str是两个不同的对象。

String str0 = new String("Hello!");
String str = new String("Hello!");
System.out.println(str0.hashCode()==str.hashCode());


只有同时满足以上两个条件的对象,才能算的上重复,这两个对象在加入到HashSet中的时候只能添加进一个。

两个hashcode值相等的对象,equals()返回值不一定为true;而如果两个对象的equals方法返回值为true,则两个对象的hashcode值必须相同,也即如果你重写equals()方法的话,则你必须重写hashCode()方法。

另外:还有一个我们经常用到的是判断两个对象的引用是否相等,即使用”=="符号进行判断,引用表示的是对象在内存(堆)中的存放地址,很显然两个不同的对象的地址是不可能相等的,即使两个对象的值相等(equals()结果返回true)。例如下面的例子讲分别返回true和false。

String str0 = new String("Hello!");  
String str = new String("Hello!");  
System.out.println(str0.equals(str));
System.out.println(str0==str);
真绕啊!
分享到:
评论

相关推荐

    java中set、list和map的使用方法实例

    // java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...

    Java中List集合对象去重及按属性去重的8种方法

    主要介绍了Java中List集合对象去重及按属性去重的8种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一地的参考借鉴价值,需要的朋友可以参考下

    求2个集合的交集

    HashSet类主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特性顺序的元素。 HashSet的一些特性如下: 1、HashSet中的值不能重复且没有顺序。 2、HashSet的容量会...

    40道java集合面试题含答案(很全很详细)

    Java集合类是Java.util包中的重要内容,它提供了一套性能优良、使用方便的接口和类,用于处理对象的集合。这些类主要用于存储、检索、操作一组对象数据。 Java集合类主要包括两种类型的容器:Collection和Map。...

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

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

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索策略  16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多...

    Java集合框架源码剖析:HashSet 和 HashMap

     之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。  HashMap实现了Map...

    基础深化和提高-java容器

    在Java中,容器(Container)指的是用于存储和管理对象的数据结构。Java容器提供了一种统一的方式来组织和管理多个对象,使得开发者能够更加方便地对这些对象进行操作和处理。 Java容器主要分为两大类:Collection ...

    浅谈java集合类以及示例

    Java中集合分为两种类型 第一种:以单个元素存储。其超级父接口是:java.util.Collection; 第二种:以键值对存储。(类似于python的集合)其超级父接口是:java.util.Map; 前者每个位置只能保存一个元素,后者可以...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.5.5 重载容易引发误解的两个地方——返回类型和形参名 170 7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索策略  16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索策略  16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.5.5 重载容易引发误解的两个地方——返回类型和形参名 170 7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索策略  16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多...

    疯狂JAVA讲义

    学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 ...

    Java面试题,冲冲冲!.rar

    List、Set、Queue和Map是Java集合框架中的四个主要接口,它们各自具有不同的特点和用途。 1. List(列表): - 允许重复元素。 - 具有按照元素插入顺序维护的有序集合。 - 可以通过索引访问和操作元素。 - 常见实现类...

    集合的运算

    【问题描述】设A和B为两个集合,A={a,b,c,d},B={b,c,d,e},则A与B的并集为:{a,b,c,d,e,f}; A与B的差集为:{a,b};A与B的交集为:{c,d}。 请编程,创建两个HashSet对象,其中保存整数。然后求它们的并集、差集和交集。...

    Java的六大问题你都懂了吗

    如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。[ nextpage]  四、final关键字到底修饰了什么?  final使得被...

Global site tag (gtag.js) - Google Analytics