java中==与equals的区别

详解“==”和equals的区别 详解“==”和equals的区别一、“==”二、equals()三、栗子和解释说明3.1栗子3.2基本数据类型的比较3.3引用数据类型的比较3.3.1String类3.3.2未重写equals方法的类四、练手栗子 “==”和equals 最大的区别是 “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。 一、“==” “==”是运算符 ①如果比较的对象是 阅读详情

java中equals和==的区别 

值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

==比较的是2个对象的地址,而equals比较的是2个对象的内容。
显然,当equals为true时,==不一定为true;

一、String中的equals和==
1、
public class TestString {
     public static void main(String[] args) {
         String s1 = "Monday";
         String s2 = "Monday";
     }
}
上面这段程序中,到底有几个对象呢?
来检测一下吧,稍微改动一下程序
public class TestString {
     public static void main(String[] args) {
         String s1 = "Monday";
         String s2 = "Monday";
         if (s1 == s2)
             System.out.println("s1 == s2");
         else
             System.out.println("s1 != s2");
     }
}

编译并运行程序,输出:s1 == s2
说明:s1 与 s2 引用同一个 String 对象 -- "Monday"!

2.
再稍微改动一下程序,会有更奇怪的发现:
public class TestString {
     public static void main(String[] args) {
         String s1 = "Monday";
         String s2 = new String("Monday");
         if (s1 == s2)
             System.out.println("s1 == s2");
         else
             System.out.println("s1 != s2");
         if (s1.equals(s2))
             System.out.println("s1 equals s2");
         else
             System.out.println("s1 not equals s2");
     }
}
我们将 s2 用 new 操作符创建
程序输出:
s1 != s2
s1 equals s2
说明:s1 s2分别引用了两个"Monday"String对象

3. 字符串缓冲池

原来,程序在运行的时候会创建一个字符串缓冲池
当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会
在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被
放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1
将 s2 引用 s1 所引用的对象"Monday"
第二段程序中,使用了 new 操作符,他明白的告诉程序:
"我要一个新的!不要旧的!"于是一个新的"Monday"Sting对象被创
建在内存中。他们的值相同,但是位置不同,一个在池中游泳
一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?
4. 
再次更改程序:
public class TestString {
     public static void main(String[] args) {
         String s1 = "Monday";
         String s2 = new String("Monday");
         s2 = s2.intern();
         if (s1 == s2)
             System.out.println("s1 == s2");
         else
             System.out.println("s1 != s2");
         if (s1.equals(s2))
             System.out.println("s1 equals s2");
         else
             System.out.println("s1 not equals s2");
     }
}
这次加入:s2 = s2.intern();
程序输出:
s1 == s2
s1 equals s2

原来,(java.lang.String的intern()方法 
"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作: 
检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。
)
更好的办法:
把所有的String都intern()到缓冲池去吧
最好在用到new的时候就进行这个操作
String s2 = new String("Monday").intern();
然后就可以用==比较两个字符串的值了


二、简单数据类型和封装类中的equals和==
Java为每一个简单数据类型提供了一个封装类,每个基本数据类型可以封装成对象类型。 
除int(Integer)和char(Character),其余类型首字母大写即成封装类类型名。double (Double), float(Float),long(Long), short(Short),byte(Byte),boolean(Boolean).
  
以int和Integer为例说明 
Java中int和Integer区别如下:
1.int是基本的数据类型,默认值可以为0;
2.Integer是int的封装类,默认值为null;
3.int和Integer都可以表示某一个数值;
4.int和Integer不能够互用,因为他们两种不同的数据类型;
int a1=1;
int a2=1;
Integer b1 =new Integer (1);
Integer b2 =new Integer (1);
------------------------------
a1==a2 这个是成立的,很简单,都知道
a1==b1 这个是不成立的.表达式的值为 false ,它们是不同的数据类型(在jdk1.5以上版本中为true)
b1==b2 这个也是不成立的.表达式的值为 false,虽然是相同的数据类型,但是它们是两个对象,==比较的是2个对象的地址,它们的地址是不相等的,内容相等都是1;
b1.equals(b2)==true 这个是成立的,表达式的值为 true. 相同数据类型,两个对象,地址不同,内容相同, quals比较的是2个对象的内容,所以成立。
(a.equals(b),因为equals比较的是两个对象,所以a,b都不能为基本数据类型,否则会出编译错误。)(在jdk1.5以上版本中,b可以为基本数据类型,a不可以)
同理,其它的封装类和基本类型也是这样的.
java中equals和==的区别
==比较的是2个对象的地址,而equals比较的是2个对象的内容。

在jdk1.5以上的版本中,基本类型和封装类能自动转化,与String类型的对象和字符串常量类似。
        Integer i1 = 123;
        Integer i2 = 123;
        
        int i = 123;
        
        Integer i3 = new Integer(123);
        Integer i4 = new Integer(123);        
               
        System.out.println("i1 == i2 = "+(i1 == i2));
        System.out.println("i1.equals(i2) = "+(i1.equals(i2)));
        
        System.out.println();
        System.out.println("i3 == i4 = "+(i3 == i4));
        System.out.println("i3.equals(i4) = "+(i3.equals(i4)));
        
        System.out.println();
        System.out.println("i2 == i4 = "+(i2 == i4));
        System.out.println("i2.equals(i4) = "+(i2.equals(i4)));
        
        System.out.println();
        System.out.println("i == i2 = "+(i == i2));
        System.out.println("i1.equals(i) = "+(i1.equals(i)));

        
        System.out.println();
        System.out.println("i == i4 = "+(i == i4));
        System.out.println("i4.equals(i) = "+(i4.equals(i)));

        ------------------------------ 
       i1 == i2 = true
      i1.equals(i2) = true

      i3 == i4 = false
      i3.equals(i4) = true

      i2 == i4 = false
      i2.equals(i4) = true

      i == i2 = true
      i1.equals(i) = true

      i == i4 = true
      i4.equals(i) = true


三、其他类怎么使用equals和==
API里的类大部分都重写了equals方法,没有重写的一般是自己写的类,
如果是你自己定义的一个类,比较自定义类用equals和==是一样的,都是比较句柄地址,
因为自定义的类是继承于object,而object中的equals就是用==来实现的,你可以看源码。 

四、java里equals和hashCode之间什么关系
只是为了维护 hashCode 方法的常规协定,才要求用equals比较的两个对象的hashCode相同.
equals()和hashCode()都来自java.lang.Object.你当然可以重写.

比如a.equals(b).仅当a的内存地址相等时,才返回true.当然如String等类已经对这个方法进行了重写,比较的就不再是内存地址了.
hashCode()的值也是与内存地址相关的.所以仅当内存地址相等时,hashCode才相等.

同样很多类也重写了这个方法,还是以String为例:
public int hashCode() {
int h = hash;
if (h == 0) {
      int off = offset;
      char val[] = value;
      int len = count;

      for (int i = 0; i < len; i++) {
         h = 31*h + val[off++];
      }
      hash = h;
   }
   return h;
}
就不在与内存地址相关了.这样做是为了保证用equals比较返回为true的两个对象,他们的hashCode是相同的.

所以一般重写equals的时候都会重写hashCode().
当然,这个相当于一个约定,一个协议.你不这么做并不会错. 

五、hashCode
在一般的应用中你不需要了解hashcode的用法,但当你用到hashmap,hashset等集合类时要注意下hashcode。

你想通过一个object的key来拿hashmap的value,hashmap的工作方法是,
通过你传入的object的hashcode在内存中找地址,
当找到这个地址后再通过equals方法来比较这个地址中的内容是否和你原来放进去的一样,一样就取出value。 

所以这里要匹配2部分,hashcode和equals 
但假如说你new一个object作为key去拿value是永远得不到结果的,
因为每次new一个object,这个object的hashcode是永远不同的,所以我们要重写hashcode,
你可以令你的hashcode是object中的一个恒量,这样永远可以通过你的object的hashcode来找到key的地址,
然后你要重写你的equals方法,使内存中的内容也相等。。。

硬件工程师提前批真题及答案解析2 我们需要考虑题目可能的简化假设,即输入电阻 Ri​ 可能是 rbe​ 和 βre​ 的组合,但题目可能简化为: Ri​≈rbe​+βre​。由于锗管的正向导通电压较小(0.2 V~0.3 V),而硅管的正向导通电压较大(0.6 V~0.7 V),因此-4.7 V的电压差不符合硅管的特性,而更接近锗管的特性。在三极管电路中,静态电位是指在无信号输入时,三极管各电极的直流电压。re​ 是动态发射极电阻,通常可以近似为 re​=IE​VT​​,但在题目中已经给出了 re​=300Ω,因此可以直接使用这个值。 阅读详情

相关推荐

Android Studio打包全攻略---从入门到精通

初出茅庐 手动打包怎么手动打包项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。 1. 创建签名文件 2. 填写好签名参数 3. 生成APK 注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了为什么要打包我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,我们在在项目Project

我早就想,要这样载着你,翻山越岭 2万+

equals与==的区别

一、对象类型不同 1、equals():是超类Object中的方法。 2、==:是操作符。 二、比较的对象不同 1、equals():equals是Object中的方法,在Object中equals方法实际"ruturn (this==obj)",用到的还是"==",说明如果对象不重写equals方法,实际该对象的equals和"=="作用是一样的,都是比较的地址值(因为"=="比较的就是地址值),但是大部分类都会重写父类的equals方法,用来检测两个对象是否相等,即两个对象的内容是否相等,例如S

qq_32521381的博客 2万+

从UC3842的FB脚到COMP脚:一次讲透反激电源两种光耦反馈接法的选择与实战

本文深入探讨了UC3842 PWM控制器在反激式开关电源设计中的两种光耦反馈接法:FB脚与COMP脚方案。通过分析信号极性差异、稳定性特点及动态响应性能,提供场景化选型指南和可靠性设计要点,帮助工程师优化反馈环路设计,提升系统稳定性与效率。特别针对TL431和PC817等关键元件在温度漂移、老化衰减等实际问题给出解决方案。

weixin_28717683的博客 705

equals和==的区别

初步了解在JVM中的内存分配知识         在JVM中,内存分为堆内存跟栈内存。他们二者的区别是: 当我们创建一个对象(new Object)时,就会调用对象的构造函数来开辟空间,将对象数据存储到堆内存中,与此同时在栈内存中生成对应的引用,当我们在后续代码中调用的时候用的都是栈内存中的引用。还需注意的一点,基本数据类型是存储在栈内存中。 初步认识equals与...

旧时光Y的博客 3万+

四、嘉立创EDA原理图绘制实战:从零搭建STM32温湿度监测系统

本文详细介绍了使用嘉立创EDA标准版从零开始绘制STM32温湿度监测系统原理图的完整流程。涵盖核心元器件选型、电源电路设计、ADC按键创新应用及模块化布局技巧,帮助电子爱好者快速掌握STM32系统设计,提升嵌入式开发实战能力。

h0i1j2k3l的博客 883

Unity UGUI深度优化

Unity UGUI优化相关

不定时分享所学所得,包括游戏开发和其他收获! 2717

面试题—————— equals和== 的区别

面试官:说说equals和== 的区别? 对于 == 来说: 如果比较的是基本数据类型变量,比较两个变量的值是否相等。(不一定数据类型相同) 如果比较的是引用数据类型变量,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体。 测试基本数据类型: int a = 20; int a = 20; double c = 20.0; char i = 20; char j = 'A'; boolean boo = tru

趁年轻不如拼一拼 2万+

RT-DETR模型应用过程中的报错处理及疑问解答,涉及环境搭建、模型训练、模块改进、论文写作

本文记录了RT-DETR模型的这一系列过程中可能发生的问题,以及大家非常关心的问题,这里统一做了一个记录和解答。

Limiiiing的博客 1766

Java中==和equals()的区别

==和equals()最大的区别是:一个是运算符,一个是方法。 ==:如果比较的对象是基本数据类型,则比较数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址是否相等。 equals():用来比较两个对象的内容是否相等。 注意: equals方法不能用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。 ...

应无所住而生其心 3万+

2、机器人控制技术:阻抗/导纳控制与强化学习的融合

本文探讨了阻抗/导纳控制与强化学习在机器人控制中的融合应用。阻抗/导纳控制广泛应用于外骨骼和跟踪控制,通过改进方案提升建模误差下的鲁棒性;强化学习则为解决维度灾难、实现最优交互提供了有效途径,尤其在大输入空间、连续时间系统、冗余机器人及鲁棒控制中表现突出。结合近似器与合理奖励设计,强化学习可在无模型情况下实现高效控制。未来,两者融合有望推动更智能、更安全的机器人系统发展。

ice55的博客 300

华为OD机试真题 新系统【小花获胜的奶茶】

华为OD机试真题 新系统【小花获胜的奶茶】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【小花获胜的奶茶】多语言题解。

qq_45776114的博客 385

Java中==和equals的区别

==操作符与equals方法的区别

骑个小蜗牛的博客 4万+

【Agent】AI Agent架构趋势及演进

本文系统介绍了AI Agent架构的发展趋势和技术框架,涵盖单Agent与多Agent系统设计、提示词工程与上下文管理、SpringAI开发框架等关键技术。重点阐述了AI原生应用参考架构,包括Nacos配置管理、Higress AI网关、RocketMQ会话状态管理等核心组件解决方案。同时深入探讨了AI应用可观测性体系,包含OpenTelemetry全链路追踪、关键指标监控以及基于LoongSuite开源工具的数据采集评估方法,为构建高效可靠的AI应用提供了全景式技术参考。

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1106

【Java】==和equals的区别

哈希表允许哈希冲突(即不同的对象具有相同的哈希值),并通过链表或红黑树等机制处理冲突。都用于比较对象,但它们的行为和用途有显著的区别。不同,哈希表可能会将它们存储在不同的位置,导致查找失败或行为异常。不同,哈希表会将它们存储在不同的位置,导致查找失败。时,建议将常量或已知非空的对象放在前面。:比较对象的内容(默认比较引用,可重写)。计算对象的哈希值,确定存储位置(桶)。类中定义的方法,用于比较两个对象的。:比较基本数据类型的值或对象的引用。(即内存地址),而不是对象的内容。比较对象内容,找到匹配的对象。

Eurekame2000的博客 2982

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

详解Java中equals和==的区别

Java中equals和==的区别(详细概述) 详细结论 == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。基本数据类型中比较的是值是否相等。 equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而...

Touch 2597

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java 中 Equals和==的区别

在谈论equals和==的区别前,我们先简单介绍一下JVM中内存分配的问题。 在JVM中 内存分为栈内存和堆内存。二者有什么区别呢? 当我们创建一个对象(new Object)时,就会调用它的构造函数来开辟空间,将对象数据存储到堆内存中,与此同时在栈内存中生成对应的引用,当我们在后续代码中调用的时候用的都是栈内存中的引用,还需注意的一点,基本数据类型是存储在栈内存中。有了一定的了解 我们来看E

tcytcy123的博客 4万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java中equals与==的区别及理解

区别: “==” 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致。 equals,常用的是对象里面的内容是否相等 equals方法是由Object类提供的,可以由子类来进行重写 public boolean equals(Object obj) { return (this == obj); } 默认的实现只有当对象...

PIGABUDUR 3395

Java中 ==和equals的区别?

方法通常会根据对象的内容来判断两个对象是否相等,通常会检查对象的字段值是否相同。比较的是两个对象的内存地址,即它们是否是同一个对象。如果两个对象引用的是同一个内存地址,方法,定义自定义的对象比较逻辑。每个类可以重写(Override)如果你有一个自定义的类(比如。如果这两个字段都相同,方法,以便按内容比较对象。如果它们是不同的对象,的值都为 10,使用。方法来比较对象的内容。对于基本数据类型(如。,因为它们的值相同。

此人很懒,什么都没有写~~ 1739

Java基础之——equals和==的区别和联系

本文介绍了Java中equals和==的区别与联系。作者星河以通俗易懂的语言解释了两者的使用场景:基本数据类型只能用==比较值,引用数据类型用==比较内存地址。而equals方法在Object类中默认比较地址,但在String等类中被重写为比较内容。文章强调,若不重写equals,其效果等同于==;重写后则可自定义比较规则。全文用大白话讲解技术概念,旨在帮助读者轻松理解这一Java基础知识。

曹举的个人博客 931

Java中==与equals的区别

1.==与equals的区别 == 基本数据类型(也称原始数据类型):byte,short,double,char,int,long,float,boolean.他们之间的比较应该用==,比较的是他们的值是否相等。 引用数据类型:当他们在用==比较的时候,比较的是他们在内存中的存放地址。(除非是同一个new出来的对象,他们比较的结果是true,否则都是false,因为每一次new都会重新开辟...

世银的博客 557

java 中equals 方法和==区别

java 中equals 方法和==java中== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象equals比较的是两个所引用的对象是否一致即两个对象的内存地址是否一致基类源码中的equals方法: this代表当前对象 obj代表传入的对象举例子:定义一个 Animal 类 在上述中new 了两个Animal类注意:接下来看下一个例子: 解析:在String中的equals的源码 解析:总结:...

weixin_45185267的博客 1万+

java equals 区别_java中equals和==的区别

值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。==比较的是2个对象的地址,而equals比较的是2个对象的内容。显然,当equals为t...

weixin_39828457的博客 299

Java中equals和==的区别

1.==对于引用数据类型来说(类、接口等)比较的是栈内存的地址(堆地址)来判断两个对象的地址是否相同,而对于基本数据类型(int double)==比较的是值。 2.equals 在没有覆写equals之前,也是比较用栈地址(相当于==);但多数类库已经覆写此方法用来比较内容是否相等。详细看下面介绍: equals()方法介绍* Java中所有的类都是继承与Object这个基类的,在Object类中定义了一个equals方法,这个方法的初始行为是比较对象的内存地址,但在一些类库中已经重写了这个方法(.

BG777的博客 687

Java中==与equals方法的区别

Java中==与equals方法的区别代码我们可以看到==与equals()方法是有区别的:图形解读: 代码 public class xxx { public static void main(String[] args) { String a1=new String("abc"); String a2=new String("abc"); String a3=a2; //...

qq_45353823的博客 310

equals和==的区别_Java中equals和==的区别

0. 说明从字面上看,即便不是Java coder或者 计算机人,也大概能猜到这两个是判断是否相等的。但是是判断什么相等的,估计也就计算机人才知道吧,这个议题感觉已经是老生常谈了,为了一篇总结完善的文章,我今天早早起床,为的就是预留出时间完成这篇文章。本文主要解决的就是标题中两种“相等”判断的特点和区别。注意一点就是`equals()`是对象的方法,所以基本数据类型不会存在这种判定相等的方式。1....

weixin_42709044的博客 141
上一篇: java
下一篇: java中==与equals的区别
chenchen_chenchen
博客等级 码龄17年 24粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值