前段时间写网站,在servlet中要对用户输入的密码做判断,就出现一个很奇怪的现象:if条件句中如果用“==”作判断条件,就没法通过验证,而一换成equlas()函数,就完美解决了,于是就准备找个时间好好查查原因,并记录下来,以备记录。

看了网上许多大佬们的解释,用一句话来说就是:“==”是一个参考比较,即两个对象指向相同的内存位置,而equals()函数则是评估对象中值的比较,相当于查看该地址中存储的内容是否相同。

--------------------------分割线----------------------------------------

下面是我看的一篇很不错的博文(博文地址:https://blog.csdn.net/ZixiangLi/article/details/79036268

要想充分了解==和equals的区别需要对java的内存有所了解:

Java内存模型中存在这两种内存区域:一种是栈内存,一种是堆内存。 (注:程序计数器,运行时数据区,永久代,直接内存这里不讨论,因为java对象保存在栈内存(基本数据类型)和堆内存(引用数据类型和包装类)中)

  在函数中定义的一些基本类型的变量和对象的引用变量(变量名)都在函数的栈内存中分配。

  当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

  堆内存用来存放由new创建的对象(包括由基本类型包装起来的类:Integer、String、Double,实际上每个基本类型都有他的包装类)和数组。

一)、基本数据类型:

==比较值是否相等,因为基本类型不是对象,所以没有equals方法。

二)、对象

Object类中的equals方法:

Object.class:

publicboolean equals(Object anObject) {

if (this == anObject) {

returntrue;

}

}

可以看出最初的equals方法与==作用相同,都是判断内存地址是否相同,

然而String类是一个特例,

观察下面例子:

Stringa="aaa";

Stringb="aaa";

System.out.println(a==b);返回true

System.out.println(a.equals(b)); 返回true

==依然比较的是对象的内存地址,因为a和b同时指向存放在常量池里的"aaa"这个内存地址。

String类中的equals方法:

Stringstr=new String("aaa");

Stringstr1=new String("aaa");

System.out.println(str==str1);

System.out.println(str.equals(str1));

上面代码返回的是false  true,

False 很容易理解:==比较的是两个对象的内存地址,故不相等,输出false。

equals方法用的是String类重写object类的equals方法(其他类里也有equals方法)。

String.class:

publicboolean equals(Object anObject) {

if (this == anObject) {

returntrue;

}

if (anObjectinstanceof String) {

String anotherString = (String)anObject;

intn = value.length;

if (n == anotherString.value.length) {

charv1[] = value;

charv2[] = anotherString.value;

inti = 0;

while (n-- != 0) {

if (v1[i] != v2[i])

returnfalse;

i++;

}

returntrue;

}

}

returnfalse;

}

从上面可以看出,用==判断对象的地址是否相等,相等则返回true。

如果前面的判断不成立,接着判断括号内的对象上是否是String类型,接着判断两个字符串对象的的长度是否相等,最后判断内容是否相等,如果相等则返回true。

int i1 = 1;

int i2 =1;

System.out.println(i1 == i2);//返回true;基本变量因为不是对象,所以没有equals方法;

String a = new String("aaa");

String b = "aaa";

System.out.println(a == b);//返回false;new出来的对象重新分配内存地址

System.out.println(a.equals(b)); //返回true;String类重写了equals方法

StringBuffer sb1 = new StringBuffer("aaa");

StringBuffer sb2 = new StringBuffer("aaa");

System.out.println(sb1 == sb2);//返回false;new出来的对象都重新分配内存地址

System.out.println(sb1.equals(sb2));//返回false;StringBuffer类继承Object类的equals方法,实际比较的是内存地址

String str1 = new String("111");

String str2 = new String("111");

System.out.println(str1 == str2);//返回false;new出来的对象都重新分配内存地址

System.out.println(str1.equals(str2));//返回true;String类重写了equals方法

Integer in1 = new Integer(1);

Integer in2 = new Integer(1);

System.out.println(in1 == in2);//返回false;new出来的对象都重新分配内存地址

System.out.println(in1.equals(in2));//返回true;除了String类重写了equals方法,其他都与Object类的equals方法一致;

总结:

(1)  ==比较的是(基本变量/引用变量)所指向的内存地址;

(2)  New出来的对象都是重新分配内存地址;

(3)  除了String类重写了equals方法,其他都与Object类的equals方法一致;

(4)  Integer Double Long Character等包装库的equals方法比较的是值;
————————————————
版权声明:本文为CSDN博主「ZixiangLi」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ZixiangLi/article/details/79036268

Java中==与equals()函数的区别的更多相关文章

  1. Java中“==”与equals方法的区别

    1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...

  2. java中“==”和equals方法的区别,再加上特殊的String引用类型

    ==和equals的区别: 1.==是运算符,而equals是基类Object定义的一个方法,并且equals使用==定义的 2.进行比较时,分为  基本数据类型  的比较和  引用数据类型 的比较 ...

  3. java中的equals与==的区别

    equals是Object类的公共方法,方法内部是用==实现的.但是很多类都重写了equals方法,例如基本数据类型的封装类和String类,重写后比较的是对象的值或者内容是否相同.而==是比较地址, ...

  4. Java中的equals和==的区别以及几个常用的object中的方法简单的调试方法

    一.equals 1.equals:是Object类中的方法,只能判断引用类型 2.默认判断的是地址是否相等(判断两个参数是否是同一个对象),子类中往往重写该方法,用于判断内容(值)是否相等 二.== ...

  5. java中 ==与equals 有什么区别?

    1.==既可以比较基本类型变量,又可比较引用类型变量,而equals只能比较引用类型变量: 2.equals方法支持重写,如果未重写equals方法,则比较引用变量时与==都是比较变量所指向的对象地址 ...

  6. Java中"String.equals()“和"=="的区别

    Do NOT use the `==`` operator to test whether two strings are equal! It only determines whether or n ...

  7. Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)

    Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例  原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...

  8. 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别

    Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...

  9. 【转】彻底弄懂Java中的equals()方法以及与"=="的区别

    彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...

  10. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

随机推荐

  1. python同时给多个邮箱地址发送邮件

    这个帖子内讲了怎么发邮件:https://www.cnblogs.com/becks/p/14589314.html 下图红框内于发送目标邮件地址有关 讲红框内信息修改为下方代码,即可实现向多人发送邮 ...

  2. gRPC与RPC的差异

    在微服务架构日益流行的今天,远程过程调用(RPC)技术成为连接各个服务的重要桥梁.本文将详细比较传统RPC与谷歌开发的gRPC框架,通过具体示例展示它们在请求处理.数据格式.性能等方面的差异. 基本概 ...

  3. 常用的 JVM 配置参数有哪些?

    常用的 JVM 配置参数 JVM 配置参数可以用来控制 Java 程序的内存分配.垃圾回收.性能优化等.以下是一些常用的 JVM 配置参数: 1. 堆内存相关参数 -Xms:设置 JVM 初始堆内存大 ...

  4. html中的em和rem到底该如何使用,自适应效果中如何确定文字大小/字号?

    如今手机屏幕繁多,自适应效果中如何确定文字大小/字号? em rem vm vw vh你都了解吗? 先说说em和rem em:继承父级的,假设html的font-size默认为16px,body字体大 ...

  5. 使用 Podman Desktop 在 Windows 11 WSL2 环境中启动宿主机的 GPU 进行深度学习

    使用 Podman Desktop 在 Windows 11 WSL2 环境中启动宿主机的 GPU 进行深度学习 概述 本文将指导您如何利用 Podman Desktop 安装时提供的 WSL2 环境 ...

  6. MCP-Playwright:AI自动化神器,一款超级好用的自动化测试框架!

    在软件开发与测试领域,自动化测试早已成为提升效率.保障质量的核心工具.然而,传统自动化测试框架往往面临代码编写繁琐.跨工具协作困难.操作复杂等痛点. 而今天,给大家介绍一款自动化测试工具:MCP-Pl ...

  7. Java编程--简单的Proxy程序(代理设计模式)

    有时候对象要完成某项任务(功能)需要很多步骤,而这些步骤全部交给对象自己完成显然是不现实的,就像我们人要吃饭,你总不能要求我们每个人都去种地.打面.做饭一样,我们只需要完成其中的吃饭这一核心操作就可以 ...

  8. uniapp开发HarmonyOS NEXT应用之项目结构详细解读

    昨天的文章介绍了使用uniapp跨平台鸿蒙应用时如何配置开发环境和运行调试项目,今天介绍一下uniapp项目目录的结构. 可能对于从事移动开发的友友来说,uniapp的项目结构看起来有一些陌生,它更接 ...

  9. ModelForm验证实例

    程序目录 models.py from django.db import models# Create your models here.class UserType(models.Model):   ...

  10. 关于The JSON value could not be converted to System.DateTime的解决方案

    如下json格式提交到后台后报: The JSON value could not be converted to System.DateTime. Path: $.beginTime | LineN ...