[转]谈谈Java中"=="与"equals()"
equals是Object超类中的一个方法,这个方法的实现就是通过==号实现的,==号比较的是两个对象的地址是否相同,在代码中体现出来就是比较两个对象引用中保存的地址是否相同,==能够判断的只是两个对象引用是不是指向同一个地址也就是同一个对象,所以它的相等判断是局限的:
A a1 = new A();A a2 = a1;这个时候a1 == a2是否为true?答案是yes,因为两个对象引用保存的是同一个对象的地址; A a1 = new A();A a2 = new A();这个时候a1 就不 == a2了,因为两个对象引用指向的是不同的对象. 正因为==号只能判断两个对象引用是否指向同一个对象,所以决不能用它比较两个普通对象是否相等,即使两个对象所有的实例域都相同,虽然这在现实中的语义是两个对象指的是同一个事物比如同一个人,但是因为在代码中它们分配在不同的地址,所以用==号判断它们是不相等的. 学过c#的人都知道,c#是可以用==号进行字符串相等判断的,那是c#对==进行运算符重载了的,java中没有运算符重载,哦,有一个,就是+号,能够用来拼接字符串,所以java不能用==号进行字符串相等判断.
对于字符串,有必要深究一下,是不是所有的字符串都不能用==号进行判断了,答案是no: 虚拟机将字符串常量是共享的,所以对于引用字符串常量的变量是可以用==号判断的,但是字符串的其他操作比如new String("HelloWorld") + substring replace等产生的新字符串不是共享的,所以后面这些方法产生的字符串不能用==号进行判断.给出下面一个例子: String hello = "hello';//hello是一个字符串常量的引用 if(hello == "hello")//true ... if(hello.substring(0,3) == "hel")//false ... 上面的例子中"hello" 和 "hel"都是字符串常量.
那么要按照现实世界的语义来比较两个对象是否相等,比如两个字符串含有的字符个数一样,对应索引上的字符一样也一样我们就认为它们相等,而不是仅仅判断内存地址来决定,该怎么办呢?解决方法就是重写equals方法,前面说过了Object超类中的equals方法就是用==实现的,所以假如一个类没有重写equals方法,那么当应用a1.equals(a2)时,跟用==号判断是一样的,所以要根据对象的实例域来判断两个对象是否相等的话一定要重写equals方法,eclipse有快速生成equals的捷径,你用到它的时候就知道了.
有了equals方法以后,我们再进行相等判断就不是根据对象的地址了,而是看你怎么实现这个equals方法,一般是根据对象的实例域来比较,比如姓名,身份证号,反正是一些特有或通用的属性,这个eclipse知道.
讲这么多只是告诉你==和equals进行相等测试时有哪些相似的和不同的地方,希望对你有所帮助.
[转]谈谈Java中"=="与"equals()"的更多相关文章
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- Java中的equals和hashCode方法
本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- java集合(3)- Java中的equals和hashCode方法详解
参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...
- 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别
Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...
- 谈谈JAVA中的安全发布
谈谈JAVA中的安全发布 昨天看到一篇文章阐述技术类资料的"等级",看完之后很有共鸣.再加上最近在工作中越发觉得线程安全性的重要性和难以捉摸,又掏出了<Java并发编程实战& ...
- Java中的equals和hashCode方法详解
Java中的equals和hashCode方法详解 转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...
- 关于Java中的equals方法
关于Java中的equals方法 欢迎转载,但是请填写本人的博客园原址https://www.cnblogs.com/JNovice/p/9347099.html 一.什么是equals方法 equa ...
随机推荐
- spring boot项目升级到2.0.1,提示java.lang.ClassNotFoundException: org.apache.log4j.Logger错误
首先肯定是版本出现了一点兼容问题 所以我就进入项目,查看依赖树,cd到项目目录下,mvn dependency:tree 我看到我的项目原先是1.5.9和现在2.0.1的区别在于org.slf4j的依 ...
- Python之路(第二十九篇) 面向对象进阶:内置方法补充、异常处理
一.__new__方法 __init__()是初始化方法,__new__()方法是构造方法,创建一个新的对象 实例化对象的时候,调用__init__()初始化之前,先调用了__new__()方法 __ ...
- 兼容IE8的flash上传框架"uploadify"自定义上传按钮样式的办法
(uploadify版本:3.2.1 ) 因为公司业务的原因,所做的项目需要兼容IE8,因此做的上传插件无奈选择的是基于flash的uploadify. 由于是基于flash的,所以使用过程中,难以给 ...
- mysql 地理位置定位
SET @pt2 = ST_GeomFromText('POINT(116.405289 39.904987)'); SELECT *,ST_Distance_Sphere(ST_GeomFromTe ...
- (PMP)第12章-----项目采购管理
B D 12.1 规划采购管理 输入 工具与技术 输出 1.项目章程 2.商业文件 (商业文件, 效益管理计划) 3.项目管理计划 (范围,质量,资源管理计划, 范围基准) 4.项目文件 (里程碑清单 ...
- Jersey RESTful WebService框架学习(八)文件下载防乱码
最近在做下载时候 不同浏览器下载的文件一直出现乱码,不知道怎么设置文件的编码,百度许久,找到一个解决办法如下 /** * 文件下载 * @param request * @return */ @GE ...
- 1131 Subway Map DFS解法 BFS回溯!
In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...
- VS2015离线安装NuGet Package
在一些情况下,VS2015直接安装NuGet Package的时候,速度异常缓慢: 所以还是考虑直接离线安装: Step1: 下载相应的Package https://www.nuget.org/ 然 ...
- Python自动化开发 - MySQL(一)
本节内容 一.概述 二.下载安装 三.数据库操作 四.数据表操作 五.表内容操作 一.概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么 ...
- DevExpress--TreeList节点添加图片
这个过程相对来说比较简单,网上也有不少资料,但是自己在做过之后为了记住,算是给自己写一个博客吧. 下面直接上具体的流程 1.前提 控件使用的都是DevExpress和winform的原生控件两种: 2 ...