代码编织梦想


解决了当List集合里面的元素是类的对象,而不是String,Integer等类型时,怎么使用contains方法和indexOf方法

解决了map的key值是类的对象时,怎么用具有相同内容的不同对象,获取相同的value值

List重写equals方法来使用contains与indexOf方法

equals方法用于contains与indexOf方法中,equals可以正常的比较String,Integer等类型的对象,但是对于自己创建的类对象,无法正确判断,因此在自己定义的类里面需要重写equals,才能正常使用contains与indexOf方法
同样的,如果不用这两个方法,就不需要重写equals

package test.ListDemo;
import java.util.*;
public class equalsDemo1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("hadoop");
        list.add("zookeeper");
        System.out.println(list.contains("hadoop"));
        System.out.println(list.indexOf("zookeeper"));
        //创建一个新的但是相同内容的对象
        System.out.println(list.contains(new String("hadoop")));
        System.out.println(list.indexOf(new String("zookeeper")));
    }
}

结果为
在这里插入图片描述
这里是因为String类中已经定义好了equals方法,不需要我们重写,但如果List中的元素不是String类型,而是我们自己定义的类的对象,就需要重写equals方法,看一下这个例子

package test.ListDemo;
import java.util.*;
public class equalsDemo2 {
    public static void main(String[] args) {
        List<Rectangle> list = new ArrayList<>();
        Rectangle r1 = new Rectangle(3,4);
        Rectangle r2 = new Rectangle(3,4);
        list.add(r1);
        System.out.println(list.contains(r1));
        System.out.println(list.contains(r2));
        System.out.println(list.indexOf(r1));
        System.out.println(list.indexOf(r2));
    }
}

class Rectangle{
    public int length;
    public int width;
    public Rectangle(){}
    public Rectangle(int l,int w){
        length = l;
        width = w;
    }
}

结果为
在这里插入图片描述
发现,虽然 r1 和 r2 的参数一样,可以看成是一个对象,但是 r2 使用contains方法和indexOf方法返回的结果却和 r1不一样,为了解决这个问题,就需要重写equals方法

package test.ListDemo;
import java.util.*;
public class equalsDemo2 {
    public static void main(String[] args) {
        List<Rectangle> list = new ArrayList<>();
        Rectangle r1 = new Rectangle(3,4);
        Rectangle r2 = new Rectangle(3,4);
        list.add(r1);
        System.out.println(list.contains(r1));
        System.out.println(list.contains(r2));
        System.out.println(list.indexOf(r1));
        System.out.println(list.indexOf(r2));
    }
}

class Rectangle{
    public int length;
    public int width;
    public Rectangle(){}
    public Rectangle(int l,int w){
        length = l;
        width = w;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Rectangle){
            Rectangle r = (Rectangle) obj;
            return this.length==r.length && this.width==r.width;
        }
        return false;
    }
}

结果为
在这里插入图片描述
发现两者的结果现在都是正确而且相同的了

另外补充一下,由于我这里的类的成员变量都是int类型,所以equals方法中用 == 就可以了,如果有String类型,就可以用

Objects.equals(this.参数,r.参数)

的方式

Map,相同内容的不同对象,应该返回相同的value值

具有相同内容的不同对象,查询返回的value应该是相同的。如果我们没有重写equals方法和hashCode方法,那么就算内容相同,map.get()方法返回的value值也是不一样的
先来看例子

package test.MapDemo;
import java.util.*;
public class equalsDemo2 {
    public static void main(String[] args) {
        Person p1 = new Person("zhang",12);
        Map<Person,Integer> map = new HashMap<>();
        map.put(p1,123);
        Person p2 = new Person("zhang",12);
        System.out.println(p1==p2);
        System.out.println(p1.equals(p2));
        System.out.println(map.get(p1));
        System.out.println(map.get(p2));
    }
}

class Person{
    public String name;
    public int age;
    public Person(){}
    public Person(String n,int a){
        name = n;
        age = a;
    }

结果为
在这里插入图片描述
可以发现,虽然内容p1和p2里面的参数值都是相同的,但是p2是找不到对应的value值的,因此需要重写equals方法和hashCode方法
例子如下

package test.MapDemo;
import java.util.*;
public class equalsDemo2 {
    public static void main(String[] args) {
        Person p1 = new Person("zhang",12);
        Map<Person,Integer> map = new HashMap<>();
        map.put(p1,123);
        Person p2 = new Person("zhang",12);
        System.out.println(p1==p2);
        System.out.println(p1.equals(p2));
        System.out.println(map.get(p1));
        System.out.println(map.get(p2));
    }
}

class Person{
    public String name;
    public int age;
    public Person(){}
    public Person(String n,int a){
        name = n;
        age = a;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Person){
            Person p = (Person) obj;
            return Objects.equals(this.name,p.name) && this.age == p.age;
        }
        return false;
    }

    public int hashCode(){
        return Objects.hash(name,age);
    }
}

结果为
在这里插入图片描述
这次的结果正确了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44823756/article/details/120491571

重写equal()时为什么也得重写hashcode()之深度解读equal方法与hashcode方法渊源-爱代码爱编程

转载请注明出处: http://blog.csdn.net/javazejian/article/details/51348320 今天这篇文章我们打算来深度解读一下equal方法以及其关联方法hashCode(),我们准备从以下几点入手分析: 1.equals()的所属以及内部原理(即Object中equals方法的实现原理) 说

list\set等容器(集合)那里重写equals为什么还要重写hashcode方法-爱代码爱编程

我们学些java j2se的时候为还说比较两个引用是否值(内容)相等的时候不去重写hashcode方法,只是重写equals方法呢: 一下是单纯重写equals方法的例子: /**  * 测试重写equals方法  * @author Rick  *  */ public class EqualsUsage { String name; public

list set map 重写的equals方法_庚仁仕的博客-爱代码爱编程

今天面试被问到了这样的一个题 public static void main(String[] args) { // TODO Auto-generated method stub Lis

java重写hashcode方法那点事_买糖买板栗的博客-爱代码爱编程

今天在调用别人写的对象时发现一个很奇怪的问题,首先描述下需求: 简要需求:从数据库查询一个对象Dish,将这个Dish上传到某某平台,过一点时间后,某某平台会将该Dish对象传回来,我们需要判断这个对象在数据库是否有被修改的痕迹;我们首先想到的就是第一次从数据库查询出这个对象的时候,计算出其hashcode值一并传给某某平台,然后当某某平台将这个ha

list排除、去重与equals和hashcode方法重写_瞭望塔的博客-爱代码爱编程

目前,对于List<E>集合去子集和去重经测试对应两种不同的实现,去子集是直接采用集合类提供的RemoveAll()方法;去重是采用HashSet作为中介处理。首先看一下两种方式的实现: 1、RemoveAll(Collection<?> c)使用 list.removeAll(list1);通过查看该方法源码可以知道,会先遍

重写equals()时为什么也得重写hashcode()?深度解读重写equals方法以及equals方法和hashcode方法渊源__大帅_的博客-爱代码爱编程

转自 http://www.sohu.com/a/110312596_470016 本文真的很赞,对于初级程序员来说,无不相当于是个大力丸啊,所以我就本着友好的学习态度,复制粘贴到了我的博文。 本文从以下几点入手分析:

集合中删除对象集合时需要重写对象的equals和hashcode方法_星狗、的博客-爱代码爱编程

工作中的坑: List<User> listA ; List<User>listB; 集合A中包含集合B中所有的元素 现在要从A集合中删除等于B集合所有元素的集合; listA.removeAll(listB),光这样删除不掉的,必须重写 User对象的 equals和HashCode方法。 listA.remove()

java入门集合之set集合(重写equals()和hashcode()方法)_wang_da_bing的博客-爱代码爱编程_set重写equals

概述 Set接口继承Collection Set接口常用实现类 HashSet实现了 Set 接口“它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变”(存入该实现类对象中的元素是无序的,即在遍历该集合元素时,

java开发——为什么要重写equals()和hashcode()方法?_写代码砌砖头的博客-爱代码爱编程_java为什么要重写hashcode

结论: 1、重写equals()是为了实现自己的区分逻辑。 2、重写hashCode()是为了提高hash tables的使用效率,以及和equals()保持一致(看下面hashcode的第三点)。 举例: 1、String重写Object的equals方法 2、HashSet是如何保证存储的元素不同的?   首先明白这两个方法是什么来的?

重写hashcode和equals方法_简乐君的博客-爱代码爱编程_hashcode和equals重写

  一。前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄、对象头、对象实例数据、对象类型数据等也是完全一致的,所以我们可以通过比较对象的地址来判断是否相等。 二。Object源码理解 对象在不重写的情况下使用的是Object的equals

如何有效重写equals()方法和hashcode()方法_东方雨倾的博客-爱代码爱编程

平时工作中难免会遇到需要根据自己的情况比较自定义对象的时候,这个时候我们就需要重写类的equals方法和hashCode方法。 核心示例代码: class Person{ private String name; private Integer sex; private Integer age; private Stri

java中list.contains()方法,要重写equals(),hashcode()方法_weixin_40599844的博客-爱代码爱编程_java list.contains

  今天动力节点java培训机构小编为大家介绍“JAVA中list.contains()方法,要重写equals(),hashcode()方法”,希望能够帮助正在学习java的零基础学员,下面就随小编一起看看吧。   object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x

重写对象的hashcode和equals方法实现对list对象集合中对象元素的去重复-爱代码爱编程

1.我们大家都知道,set集合的特点就是没有重复的元素。如果集合中的数据类型是基本数据类型,可以直接将list集合转换成set,就会自动去除重复的元素,这个就相对比较简单。 public class Test { public static void main(String[] args) { List list = new A

Set里添加自定义对象,如何去重,不重写equals和hashcode不行吗?-爱代码爱编程

写在前面 学习很难,克服惰性。每天学一点,不会的就少一点。 懦夫从不启程,弱者死于路中,只剩我们前行,一步都不能停。 养成习惯很重要,先从点赞开始吧! set是如何去重的? Set只是一个接口,我们平时使用最多的是HashSet,那么HashSet是如何去重的呢? 来看下是如何往set中添加一个对象的: public boolean

java哪些类重写了equals_重写java类的equals()和hashCode方法-爱代码爱编程

一、equals()方法和hashCode()方法是什么? equals()和hashCode()都是是Java中万物之源Object类中的方法; equals方法用于比较两个对象是否相同,Object类中equals方法的实现是比较引用地址来判断的对象是否是同一个对象,通过覆盖该方法可以实现自定义的判断规则; hashCode是jdk根据对象的

java重写equals()方法和hashcode()方法_java重写hashcode-爱代码爱编程

1.equals()方法和hashCode()方法是什么? equals()和hashCode()都是是Java中万物之源Object类中的方法;equals方法用于比较两个对象是否相同,Object类中equals方法的