java的equal和==问题
看一本比较简略的java教程,在看到对象的时候,书上直接给我来一句:
                  
刚看下觉得没什么问题,很有道理的一个东东嘛,但是出于习惯还是打了几行代码测试了一下,代码如下:
 class Person {
     private String name;
     private int age;
     private double gread;
     public Person(String name, int age, double gread) {
         this.name  = name;
         this.age = age;
         this.gread = gread;
     }
     public String talk() {
         return "Name: " + this.name + "\n" +
                "Age: " + this.age + "\n" +
                "Gread: " + this.gread;
     }
 }
 public class AnonymousObject {
     public static void main(String[] args) {
         Person per1 = new Person("wc", 21, 99);
         Person per2 = new Person("wc", 21, 99);
         Person per3 = new Person("wd", 21, 99);
         System.out.println("per1 == per2: " + (per1 == per2));
         System.out.println("per1.equals(per2): " + (per1.equals(per2)));
         System.out.println("per1 == per3: " + (per1 == per3));
         System.out.println("per1.equals(per3): " + (per1.equals(per3)));
     }
 }
预期来看,24行的结果应该是true才对,但是运行结果是:
                
然后我就很蛋碎的区找原因,然后发现 equals 的定义原来是这样的:
  public boolean equals(Object obj) {
     return (this == obj);
     }
也就是说, equals 实质上是和 == 一样的,比较的其实都是引用,而 String 对象用 equals 比较时只要内容相同结果就为 true 的原因是 String 重写了 equals,代码如下:
 public boolean equals(Object anObject) {
     if (this == anObject) {
         return true;
     }
     if (anObject instanceof String) {
         String anotherString = (String)anObject;
         int n = count;
         if (n == anotherString.count) {
         char v1[] = value;
         char v2[] = anotherString.value;
         int i = offset;
         int j = anotherString.offset;
         while (n-- != 0) {
             if (v1[i++] != v2[j++])
             return false;
         }
         return true;
         }
     }
     return false;
     }
所以,在我们自己实现的类里面来说,equals 和 == 是完全等效的,除非我们也重写 equals。
但是,如果不重写 equals,那 equals 就完全失去它的作用了,所以我们一般都会重写这个函数使它变成比较两个对象的内容是否相等。
java的equal和==问题的更多相关文章
- Java中equal和==区别及String创建过程
		Java中equal和==区别 1.起因 在一段Java代码中,使用了两种实现方式. //第一种命令行输入 int main (String[] args) { if(args[0] == " ... 
- java中equal方法总结
		场景:本周在完成一个公司业务功能时,在判断是否为代叫单时调用了equal方法: PublishOrderType.HELP_ORDER.equals(valetOrderExtraInfoDO.get ... 
- 关于Java中equal函数和==的一些区别
		equal函数比较的到底是什么,很明显是比较的值,但是什么值?与==比较的堆中的内存地址不同,其比较的是对象的值,包括各个属性的值.我们在重新overriding此方法时首先要判断是否为同一对象,如果 ... 
- java ==与equal
		java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(== ... 
- 关于Java中equal  和 ==  的区别
		在对Java开发还不熟练的时候,往往很多人都喜欢用==去比较两个对象是否相等,有时候就会出现很奇葩的问题. 其实这类问题并不是奇葩问题,只是我们不够细心而已,在Java中“==”比较两个变量本身的值, ... 
- 【转】java中equal与==的区别 其中有个缓冲区,需要注意
		转自http://www.cnblogs.com/dolphin0520/p/3592500.html 在学Java时,可能会经常碰到下面的代码: 1 String str1 = new String ... 
- java中equal和==的比较
		equals 方法是 java.lang.Object 类的方法. 有两种用法说明: (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同. “==”比较两个变 ... 
- Java String ==  &&  equal
		[.net超级群:27921837] Java中equals和==的区别 java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,flo ... 
- java中== equal hashcode 比较的区别
		== 基本数据类型是进行数值的比较 引用数据类型比较的是两对象的地址值 实际上都是进行直接值的比较 equal(Object) Object型参数,任何类型的实参都可以传入,只有实参是一个字符串且内容 ... 
随机推荐
- CSS3 边框 圆角 背景
			CSS3用于控制网页的样式布局. CSS3是最新的CSS标准. 关于transform: transform:rotate(10deg);//顺时针方向旋转10° 浏览器支持情况:低版本的IE浏览 ... 
- BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)
			由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值.线段树维护区间剩余 ... 
- Python虚拟环境virtualenv的使用
			virtualenv 是一个创建孤立的Python环境的工具.可以让你创建各自独立的.互不影响的Python开发环境. 使用pip安装即可 pip install virtualenv 查看是否安装成 ... 
- HTML、 CSS、 JavaScript三者的关系 1
			HTML. CSS. JavaScript三者的关系 网页主要由三部分组成: 结构( Structure) . 表现( Presentation) 和行为( Behavior) HTML —— ... 
- CentOS 压缩(打包)和解压
			1.tar命令 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -z 用 Gzip压缩或解压 -j 用 bzip2压缩或解压 -v 显示压缩或解压的过程 -f 目标文件名,在 f ... 
- [Violet]天使玩偶
			description Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 ... 
- BZOJ1012:[JSOI2008]最大数——题解
			https://www.lydsy.com/JudgeOnline/problem.php?id=1012 https://www.luogu.org/problemnew/show/P1198 现在 ... 
- POJ1201:Intervals(差分约束)
			差分约束经典题.设s[i]为前缀和,则有 s[i]-s[i-1]<=1 (i往i-1连-1的边) s[i]>=s[i-1] (i-1往i连0的边) s[b]-s[a-1]>=c (a ... 
- Linux服务器上nginx安装的完整步骤
			1.环境准备: 服务器系统版本:CentOS 6.5 nginx软件版本:nginx-1.13.9 2.资源准备: nginx下载地址:http://nginx.org/download/nginx- ... 
- MQ对比
			转:http://blog.csdn.net/linsongbin1/article/details/47781187 MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq. ... 
