博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
==与equals到底有啥不一样
阅读量:2427 次
发布时间:2019-05-10

本文共 1980 字,大约阅读时间需要 6 分钟。

1. ==

a.如果比较的是基本数据类型,则直接比较其存储的值是否相等。

int i = 10;int j = 10;System.out.println(i ==j);

b.如果比较的是引用类型的变量,则比较的是所指向的对象的地址。

String s1 = "hello";String s2 = "hello";System.out.println(s1 == s2);
2. equals

如果没有对equals方法进行重写,它和==的作用是一样的。

/**** Object.java中equals的实现**/public boolean equals(Object obj) {
return (this == obj);}

重写equals方法后可以实现两个对象"值"相等。重写equals方法时需要重写hashCode方法。

为什么重写equals需要重写hashCode?

java中对象的比较有如下规定:

  1. 应用执行期间,同一个对象内容不发生改变,无论经过多少次调用hashCode方法返回值必须是同一个值。
  2. 如果两个对象equals方法比较是相等的,那么所两个对象的的hashcode也必须一样。
  3. 如果两个对象equals方法比较是不相等的,那么两个对象的hashcode可能一样,也可能不一样。

为了保证equals相等时对象hashcode必须相等,一般重写equals方法时需要重写hashCode方法。

案例

下面以学生为例来演示重写equals和hashCode方法。

class Student {
private String name; private int age; public Student(String name, int age) {
this.age = age; this.name = name; } public int getAge() {
return age; } public String getName() {
return name; } public void setAge(int age) {
this.age = age; } public void setName(String name) {
this.name = name; } /** * 姓名和年龄都相等才相等 * @param obj * @return */ @Override public boolean equals(Object obj) {
if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) {
if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public int hashCode() {
final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; }}public class EqualsDemo {
public static void main(String[] args) {
Student stu1 = new Student("name1", 20); Student stu2 = new Student("name1", 20); //两个对象 false System.out.println("stu1 == stu2 : " + (stu1 == stu2)); //值相等 true System.out.println("stu1.equals(stu2) : " + stu1.equals(stu2)); }}

运行结果:

stu1 == stu2 : falsestu1.equals(stu2) : true

转载地址:http://qecmb.baihongyu.com/

你可能感兴趣的文章
基于嵌入式操作系统的物联网安全
查看>>
一个只有 99 行代码的 JS 流程框架
查看>>
移动周刊第 186 期:移动 App 客户端性能优化、iOS 开源库源码解析
查看>>
包学会之浅入浅出 Vue.js:开学篇
查看>>
JavaScriptCore 全面解析 (上篇)
查看>>
移动周刊第 187 期:App 模块化实战经验总结
查看>>
以不一样的视角看物联网协议
查看>>
JavaScriptCore全面解析 (下篇)
查看>>
嵌入式操作系统与物联网演进之路
查看>>
苹果公司揭秘首批列入 Swift 源代码兼容性开源项目清单
查看>>
Python 玩转物联网之 Micropython GPIO IRQ 处理
查看>>
移动周刊第 188 期:Android 安全性要点与规范核心详析
查看>>
手机为基础的 IoT 布局已经失效,下一代操作系统是什么模样?
查看>>
无线传感器网络使用指南
查看>>
Unity 脚本优化的那些坑
查看>>
《近匠》专访机智云 CTO 刘琰——从 0 到 1 开启智能化硬件开发
查看>>
深度对话微软,解读 HoloLens 技术设计细节
查看>>
移动周刊第 191 期:如何看待 Kotlin 成为 Android 官方支持开发语言?
查看>>
物联网浪潮之下,前端工程师如何迎刃而上?
查看>>
从端到云——工业物联网项目全栈快速开发
查看>>