Java中==与equals()函数的区别
前段时间写网站,在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()函数的区别的更多相关文章
- Java中“==”与equals方法的区别
1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...
- java中“==”和equals方法的区别,再加上特殊的String引用类型
==和equals的区别: 1.==是运算符,而equals是基类Object定义的一个方法,并且equals使用==定义的 2.进行比较时,分为 基本数据类型 的比较和 引用数据类型 的比较 ...
- java中的equals与==的区别
equals是Object类的公共方法,方法内部是用==实现的.但是很多类都重写了equals方法,例如基本数据类型的封装类和String类,重写后比较的是对象的值或者内容是否相同.而==是比较地址, ...
- Java中的equals和==的区别以及几个常用的object中的方法简单的调试方法
一.equals 1.equals:是Object类中的方法,只能判断引用类型 2.默认判断的是地址是否相等(判断两个参数是否是同一个对象),子类中往往重写该方法,用于判断内容(值)是否相等 二.== ...
- java中 ==与equals 有什么区别?
1.==既可以比较基本类型变量,又可比较引用类型变量,而equals只能比较引用类型变量: 2.equals方法支持重写,如果未重写equals方法,则比较引用变量时与==都是比较变量所指向的对象地址 ...
- Java中"String.equals()“和"=="的区别
Do NOT use the `==`` operator to test whether two strings are equal! It only determines whether or n ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别
Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...
- 【转】彻底弄懂Java中的equals()方法以及与"=="的区别
彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
随机推荐
- python同时给多个邮箱地址发送邮件
这个帖子内讲了怎么发邮件:https://www.cnblogs.com/becks/p/14589314.html 下图红框内于发送目标邮件地址有关 讲红框内信息修改为下方代码,即可实现向多人发送邮 ...
- gRPC与RPC的差异
在微服务架构日益流行的今天,远程过程调用(RPC)技术成为连接各个服务的重要桥梁.本文将详细比较传统RPC与谷歌开发的gRPC框架,通过具体示例展示它们在请求处理.数据格式.性能等方面的差异. 基本概 ...
- 常用的 JVM 配置参数有哪些?
常用的 JVM 配置参数 JVM 配置参数可以用来控制 Java 程序的内存分配.垃圾回收.性能优化等.以下是一些常用的 JVM 配置参数: 1. 堆内存相关参数 -Xms:设置 JVM 初始堆内存大 ...
- html中的em和rem到底该如何使用,自适应效果中如何确定文字大小/字号?
如今手机屏幕繁多,自适应效果中如何确定文字大小/字号? em rem vm vw vh你都了解吗? 先说说em和rem em:继承父级的,假设html的font-size默认为16px,body字体大 ...
- 使用 Podman Desktop 在 Windows 11 WSL2 环境中启动宿主机的 GPU 进行深度学习
使用 Podman Desktop 在 Windows 11 WSL2 环境中启动宿主机的 GPU 进行深度学习 概述 本文将指导您如何利用 Podman Desktop 安装时提供的 WSL2 环境 ...
- MCP-Playwright:AI自动化神器,一款超级好用的自动化测试框架!
在软件开发与测试领域,自动化测试早已成为提升效率.保障质量的核心工具.然而,传统自动化测试框架往往面临代码编写繁琐.跨工具协作困难.操作复杂等痛点. 而今天,给大家介绍一款自动化测试工具:MCP-Pl ...
- Java编程--简单的Proxy程序(代理设计模式)
有时候对象要完成某项任务(功能)需要很多步骤,而这些步骤全部交给对象自己完成显然是不现实的,就像我们人要吃饭,你总不能要求我们每个人都去种地.打面.做饭一样,我们只需要完成其中的吃饭这一核心操作就可以 ...
- uniapp开发HarmonyOS NEXT应用之项目结构详细解读
昨天的文章介绍了使用uniapp跨平台鸿蒙应用时如何配置开发环境和运行调试项目,今天介绍一下uniapp项目目录的结构. 可能对于从事移动开发的友友来说,uniapp的项目结构看起来有一些陌生,它更接 ...
- ModelForm验证实例
程序目录 models.py from django.db import models# Create your models here.class UserType(models.Model): ...
- 关于The JSON value could not be converted to System.DateTime的解决方案
如下json格式提交到后台后报: The JSON value could not be converted to System.DateTime. Path: $.beginTime | LineN ...