hascode,equals和‘==‘

hascode,equals和’=='*

  • User类【没有重写任何方法】
package com.company;

public class User {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public User() {
    }
}

1. hascode

hashCode()
的作用是获取哈希码,也称为散列码,是返回一个int整数。重新New两个内容相同的对象【如果不重写hascode】,他们的hascode是不相同的,所以在Java的Set的集合中默认为不同的。

        User user1 = new User("xiaowang", 16);
        User user2 = new User("xiaowang", 16);
        System.out.println(user1.hashCode());
        System.out.println(user2.hashCode());

结果:
在这里插入图片描述

2.equals

equals可以用判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,价于“==”。

Object中equals源码

public boolean equals(object obj){
   return (this==obj);
}
  • 没有重写hascode及equals
        User user1 = new User("xiaowang", 16);
        User user2 = new User("xiaowang", 16);
        System.out.println(user1.hashCode());
        System.out.println(user2.hashCode());
        System.out.println(user2.equals(user1));

结果:
在这里插入图片描述

  • 重写hascode及equals
 //添加进user类中
 @Override
    public boolean equals(Object o) {

       User user= (User) o;
       return  user.getName().equals(this.name);
    }

    @Override
    public int hashCode() {
        return name.hashCode();
    }
 User user1 = new User("xiaowang", 16);
        User user2 = new User("xiaowang", 16);
        System.out.println(user1.hashCode());
        System.out.println(user2.hashCode());
        System.out.println(user2.equals(user1));

在这里插入图片描述

3.‘==’

如果比较的对象是基本数据类型,则比较数值是否相等。如果比较的是引用数据类型,则比较的是对象的内存地址是否相等。而一个常量只会对应一个地址,因此不管是再多的 “abc”, 这样的数据都只会存储一个地址. 所以所有他们的引用都是指向的同一块地址,因此基本数据类型和String常量是可以直接通过==来直接比较的。

4.equals与’==’

equals与==虽然都有用于比较对象是否相同,但是用法不同。equals是函数【只存在于Object中】,而 == 则是运算符。字符串与对象使用equals相比是相同的【字符串对象已经重写了equals函数,调用此则是比较值】,使用 ==则是比较地址是是否相同

         String a =new String("abc");
        String b = new String("abc");

        String x = "abc";
        String y = "abc";
        System.out.println("x==y: " + (x == y));
        System.out.println("a==b: " + (a == b));
        System.out.println("a.equals(b): " + (a.equals(b)));
        System.out.println("a==x:"+a.equals(x));
        System.out.println("a==x:"+a==x);

结果:
在这里插入图片描述
【注解】:new出来的String对象是存放在堆中,而通过赋值的字符串则是存放在常量池中[公用常量池]。所以a!=b,但是使用equals比较a与b时,则是比较值。x与y同一个常量池的一个“abc”,则相等,使用==比较a与x则是比较地址是否相同,而堆的地址与常量池中的地址明显不相同。使用equals比较a与x,则是比较值。

【本人对此的一些看法,有误请大佬指教】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值