Java中equal和"=="的区别

在 Mac OS 上编译 WebRTC 教程 阅读详情

注:本文参考自:http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html

我在复习Java EE的时候写了一个非常简单的Servlet,只要从前台获取用户名和密码,在Servlet进行比较后得到验证结果并输出到前端。

其中servlet的代码一部分为:

if(userName == "caixiaorang" && password == "caixiaorang"){...}else {...}

这段代码运行一直出错,思考片刻,才发现是String对象的对比方法使用错误。看来自己的基础仍然需要稳固。

Java中的数据类型可以分为两类:基本数据类型和复合数据类型

其中基本的数据类型比如byte,short,char,int,long,float,double,boolean之间的比较使用的是统一的==符号,进行比较的是等号前后两者的值。

而对于复合的数据类型,也就是我们常见到的类,当使用双等号进行比较的时候,比较的是他们在内存中的存放地址。所以,除非是同一个new出来的对象,他们比较之后的结果为true,否则则为false.

Java当中所有的类都是继承自Object,在基类里面定义了一个equals的方法,该方法的初始行为是比较对象的内存地址(其实就跟==号是一样的效果),但是在一些类库里面这个方法被覆盖掉了,比如String,Integer,Date,在这些类中equals方法有其自身的实现机制,不再是比较类在堆内存的存放地址了。

对于复合数据类型之间进行equals比较,在没有覆盖的情况下,比较的仍然是他们在内存中的存放位置的地址值。

原文举得例子是两个String对象,用==号和equals方法对比的结果

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.分析如下:

程序在运行的时候会创建一个字符串缓冲池。当使用了s2 = "Monday"这样子的表达式创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的s1,将s2引用s1所引用的对象。也就是说,s2和s1所引用的对象是同一个。

这时候我们不禁有了疑问,那如果更改s2会不会让s1也更改了呢?

第二个例子如下:

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");}
s2 = "Sunday";
 if (s1 == s2)
 {
 System.out.println("s1 == s2");}
 else{
 System.out.println("s1 != s2");}
System.out.println("s1: "+s1);
 }
 }

结果如下:

s1 == s2
s1 != s2
s1: Monday

其实缓冲池的原理是里面有很多的字符串,而不是有很多的变量。所以当s2被赋予了新的字符串值的时候,如果缓冲池内没有该新值,则java会新写入新值,而把s2指向新的字符串,当然,这一切都不会影响到s1.

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");}
}
}
原文的第二个例子如上。

程序输出:
s1 != s2
s1 equals s2
结果可想而知,s2
为new出来的,所以s1和s2引用了两个"Monday"的String对象。要注意分清楚的是String对象不是s1,s2而是"Monday"。

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"添加到字符串池中,然后再返回它的引用。
)



Nmap源码分析(端口扫描) 端口扫描是Nmap的核心功能,用于确定目标机的端口状态(开放、关闭、过滤等),也为Nmap的服务与版本扫描、OS扫描、脚本扫描提供基本的指引信息。所以,深入理解端口扫描的实现对分析其他的扫描方式很有帮助。 1简单回顾   首先简要回顾一下端口扫描的原理以及命令行选项。 1.1扫描原理   Nmap提供的10多种类型的端口扫描方法,如TCP SYN/ACK/FIN/Xmas/NULL/ Windows/Connect,FTP Bounce, Idle scan, UDP port u... 阅读详情

相关推荐

CentOS7 安装天气分型软件cost733过程详解

cost733是一款天气分型软件,其内置的一些算法可以帮助气象工作者进行天气类型划分等(我也是初学者,仅仅知道一些皮毛),但是网上找到的安装办法比较少,并且总会出现一些报错,试了一晚上,终于将安装办法调通了,希望可以帮助到大家

weixin_62573024的博客 3562

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

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

趁年轻不如拼一拼 2万+

channel || channelGroup || ctx.writeAndFlush()发送字符串消息客户端接收不到的原因

一、原因 网络上传播的数据都是字节(二进制数据)类型。我们如果直接向网络流里面写入一个对象(如:String对象),是无法传输的。只有将对象序列化(转换为可以传输的字节类型)之后,才可以进行传输。所以问题的根源就很清楚了,需要把字符串转换成字节进行传输。、 二、解决办法 1、手动序列化 服务端: channelGroup.writeAndFlush(Unpooled.copiedBuffer("【客户端】"+remoteAddress+"已下线"+format.format(new Date()), Cha

haohaoxuexiyai的博客 4060

Java中equals详解

equals是在object类中的方法,在object中equals是用来看看两个参数是否引用的是同一个对象 例: obj.equals(obj2) 若是返回true说明两者引用同一个对象 源码: public boolean equals(Object obj) { return (this == obj); } 但是在我们实际开发中经常比较的是两个对象的内容是否相等,因此就要重写equals,注意只能是一个类里比 public boolean equals(Obj

qq_60267580的博客 2万+

STM32H743IIT6上LVGL移植实战:从零到触摸屏驱动的完整配置流程

本文详细记录了在STM32H743IIT6高性能MCU上,从零开始移植LVGL图形库到7寸RGB触摸屏的完整实战流程。内容涵盖工程搭建、显示与触摸驱动配置、LVGL核心优化及常见问题排查,重点讲解了如何利用STM32H743的硬件特性(如DMA2D、LTDC)提升GUI性能,为嵌入式GUI开发提供了一份详实的配置指南。

spark7igniter的博客 549

Fastjson2升级指南:如何平滑迁移并避免兼容性问题

本文详细介绍了Fastjson2的升级指南,涵盖兼容性检查、性能调优及零停机迁移方案。通过实战案例展示如何避免常见问题,如日期格式严格校验和字段映射策略变化,并分享高性能配置技巧如JSONB二进制协议和内存池化。帮助开发者平滑迁移至Fastjson2,提升JSON处理效率。

weixin_29016865的博客 411

Java中的equals方法

解释:this指的就是当前对象,this是指equals方法是谁调用的,上面的hello调用的equals,所以this指的是字符串hello,而==右边的obj对象,是传入的abc。Object类中的equals方法默认就是比较对象地址是否相同。"=="是一个比较运算符。

SakuraMG的博客 1万+

Kubernetes多网卡环境下Calico网络配置避坑指南:如何精准指定业务网卡

本文针对Kubernetes多网卡环境下Calico网络配置的常见痛点,提供了精准指定业务网卡的实战指南。通过深入分析Calico的IP自动检测机制,详细解读并对比了五种IP_AUTODETECTION_METHOD配置方法(如interface、cidr、can-reach等),帮助运维人员从根源上解决网络分区和Pod通信失败问题,确保生产集群网络的稳定与可靠。

weixin_28835551的博客 730

equal与==的区别

“==”对于基本数据类型,判断两个变量的值是否相等;对于引用类型则比较两个对象是否地址相同,是否为同一引用。 “equal”不能用于基本数据类型。只能用于类变量。对于基本数据类型要用其包装类。 因为对象变量的存储的是对象在内存中的路径,即内存地址。所以用“==”比较时,即使对象的值相等,但是他们的内存地址不同,所以==的结果为false。故“==”用于比较两个变量的值是否相等,而不是变量引用的对象是否相等。 equal用于比较两个对象是否相同类型,值是否相等。 总之: “==”比较的是值【变量(栈

qq_41282282的博客 3749

详细介绍用MATLAB实现基于A*算法的路径规划(附完整的代码,代码逐行进行解释)(一)--------A*算法简介和环境的创建

   本系列文章主要介绍基于A*算法的路径规划的实现,并使用MATLAB进行仿真演示。    一、 A*算法简介       A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。      公式表示为: f(n)=g(n)+h(n),其中, f(n) 是从初始状态经由状态n到目标状态的代价估计,g(n) 是在状态空间中从初始状态到状态n的实际代价,h(n) 是从状态n到目标状态的最佳路径的估计代价。

慕羽★的博客 7万+

二、Creo模型的功能函数 例如:模型(元件)的干涉........

【代码】模型(元件)的干涉。

行为艺术家Zzz的博客 615

Java中的equals方法详解:比较方法

如果不覆盖equals方法,则调用该方法时会使用继承的Object类的实现,这种默认实现无法提供正确的比较行为,因为它无法知道哪些属性或状态在两个对象中是必须相同的。在这个例子中,a和b是两个不同的Integer对象,虽然它们的值相同,但是它们指向的是不同的对象,因此使用==运算符比较时返回false。3)传递性:对于任何非null的引用值x、y和z,如果x.equals(y)返回true,y.equals(z)也返回true,那么x.equals(z)也应该返回true;

weixin_62458944的博客 1万+

从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果

通过colmap进行的sfm的普通方式会丢失场景的物理尺度信息,并且并不在符合一般认知的坐标系下,本文将读取colmap生成的点云和相机pose,将其进行空间变换和缩放之后,重新保存,新保存的结果仍然可以被colmap读取以及进行后续的稠密重建以及3dgs等工作

诺有缸的高飞鸟的博客 1424

java中“==”和equal区别

8个月以后就要正式找工作啦,我觉得现在是时候花时间好好深入研究一下以前比较混肴的知识。这就当作是自我成长的第一步!对于String中的“equal方法”和“==”一直有点...

哲洛不闹的专栏 131

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

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java “==”与“equal” 区别

深入了解java中String类型中“==”与“equal”的区别. 一、前言 1.1、首先很多人都知道,String中用“==”比较的是地址,用equals比较的是内容,很多人对此用的是记忆法,通过记忆来加强此的引用,但是其真正的原理其实并不难,当我们真正明白其为什么的时候,用起来也会更加灵活,更加有底气(形容得不太好,朋友别见怪); 二,相关知识的准备 类型常量池 运行时常量池 字符串常量池 我们今天讨论的主题是当然是字符串常量池: 为什么在这要把另外两个常量池拿出说一下呢,首先小生我在网上或者cn

qq_36636312的博客 249

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java中“==”和equal方法的区别

看代码 String str1 = new String("hello"); String str2 = "hello"; System.out.println("str1==str2: " + (str1==str2)); \\1 System.out.println("str1.equals(str2): " + str1.equals(str2)); \\2 输出结果: str1==str2: false str1.equals(str2): true 关于==和equals,我们需要知道

lucklydog123的博客 505

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java 中“==”与“equal” 的区别

一、java当中的数据类型和“==”的含义:   基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。 复合数据类型(类):当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。 注:对于第二种类型,除非是同一个new出来

Kunaly 4万+

java andequal_java中“==”和equal区别

8个月以后就要正式找工作啦,我觉得现在是时候花时间好好深入研究一下以前比较混肴的知识。这就当作是自我成长的第一步!对于String中的“equal方法”和“==”一直有点混肴,今天重新看了一下他们两点的区别,记录下来让自己以后不在忘记!先说“==”:“==”是用来比较两个String对象在内存中的存放地址是否相同的。例如,String test1 = "test";String test2 = "...

weixin_39644377的博客 117

Java中“==”和equal的区别

==比较的是对象引用的地址,也就是是否是同一个对象; equal比较的是对象的值。 例如: Integer r1 = new Integer(900);//定义r1整型对象 Integer r2 = new Integer(900);//定义r2整型对象 System.out.println(r1==r2);//返回false System.out.println(r1.e

WALLEZhe的博客 1732

java关于equal与“==”的区别

首先“”与equals是有明显区别的。 “”强调栈中的比较,可以理解为地址比较,该运算符表示指向字符串的引用是否相同。 如: String a=“abc”;String b=“abc”, 那么ab将返回true。这是因为在java中字符串的值是不可改变的,相同的字符串在内存中只会存 一份,所以a和b指向的是同一个对象;再比如:String a=new String(“abc”); String b...

qq_43003762的博客 159

Java中“==” 与 “equal”的区别

java equal和==的比较,尤其注意基本类型和基本类型的包装类型的比较 java中equals方法和“==”的区别:  equals 方法是 java.lang.Object 类的方法。  有两种用法说明:  (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。  “==”比较两个变量本身的值,即两个对象在内存中的首地址。

.|Zihuatanejo 496

JAVA中“==”和"equal"的区别

首先我们来看一段代码:  public static void main(String[] args) { String str1 = " abc " ; String str2 = new String( " abc " ); String str3 = new String();

曳尾涂中的专栏 572

java equal 区别_Java中“==”与“equal()”的区别。

1“==”在基本数据类型:(byte,short,char,int,long,float,double,boolean) 中,“==”都是 比较的他们的值。在复合数据类型 :(对象,数组) 中“==”都是比较的的内存地址(也就是堆内存地址)对于复合数据类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。2,equa...

weixin_32541333的博客 242

Java中“==”与“equal()”的区别。

1“==” 在基本数据类型:(byte,short,char,int,long,float,double,boolean) 中,“==”都是 比较的他们的值。 在复合数据类型 :(对象,数组) 中“==”都是比较的的内存地址(也就是堆内存地址) 对于复合数据类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一...

amfrlfum565669的博客 130

Java的 "==" 和equal()的区别

最近一次面试,遇到了一些Java的基础问题,关于“==”和equal()的区别,现在整理一下,免得再次忘记。 一、两者的介绍 1:关于操作符“==” 如果是基本类型,比较的就是两者的值是否相等。 如果是引用类型那么比较的就是对象的引用是不是相等。 2:关于equal() 它是Object类的一个方法,故所有继承它的Java类都有这个方法, 但有区别的是,有些类重写了这个方法,有些类没

逆风舞的专栏 717

Java区别"=="和equal

参考资料:https://www.zhihu.com/question/26872848https://blog.csdn.net/striverli/article/details/529979271、基础知识== 在Java编程语言中是一个二元操作符,用于比较原生类型和对象,不支持重载。equal实际上是一个方法,equals()可以基于业务规则的不同而重写,让开发者自己去定义满足什么条件的两...

夜半一碗凉泡面的博客 274
上一篇: 最字头之四:最长不重复字串
下一篇: Java内存分配浅析
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值