java中equals和==的区别

值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。 equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。 
==比较的是2个对象的地址,而equals比较的是2个对象的内容。 
显然,当equals为true时,==不一定为true; 
一、String中的equals和== 
1、 
1 public class TestString {
2      public static void main(String[] args) {
3          String s1 = "http://www.hualai.net.cn";
4          String s2 = "http://www.hualai.net.cn";
5      }
6}
上面这段程序中,到底有几个对象呢? 
来检测一下吧,稍微改动一下程序 
01 public class TestString {
02      public static void main(String[] args) {
03          String s1 = "http://www.hualai.net.cn";
04          String s2 = "http://www.hualai.net.cn";
05          if (s1 == s2)
06              System.out.println("s1 == s2");
07          else
08              System.out.println("s1 != s2");
09      }
10}  
编译并运行程序,输出:s1 == s2 
说明:s1 与 s2 引用同一个 String 对象 -- "Monday"! 
 
2. 再稍微改动一下程序,会有更奇怪的发现: 
01 public class TestString {
02      public static void main(String[] args) {
03          String s1 = "Monday";
04          String s2 = new String("Monday");
05          if (s1 == s2)
06              System.out.println("s1 == s2");
07          else
08              System.out.println("s1 != s2");
09          if (s1.equals(s2))
10              System.out.println("s1 equals s2");
11          else
12              System.out.println("s1 not equals s2");
13      }
14}
我们将 s2 用 new 操作符创建 
程序输出: 
1s1 != s2
2s1 equals s2
说明:s1 s2分别引用了两个"Monday"String对象 
 
3. 字符串缓冲池 
 
原来,程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1 将 s2 引用 s1 所引用的对象"Monday" 第二段程序中,使用了 new 操作符,他明白的告诉程序: "我要一个新的!不要旧的!"于是一个新的"Monday"Sting对象被创 
建在内存中。他们的值相同,但是位置不同,一个在池中游泳 一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢? 
4. 
再次更改程序: 
01 public class TestString {
02      public static void main(String[] args) {
03          String s1 = "Monday";
04          String s2 = new String("Monday");
05          s2 = s2.intern();
06          if (s1 == s2)
07              System.out.println("s1 == s2");
08          else
09              System.out.println("s1 != s2");
10          if (s1.equals(s2))
11              System.out.println("s1 equals s2");
12          else
13              System.out.println("s1 not equals s2");
14      }
15}
这次加入:s2 = s2.intern(); 
程序输出: 
1s1 == s2
2s1 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不能够互用,因为他们两种不同的数据类型; 
1 int a1=1;
2 int a2=1;
3 Integer b1 =new Integer (1);
4 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类型的对象和字符串常量类似。 
01 Integer i1 = 123;
02 Integer i2 = 123;
03 
04 int i = 123;
05 
06 Integer i3 = new Integer(123);
07 Integer i4 = new Integer(123);       
08         
09 System.out.println("i1 == i2 = "+(i1 == i2));
10 System.out.println("i1.equals(i2) = "+(i1.equals(i2)));
11 
12System.out.println();
13 System.out.println("i3 == i4 = "+(i3 == i4));
14 System.out.println("i3.equals(i4) = "+(i3.equals(i4)));
15 
16System.out.println();
17 System.out.println("i2 == i4 = "+(i2 == i4));
18 System.out.println("i2.equals(i4) = "+(i2.equals(i4)));
19 
20System.out.println();
21 System.out.println("i == i2 = "+(i == i2));
22 System.out.println("i1.equals(i) = "+(i1.equals(i)));
23 
24System.out.println();
25 System.out.println("i == i4 = "+(i == i4));
26 System.out.println("i4.equals(i) = "+(i4.equals(i)));
27------------------------------
28 i1 == i2 = true
29 i1.equals(i2) = true
30 i3 == i4 = false
31 i3.equals(i4) = true
32 i2 == i4 = false
33 i2.equals(i4) = true
34 i == i2 = true
35 i1.equals(i) = true
36 i == i4 = true
37 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为例: 
01 public int hashCode() {
02 int h = hash;
03 if (h == 0) {
04       int off = offset;
05       char val[] = value;
06       int len = count;
07   
08       for (int i = 0; i < len; i++) {
09          h = 31*h + val[off++];
10       }
11       hash = h;
12    }
13    return h;
14}
就不在与内存地址相关了.这样做是为了保证用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方法,使内存中的内容也相等。。。
汇川Easy系列PID_AT指令弹簧质量阻尼系统闭环控制仿真测试 汇川Easy系列PLC系统PID指令(温度控制PID应用编程) 阅读详情

相关推荐

国产麒麟系统下Kettle安装避坑指南:解决aarch64架构不支持问题

本文详细解析了在国产麒麟系统上部署Kettle时遇到的aarch64架构不支持问题,提供了从获取适配的SWT库、修改启动脚本到生产环境调优的完整解决方案。文章重点解决了ARM架构与Java GUI工具的兼容性挑战,并分享了内存配置、字体显示及Carte服务部署等实战经验,助力用户在国产化环境中稳定运行ETL流程。

weixin_29197835的博客 559

Java中==和equals的区别

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

骑个小蜗牛的博客 4万+

台达伺服B3驱动器参数的设定和CN1的接法

3. B2的电子齿轮比是直接设定P1-44(分子)和P1-45(分母)就就可以的,但是B3的有个隐藏的细节,就是P1-44的默认值77216不用去更改,这是官方客服说的,需要改的是P1-45这个参数,比如说,我使用的丝杆螺距是5mm的,那么就是以5000脉冲走完5mm为一圈,则就把P1-45设定为5000即可;我的是三菱FX3S系列的PLC,是NPN型的,输出点是24V-作为信号的,所以接41、37,具体可参考B3的。,跟着客服的讲解操作才解决的,以下就是解决方法,希望能够帮到需要的各位。

qq_38681017的博客 1万+

java中==和equals的区别是什么?

我

老狼的博客 3万+

逆向实战:如何绕过iTunes 12.6.5.3的反调试机制(附X64dbg插件配置)

本文深入剖析了iTunes 12.6.5.3的反调试机制与登录协议。通过X64dbg动态调试与IDA静态分析,详细演示了如何绕过其反调试检测,并定位到核心的登录协议加密函数,揭示了其请求签名(X-Apple-ActionSignature)的生成逻辑与依赖关系,为客户端安全研究与协议分析提供了实战思路。

weixin_29202213的博客 742

OriginPro实战:5步搞定碳材料拉曼光谱D峰G峰分析(附完整数据处理流程)

本文详细介绍了使用OriginPro进行碳材料拉曼光谱D峰G峰分析的完整流程,涵盖数据预处理、多图层可视化、高精度分峰拟合等关键步骤。特别针对材料科学研究中的基线漂移、多峰重叠等问题提供专业解决方案,帮助研究者快速完成从原始数据到科研级图表的全流程分析,提升碳材料表征效率与准确性。

vodka的博客 942

Java中==和equals()的区别

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

应无所住而生其心 3万+

Ubuntu\linux,加载mcp2515的驱动,链接mcp2515,mcp2515的这个驱动默认在linux内核中。jetson nao、香橙派、树莓派

3. 其他文章,还要进行驱动编译就比较复杂了(不推荐)1.树莓派+MCP2515+

pvmsmfchcs的博客 1563

【Java】==和equals的区别

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

Eurekame2000的博客 2982

ARM与PC共享文件方式【samba】移植与配置

方式推荐指数适用平台优点缺点⭐⭐⭐⭐⭐全平台 (Win/Mac/Linux)兼容性最强,操作像本地文件配置稍繁琐,协议开销略大NFS⭐⭐⭐⭐Linux/Mac (Win支持一般)速度极快,CPU占用低Windows配置复杂,权限管理较难SFTP (SSH)⭐⭐⭐⭐全平台 (需客户端)安全加密,无需额外配置服务需使用FileZilla/Xftp等专用软件物理U盘⭐⭐⭐全平台无需网络,速度取决于接口需要人工插拔,不适合自动化Syncthing⭐⭐⭐⭐全平台自动同步,支持远程。

浩瀚之水的专栏 263

本地玩转AI还得靠这个,SillyTavern(酒馆)到底有多强?

SillyTavern是一款本地运行的LLM交互前端,支持文本生成、图像生成、语音合成等功能。它最初是TavernAI的分支,现已独立开发,社区活跃,功能更新频繁。SillyTavern通过前端UI和插件系统连接各种大模型后端,如OpenAI、KoboldAI等,用户可以在本地创建“虚拟酒馆”与各种角色对话。其功能亮点包括角色卡、角色记忆、世界设定、多人聊天室、自定义UI和行为脚本、插件扩展支持等。SillyTavern适合AI创作用户、AI工程师、LLM爱好者和AIGC创作者。它有两个维护分支:relea

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 8033

详解Java中equals和==的区别

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

Touch 2594

Qt C++ + Qt 3D 的数字孪生工厂

以下是一个基于 **Qt C++ + Qt 3D** 的数字孪生工厂完整源码示例,集成了 **Qt 3D** 产线建模和 **WebSocket** 实时数据交互。ui->qualifiedProductsLabel->setText(QString("合格产品: %1").arg(data.qualifiedProducts));ui->totalProductsLabel->setText(QString("总产量: %1").arg(data.totalProducts));

寒寒豆豆软件公司的博客 149

Java 中 Equals和==的区别

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

tcytcy123的博客 4万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java中 ==和equals的区别?

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

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java中== 和 equals 的区别

如果需要比较自定义对象的内容,应重写equals()方法,并确保它符合对称性、传递性和一致性的规则。int value;@Override// 输出:true在这个示例中,MyClass重写了equals()方法,以比较两个对象的value值。==和equals()==:用于比较基本数据类型的值或比较两个对象引用是否指向同一个内存地址。它非常适合用来检查两个对象是否是同一个实例。equals():用于比较两个对象的内容是否相同。equals()

Flying_Fish_roe的博客 1325

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java 中equals 方法和==区别

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

weixin_45185267的博客 1万+

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

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

曹举的个人博客 931

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与==的区别及理解

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

PIGABUDUR 3395

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

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

weixin_42709044的博客 141

java中==和equals的区别

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。 equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象 public static void main(String args[]) { String Str1 = n...

止境博客 337

java ==和equals的区别_Java中的==和equals区别(转载)

中软国际电子政务部Jeff Chi总结,转载请说明出处。概述:A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同。B.对于String a = “a”; Integer b = 1;这种类型的特有对象创建方式,==的时候值是相同的。C.基本类型没有equals方法,equals只比较值(对象中的内容)是否相同(相同返回true)。D.一...

weixin_35006181的博客 412

Java中 == 和equals的区别

Java中 == 和equals的区别 有时候一些细节方面,会不清楚和equals的区别,在运用方面得出的结果会不一样,今天来总结学习一下和equeals的区别 :他的作用是判断两个对象的地址是不是相等,也就是判断两个地址是不是同一个对象。(**基本数据类型比较的是值,引用数据类型==比较的是内存地址**) 因为java的只有值传递,所有对于==来说,不管是比较基本数据类型,还是引用数据类型的变量,本质上比较的是值,只是引用数据类型变量存的值是对象的地址。 equals() : 他的作用是判断两个

m0_49397863的博客 237
上一篇: Oracle中substr() 函数和左右链接
下一篇: 6个常见的 PHP 安全性攻击
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值