Set集合判断对象重复的方法

Set<User> userSet = new HashSet<>();
        User user1= new User("aa","11");
        User user2= new User("aa","11");
        userSet.add(user1);
        userSet.add(user2);
        System.out.println("set size"+userSet.size());
        Iterator iterator = userSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next().toString());
        }

创建两个相同的对象 没有重写对象的equals方法和hashcode方法 默认使用object的。并且依次添加到set中,成功添加了两个

 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(username, user.username) &&
                Objects.equals(pwd, user.pwd);
    }

    @Override
    public int hashCode() {

        return Objects.hash(username, pwd);
    }

重写方法之后只添加成功了一个对象 set的大小为1

如果只是重写equals方法  不重写hashcode方法 set中任然有两个对象  并且hashcode不同,set集合区分两个对象是否相同是使用hashcode值进行区分的。

Object类的equals方法 :比较两个对象是否是同一个引用 java.lang.Object

public boolean equals(Object obj) {
        return (this == obj);
    }

关于equals方法和hashcode方法。

注:String类型的equals方法 只比较内容 不比较是否来引用同一个对象

public static void main(String[] args) {
        Set<User> userSet = new HashSet<>();
        User user1= new User("aa","11");
        User user2= new User("aa","11");
        userSet.add(user1);
        userSet.add(user2);
        System.out.println("set size"+userSet.size());
        Iterator iterator = userSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next().toString());
        }
        System.out.println("equals?:"+user1.equals(user2));
        System.out.println("user1:hashcode:"+user1.hashCode());
        System.out.println("user2:hashcode:"+user2.hashCode());
    }
}
class User{
    String username;
    String pwd;

    public User(String username, String pwd) {
        this.username = username;
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "username=‘" + username + ‘\‘‘ +
                ", pwd=‘" + pwd + ‘\‘‘ +
                ‘}‘;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(username, user.username) &&
                Objects.equals(user.pwd,pwd);
    }
}

原文地址:https://www.cnblogs.com/zhy-study/p/9386436.html

时间: 2024-10-12 13:36:02

Set集合判断对象重复的方法的相关文章

判断对象存活的方法

1. 引用计数法:给对象添加一个引用计数器,每当一个地方引用它,计数器值加1:当引用失效时,计数器值就减1 2. 可达性分析法:当一个对象到GC Roots没有任何引用链相连时,该对象被判断为可回收的对象,主流方法 可作为GC Roots对象的: (1)虚拟机栈中引用的对象(栈帧中的本地变量表): (2)方法区中的静态属性引用的对象: (3)方法区中常量引用的对象: (4)本地方法栈中JNI(即一般说得native方法)引用的对象 3. 引用类型法:强引用,软引用,弱引用,虚引用

js中判断对象数据类型的方法

1.类型定义 JS是一种弱类型语言.JS拥有动态类型,相同的变量可以用作不同的类型.JS有7种数据类型:三种基本类型(数字,字符串,布尔),两种引用数据类型(对象,数组),两种特殊数据类型(undefined,null). JS有5种原始类型:数字,字符串,布尔,undefined,null. 2.类型判断 对js中不同数据的布尔值类型总结:false:空字符串:null:undefined:0:NaN.true:除了上面的false的情况其他都为true: 如下: var o = { 'nam

Java中HashSet存储对象判断是否重复原理分析

HashSet  根据每个对象的哈希码值(调用hashCode()获得)用固定的算法算出它的存储索引,把对象存放在一个叫散列表的相应位置(表元)中: 存对象时,hashSet集合首先调用该对象的hashCode方法来获得该对象的hashCode值,与hash表中的值进行比较.如果不存在,则直接把该对象存入集合中,并把该hashCode值存入hash表中,此次add操作结束.如果存在,则进行下面的计算. 通过"=="操作符判断已经存入的对象与要存入的对象是否为同一对象.如果true则集合

【java】【反射】反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更

java的反射实现: 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 今日份代码: package com.sxd.streamTest; import java.lang.reflect.Field; import java.util.*; /** * @ClassName Test * @Description 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 * @Author sxd

JS判断对象是否存在的方法

Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: if (myObj不存在){ 声明myObj; } 你可能会觉得,写出这段代码很容易.但是实际上,它涉及的语法问题,远比我们想象的复杂.Juriy Zaytsev指出,判断一个Javascript对象是否存在,有超过50种写法.只有对Javascript语言的实现细节非常清楚,才可能分得清它们的区别

(转)JavaScript中判断对象类型的种种方法

我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 type

[转] javascript 判断对象是否存在的10种方法总结

[From] http://www.jb51.net/article/44726.htm Javascript语言的设计不够严谨,很多地方一不小心就会出错.举例来说,请考虑以下情况.现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: 复制代码代码如下: if (myObj不存在){ 声明myObj; } 你可能会觉得,写出这段代码很容易.但是实际上,它涉及的语法问题,远比我们想象的复杂.Juriy Zaytsev指出,判断一个Javascrip

判断对象是否遵守某个协议、方法

//判断对象是否遵守某个协议 if([stu conformsToProtocol:@protocol(Study)]) { NSLog(@"Student遵守了Study这个协议"); } //判断对象是否实现某个方法 if([stu respondsToSelector:@selector(test)]) { NSLog(@"Student实现了test这个方法"); }

.NET/C#中对自定义对象集合进行自定义排序的方法

一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car类型,要把它排序,系统是不知道怎么办的. 那么,如何告知系统排序的规则呢?有以下几种方法: 1:对类实现IComparable接口,示例如下: [csharp] view plain copy print? using System; using System.Collections.Generic