= =和equals的区别是什么

2023-11-03

一、Java基础

==和equals的区别是什么

       该问题是Java中最基本的小白问题,但是很多人不去注意,就会导致之后编写代码的时候出现一些最基本的错误,却总是找不到错误来源。
       其实很简单,只要了解了之后就会觉得,哎呦,一般般了。

“==”在Java中是操作数的值相等
public class Test {
	public static void main(String[] args){
		int a=2;
		int b=2;
		System.out.println(a==b);
		
		String m = "abc";
		String n = "abc";
		System.out.println(m==n);
		
		String x = new String("hello world");
		String y = new String("hello world");
		System.out.println(x==y);
	}
}

输出的结果为: true ture false


       首先说一下为什么生成true或者false,在Java中关系操作符生成的是一个布尔类型的结果类型。
       因此对于第一个输出,输出结果为true,原因刚才已经提及,“==”代表的是值是否相等,很明显2=2。
       对于第二个输出为true,也很好理解,但是第三个输出为什么就是false了呢?
       这里要说明一下,基本类型与非基本类型的区别。
       对于Java中8种基本数据类型(不懂的自己搜索吧,这里不一一列举)的变量,变量直接存储的是“值”,所以在进行“= =”操作时,比较的是值本身。但是对于String类型,它非基本数据类型的变量。
首先说:
String x = new String(“hello world”);
String y = new String(“hello world”);
       x指向了一个对象(也可以说对象的引用),此时变量x中存储的是它指向的对象在内存中的存储地址。

然后再看下边:
String m = “abc”;
String n = “abc”;
       Java中相同字符串用的是同一块内存,它没有单独创建一块内存,所以引用的地址也是相同的。

equals比较

       看了一些资料和论坛,equals方法是基类Object中的方法,为了更直观的查看不同大部分博客中直接写出了Object类中equals方法的实现。代码如下:

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

可以看出上面的方法是比较两个对象的引用是否相等。

public class Test {
	public static void main(String[] args){
		String a = "abc";
		String b = "abc";
		System.out.println(a.equals(b));
		
		String c = new String("hello");
		String d = new String("hello");
		System.out.println(c.equals(d));
	}
}

输出的结果为: true ture
       可能很多人会问不是比较引用的地址吗?为什么new出来的比较也为true呢?其实这里又涉及到String类中的equals方法,Java中许多类(String类就是其中一个)对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。所以结果如上。


再扩展一点,代码的魅力无穷你得使劲的钻研啊!看下面的代码:

public class Test {
	public static void main(String[] args){
		int i = 2;
		int j = 2;
		System.out.println(i == j);
		
		Integer n=new Integer(2);
		Integer m=new Integer(2);
		System.out.println(n.equals(m));
		System.out.println(n==m);
		System.out.println(i==m);
		
		String a = "abc";
		String b = "abc";
		System.out.println(a==b);
		System.out.println(a.equals(b));
		
		String c = new String("hello");
		String d = new String("hello");
		System.out.println(c.equals(d));
		System.out.println(c==d);
	}

1 true 2 true 3 false 4 true 5 true 6 true 7 true 8false
前边加了序号,好让你们查看
Integer类型是int的包装类,这个结果大家可以自己细细体味。对于地址和值,以上输出结果按照上面的理解可以解决。

总结一下:“==”和equals的不同在于

1.“==”对于基本类型比较的是值的大小是否相同,对于非基本类型的数据,比较的是引用地址是否相同。
2.对于非基本类型的变量,看是否new了新的内存空间,如果new,则不同,否则相同。
3.equals比较的是非基本类型的数据的引用地址(即内存地址)是否相同,但是对于重写equals方法的类型,比较的是对象内容是否相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

= =和equals的区别是什么 的相关文章

随机推荐

  • HDLBits练习(五)锁存器和DFF

    1 创建具有高电平有效同步复位的8 D触发器 触发器必须重置为0x34而不是零 所有DFF应由clk的负边缘触发 module top module input clk input reset input 7 0 d output 7 0
  • nvprof 使用笔记

    1 nvprof metrics gld efficiency gst efficiency myproc 检测内存加载存储效率 2 nvprof query metrics 查看所有能用的参数命令 3 nvprof metrics sta
  • java mail 报错550 Mailbox not found or access denied

    运行了几年的发邮件程序 最近集体发邮件报错 org springframework mail MailSendException Failed messages javax mail SendFailedException Invalid
  • 力扣刷题记录 (七)动态规划(五)子序列系列

    题号300 最长递增子序列 给你一个整数数组 nums 找到其中最长严格递增子序列的长度 子序列是由数组派生而来的序列 删除 或不删除 数组中的元素而不改变其余元素的顺序 例如 3 6 2 7 是数组 0 3 1 6 2 2 7 的子序列
  • vue 权限按钮显示隐藏 (自定义指令法)

    咱们做后台管理系统 肯定避免不了 权限菜单 权限按钮的显示与隐藏 我分享一下 我的实现 import Vue from vue Vue directive auth inserted function el binding vnode co
  • 如何算根号2

    大家都应该背过公式 2 1 414 5 2 236 3 1 732 可是大家有没有想过没有计算器这些值是否还能退出来 答案我告诉你们可以的 如果你们感兴趣 那就看看接下来的内容 设x 2 那么x就是 2 由于数学公式比较难写 所以本小编用纸
  • leetcode刷题:加一

    题目描述 给定一个由整数组成的非空数组所表示的非负整数 在该数的基础上加一 最高位数字存放在数组的首位 数组中的每个元素只存储单个数字 你可以假设除了整数0之外 这个整数不会以零开头 示例 输入 digits 1 2 3 输出 1 2 4
  • 【Locomotor运动模块】瞬移

    文章目录 一 原理 二 两种类型 1 Instant 立刻 2 Dash 猛冲 三 瞬移区域 瞬移点 1 瞬移区域 2 瞬移点 一 原理 抛物线指针选择好目标位置 然后告诉瞬移预设体 你想法把游戏区域弄到目标位置来 解释 抛物线指针选择 S
  • Mysql基础之你我他(二)——Binlog

    一 Binlog简介 Binlog是二进制日志文件 用于记录mysql的数据更新或者潜在更新 比如DELETE语句执行删除而实际并没有符合条件的数据 在mysql主从复制中就是依靠的binlog 可以通过语句 show binlog eve
  • Python—发送json格式数据

    当我们发送POST请求的时候 一般会携带数据 POST请求 可以通过给data赋值 从而能够完成传递form表单数据 例如 requests post url data kw python 但有很多时候 要向服务器发送的是json数据 此时
  • score在Java的意思_使用Cross_Val_score的原因

    我对使用cross val score的原因感到困惑 根据我的理解 cross val score告诉我的模型是 overfitting 还是 underfitting 而且 它不训练我的模型 因为我只有1个特征 所以它是tfidf 稀疏矩
  • 暗影精灵5风扇怎么调_暗影精灵5首月使用总结,强悍体验升级不止一点

    PConline单机评测 即将走进社会 大学勤工俭学四年艰苦攒下的钱来之不易 得好好思考一下究竟怎么花 恰好英特尔九代酷睿高性能处理器面世 这段时间我可是做了不少功课 最后决定入手采用九代酷睿i7 9750H处理器和一系列强大硬件的惠普暗影
  • c++的引用

    include
  • 模糊数学学习笔记 2:贴近度

    个人博客地址 Glooow 欢迎光临 文章目录 1 贴近度 2 内外积 2 1 定义 2 2 性质 3 格贴近度 1 贴近度 给定 A B C
  • springboot日志的级别

    gt All lt Trace lt DEBUG lt INFO lt WARN lt ERROR lt Fatal lt OFF OFF 关闭 最高级别 不打印日志 FATAL 致命 指明非常严重的可能会导致应用终止执行错误事件 ERRO
  • gflags简单应用

    描述 一些利用gflag的小代码 参考文章https www cnblogs com myyan p 4798679 html 代码 gflags ParseCommandLineFlags argc argv false 用于解析命令行参
  • MyBatis之insert——主键自增和自定义主键

    一 实现描述 我们在写程序时 时常会遇到这样的问题 插入一条数据 但因有主键的存在 而有时候会报 违反唯一性约束 的错误 下面呢 我们就来利用MyBatis来解决这个问题 二 此文使用的数据库为MySQL 如需要使用其他数据库 请做适当更改
  • day_01_Spring_IOC(1~24)

    Spring spring 核心组成部分 IOC AOP 轻量级 依赖包少 开源 框架 IOC 控制反转 将创建对象的操作交给Spring AOP 面向切面 不修改源码实现功能的拓展 Spring的优点 通过IOC解耦 简化开发 支持AOP
  • 大厂面试快问快答,10分钟搞定MySQL夺命20问,你都能接住吗?

    号外号外 死磕 Java 并发编程 系列连载中 大家可以关注一波 死磕 Java 并发编程05 阿里面试失败后 一气之下我图解了Java中18把锁 死磕 Java 并发编程04 说说Java Atomic 原子类的实现原理 死磕 Java
  • = =和equals的区别是什么

    一 Java基础 和equals的区别是什么 该问题是Java中最基本的小白问题 但是很多人不去注意 就会导致之后编写代码的时候出现一些最基本的错误 却总是找不到错误来源 其实很简单 只要了解了之后就会觉得 哎呦 一般般了 在Java中是操