看一本比较简略的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和==问题的更多相关文章

  1. Java中equal和==区别及String创建过程

    Java中equal和==区别 1.起因 在一段Java代码中,使用了两种实现方式. //第一种命令行输入 int main (String[] args) { if(args[0] == " ...

  2. java中equal方法总结

    场景:本周在完成一个公司业务功能时,在判断是否为代叫单时调用了equal方法: PublishOrderType.HELP_ORDER.equals(valetOrderExtraInfoDO.get ...

  3. 关于Java中equal函数和==的一些区别

    equal函数比较的到底是什么,很明显是比较的值,但是什么值?与==比较的堆中的内存地址不同,其比较的是对象的值,包括各个属性的值.我们在重新overriding此方法时首先要判断是否为同一对象,如果 ...

  4. java ==与equal

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(== ...

  5. 关于Java中equal 和 == 的区别

    在对Java开发还不熟练的时候,往往很多人都喜欢用==去比较两个对象是否相等,有时候就会出现很奇葩的问题. 其实这类问题并不是奇葩问题,只是我们不够细心而已,在Java中“==”比较两个变量本身的值, ...

  6. 【转】java中equal与==的区别 其中有个缓冲区,需要注意

    转自http://www.cnblogs.com/dolphin0520/p/3592500.html 在学Java时,可能会经常碰到下面的代码: 1 String str1 = new String ...

  7. java中equal和==的比较

    equals 方法是 java.lang.Object 类的方法. 有两种用法说明: (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同. “==”比较两个变 ...

  8. Java String == && equal

    [.net超级群:27921837] Java中equals和==的区别 java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,flo ...

  9. java中== equal hashcode 比较的区别

    == 基本数据类型是进行数值的比较 引用数据类型比较的是两对象的地址值 实际上都是进行直接值的比较 equal(Object) Object型参数,任何类型的实参都可以传入,只有实参是一个字符串且内容 ...

随机推荐

  1. Go语言【第二篇】:Go语法和数据类型

    Go语言基础语法 Go标记 Go程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.如以下Go语句由6个标记组成: fmt.PrintIn("Hello, World!&quo ...

  2. CSS3 边框 圆角 背景

    CSS3用于控制网页的样式布局. CSS3是最新的CSS标准.   关于transform: transform:rotate(10deg);//顺时针方向旋转10° 浏览器支持情况:低版本的IE浏览 ...

  3. [洛谷P4781]【模板】拉格朗日插值

    题目大意:给你$n(n\leqslant2000)$个点,要你求$n-1$次经过这$n$个点的多项式在$k$处的值 题解:$Lagrange$插值:$$f_x=\sum\limits_{i=1}^ky ...

  4. 2018牛客多校第四场 J.Hash Function

    题意: 给出一个已知的哈希表.求字典序最小的插入序列,哈希表不合法则输出-1. 题解: 对于哈希表的每一个不为-1的数,假如他的位置是t,令s = a[t]%n.则这个数可以被插入当且仅当第s ~ t ...

  5. 【BZOJ4066】简单题(KD-Tree)

    [BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...

  6. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur 解题报告

    P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 约翰有\(n\)块草场,编号1到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可 ...

  7. idea导入web项目tomcat

    概述 主要分为项目配置和tomcat配置两大步骤. 一.项目配置 打开idea,选择导入项 选择将要打开的项目路径后,继续选择项目的原本类型(后续引导设置会根据原本的项目类型更新成idea的项目),此 ...

  8. Codeforces Round #401 (Div. 2) A B C 水 贪心 dp

    A. Shell Game time limit per test 0.5 seconds memory limit per test 256 megabytes input standard inp ...

  9. 组合框控件 -- CComboBox

    组合框控件 -- CComboBox 组合框其实就是把一个编辑框和一个列表框组合到了一起,分为三种:简易(Simple)组合框.下拉式(Dropdown)组合框和下拉列表式(Drop List)组合框 ...

  10. Parcelable序列化对象

    一.序列化的目的 永久性保存对象,保存对象的字节序列到本地文件中: 通过序列化对象在网络中传递对象: 通过序列化在进程间传递对象; 在Intent中进行传递复杂自定义类对象时,需要实现Parcelab ...