集合HashSet中对象的特点是无序、不允许重复。无序好理解,那么两个什么样的对象算重复呢?
两个对象重复意味着这两个对象的内容相同、hashcode值也相同。
(1)两个对象A和B内容相同,表示A.equals(B)的值为true。
(不重写的话,默认equals()方法是调用”=="进行判断的,”=="判断的是两个对象的引用是否相同)
(2)如果你不重写hashCode()方法的话,两个对象的hashcode值在默认情况下是不可能相同的。
hashCode()方法继承自Object类。每个对象在创建的时候会被分配一个唯一的hashcode值(一个整形的值)。所以不重写hashCode()方法的话,两个对象的hashcode值是不会相同的。
注意String的hashCode()方法已经被重写,所以两个不同的String对象的hashcode值有可能相同,比如下面的式子的最终结果将是true,虽然str0和str是两个不同的对象。
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三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...
主要介绍了Java中List集合对象去重及按属性去重的8种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一地的参考借鉴价值,需要的朋友可以参考下
HashSet类主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特性顺序的元素。 HashSet的一些特性如下: 1、HashSet中的值不能重复且没有顺序。 2、HashSet的容量会...
Java集合类是Java.util包中的重要内容,它提供了一套性能优良、使用方便的接口和类,用于处理对象的集合。这些类主要用于存储、检索、操作一组对象数据。 Java集合类主要包括两种类型的容器:Collection和Map。...
HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有...
15.3.4 把多对多关联分解为两个一对多关联 15.4 小结 15.5 思考题 第16章 Hibernate的检索策略 16.1 Hibernate的检索策略简介 16.2 类级别的检索策略 16.2.1 立即检索 16.2.2 延迟检索 16.3 一对多...
之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。 HashMap实现了Map...
在Java中,容器(Container)指的是用于存储和管理对象的数据结构。Java容器提供了一种统一的方式来组织和管理多个对象,使得开发者能够更加方便地对这些对象进行操作和处理。 Java容器主要分为两大类:Collection ...
Java中集合分为两种类型 第一种:以单个元素存储。其超级父接口是:java.util.Collection; 第二种:以键值对存储。(类似于python的集合)其超级父接口是:java.util.Map; 前者每个位置只能保存一个元素,后者可以...
7.5.5 重载容易引发误解的两个地方——返回类型和形参名 170 7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 ...
15.3.4 把多对多关联分解为两个一对多关联 15.4 小结 15.5 思考题 第16章 Hibernate的检索策略 16.1 Hibernate的检索策略简介 16.2 类级别的检索策略 16.2.1 立即检索 16.2.2 延迟检索 16.3 一对多...
15.3.4 把多对多关联分解为两个一对多关联 15.4 小结 15.5 思考题 第16章 Hibernate的检索策略 16.1 Hibernate的检索策略简介 16.2 类级别的检索策略 16.2.1 立即检索 16.2.2 延迟检索 16.3 一对多...
7.5.5 重载容易引发误解的两个地方——返回类型和形参名 170 7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 ...
15.3.4 把多对多关联分解为两个一对多关联 15.4 小结 15.5 思考题 第16章 Hibernate的检索策略 16.1 Hibernate的检索策略简介 16.2 类级别的检索策略 16.2.1 立即检索 16.2.2 延迟检索 16.3 一对多...
学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 ...
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对象,其中保存整数。然后求它们的并集、差集和交集。...
如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。[ nextpage] 四、final关键字到底修饰了什么? final使得被...