关于set<Class>类set集合equal和hashcode复写

  最近用到了set类集合,发现达不到“想象”中的去重功效,后来上网查了一下,理解如下:

  User user1 = new User("xiaoming", "123");

  User user2 = new User("xiaoming", "123");

  Set<User> users = new HashSet<>();

  users.add(user1);

  users.add(user2);

  Systme.out.println(users.size());

  按照常理应该输出1,但实际输出的是2,那么问题来了。

  set识别元素是否已存在,先识别该元素的hashcode对应的地址上是否有值,没有值则将元素加入集合;有值,则使用equals对集合进行轮询,如果有相等的,则抛弃,否则将该元素加入集合。(hashcode直接是寻址,效率较高,而equals是全集合轮询,效率较低。hashcode地址上没有值,则在集合中一定不存在当前元素;但hashcode地址上有值,则集合中不一定存在该元素,所以需要继续用equals来判断;jvm为了高校,使用使用短路原理,先识别hashcode再判断equals)

  所以如果不复写hashcode和equals,因为他们在堆内存不同的地址,所以user1和user2的hashcode不同,set集合将其识别为不同的元素。下文是网上伙伴复写的hashcode和equals方法,大家可以根据自己的需要进行复写。  

@Overridepublic boolean equals(Object obj) {    if(obj == null) {        return false;    }    if(!(obj instanceof User)) {        return false;    }    if(this == obj) {        return true;    }    User u = (User)obj;    if(!(this.name == null ? u.getName() == null : this.name.equals(u.getName()))) {        return false;    }    return true;}

@Overridepublic int hashCode() {    return this.name.hashCode();}
时间: 2024-10-06 21:23:59

关于set<Class>类set集合equal和hashcode复写的相关文章

在含有null值的复杂类的集合(Collection)中取最大值

在日常编程中,经常遇到要在一组复杂类的集合(Collection)中做比较.取最大值或最小值. 举个最简单的例子,我们要在一个如下结构的集合中选取包含最大值的元素: public class Class<T> where T : struct { public T? Value { get; set; } } var ints = new List<Class<int>>() { new Class<int>() { Value = 2 }, new Cla

Java基础知识综合练习_使用集合存储_高级银行系统的搭建(注册、登录、存取款、本行转账、跨行转账、销户、特殊操作参数、多个客户对象存入到银行类的集合,多个银行对象存入总测试类集合)

Java基础知识综合练习_使用集合存储_高级银行系统的搭建(注册.登录.存取款.本行转账.跨行转账.销户.特殊操作参数.多个客户对象存入到银行类的集合,多个银行对象存入总测试类集合) 1) 定义bank类 属性有银行名称和存放客户的ArrayList集合, 有开户方法. 销户方法. 存钱方法. 取钱方法. 转账方法(本行转账.跨行转账) 2) 定义customer类 属性有账户名.密码.余额 3) 定义测试类创建一个银行集合用于存放bank对象创建几个bank对象:分别叫华夏银行.工商银行.招商

关于Object类的equals方法和hashCode方法

关于Object类的equals的特点,对于非空引用: 1.自反性:x.equals(x) return true : 2.对称性:x.equals(y)为true,那么y.equals(x)也为true: 3.传递性:x.equals(y)为true,y.equals(z)为true,那么x.equals(z)也为true: 4.一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次,第三次,...,第n次调用也为true,前提条件是在比较之间没有修改x,也没

Java 集合系列 14 hashCode

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列 05 Vector详细介绍(源码解析)和使用示例 Java 集合系列 06 Stack详细介绍(源码解析)和使用示例 Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和

equal与hashcode的说明

equal与hashcode的说明 要判断两个对象是否相等,需要用equal来判断这两个对象的地址是否完全一样,有些情况判断两个对象是否相等只需要判断这两个对象的value是否相等,所以需要重写equal来实现,例如set容器中,不能有两个相同的对象,所以需要重写对象的equal,但当容器中的对象比较多时,需要对容器中的对象进行线性比较,性能比较低,所以需要重写hashcode,通过散射来直接找到那个对象来进行比较,如果hashcode不同,则这两个对象就不同,如果hashcode相同,则需要比

c# 将匿名类或者集合转Json格式数据一些方法

要说写这个功能呢也是因为工作需要,白天呢上班写个Web页面需要ajax请求后台并将数据以Json格式传会前端,由于公司特殊性吧,不能连外网(很苦比).所以只有等到晚上回家上网边查边写! public class DataToJson { private static System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer(

java-Date类与集合(上)

1.1java.util.Data data的每一个势力用于表示一个时间点.由于打他存在设计缺陷,所以大部分操作时间的方法都被声明为过时的,不建议使用 打他的每一个实力内维护这一个long值,该值表示的是自1970年1月1日零时到该实例被创建的日期所经历的毫秒. void setTime(long ms) 给定一个long值使当前date对象表示该日期1.2java.text.SimoleDateFormat 可以将date与string之间按照指定的日期格式相互转换. Date now = n

异常,常用类,集合

异常: 异常(Exception)是程序在执行过程中所产生的问题: 异常处理是每个程序员都必须面对的: 异常分类: 1.检查异常(checked): 2.运行时异常(unchecked): 3.错误(事实上错误不算异常,但却是用户或程序员所无法控制的问题) 异常处理方式: 1.捕获这个异常,不让他沿着调用栈继续向下抛出: 2.捕获这个异常,并继续向下抛出: 3不捕获这个异常,从而导致method()方法从调用栈中被弹出,异常对象继续抛给调用栈下面的main()方法; Thowable类: Tho

字符串工具类、数组工具类、集合工具类、转型操作工具类、编码与解码操作工具类

package hjp.smart4j.framework.util; import org.apache.commons.lang3.StringUtils; /** * 字符串工具类 */ public final class StringUtil { /** * 字符串分隔符 */ public static final String SEPARATOR=String.valueOf((char)29); /** * 判断字符串是否为空 */ public static boolean i