java的equal和==问题

看一本比较简略的java教程,在看到对象的时候,书上直接给我来一句:

                  

刚看下觉得没什么问题,很有道理的一个东东嘛,但是出于习惯还是打了几行代码测试了一下,代码如下:

 

 1 class Person {
 2     private String name;
 3     private int age;
 4     private double gread;
 5
 6     public Person(String name, int age, double gread) {
 7         this.name  = name;
 8         this.age = age;
 9         this.gread = gread;
10     }
11     public String talk() {
12         return "Name: " + this.name + "\n" +
13                "Age: " + this.age + "\n" +
14                "Gread: " + this.gread;
15     }
16 }
17
18 public class AnonymousObject {
19     public static void main(String[] args) {
20         Person per1 = new Person("wc", 21, 99);
21         Person per2 = new Person("wc", 21, 99);
22         Person per3 = new Person("wd", 21, 99);
23         System.out.println("per1 == per2: " + (per1 == per2));
24         System.out.println("per1.equals(per2): " + (per1.equals(per2)));
25         System.out.println("per1 == per3: " + (per1 == per3));
26         System.out.println("per1.equals(per3): " + (per1.equals(per3)));
27     }
28 }

预期来看,24行的结果应该是true才对,但是运行结果是:

                

然后我就很蛋碎的区找原因,然后发现 equals 的定义原来是这样的:

1  public boolean equals(Object obj) {
2     return (this == obj);
3     }

也就是说, equals 实质上是和 == 一样的,比较的其实都是引用,而 String 对象用 equals 比较时只要内容相同结果就为 true 的原因是 String 重写了 equals,代码如下:

 1 public boolean equals(Object anObject) {
 2     if (this == anObject) {
 3         return true;
 4     }
 5     if (anObject instanceof String) {
 6         String anotherString = (String)anObject;
 7         int n = count;
 8         if (n == anotherString.count) {
 9         char v1[] = value;
10         char v2[] = anotherString.value;
11         int i = offset;
12         int j = anotherString.offset;
13         while (n-- != 0) {
14             if (v1[i++] != v2[j++])
15             return false;
16         }
17         return true;
18         }
19     }
20     return false;
21     }

所以,在我们自己实现的类里面来说,equals 和 == 是完全等效的,除非我们也重写 equals。

但是,如果不重写 equals,那 equals 就完全失去它的作用了,所以我们一般都会重写这个函数使它变成比较两个对象的内容是否相等。

java的equal和==问题

时间: 2024-08-14 16:05:18

java的equal和==问题的相关文章

JAVA中equal()和==的区别

一般认为: ==比较的是基础数据的值或者是对象的引用地址 equal()比较的是对象的内容 其实: ==和equal()都是比较的引用地址,其实是栈内存中变量(包括基本数据类型的变量和对象变量)的值 equals()方法在object类中定义如下: public boolean equals(Object obj) { return (this == obj); } 但是在String.Integer.Math.Double......等这些封装类中,覆盖了Object类中的equal()方法,

java中equal方法总结

场景:本周在完成一个公司业务功能时,在判断是否为代叫单时调用了equal方法: PublishOrderType.HELP_ORDER.equals(valetOrderExtraInfoDO.getHelpFlag()) HELP_ORDER为枚举变量,比较的getHelpFlag()返回值为Integer,使得所有情况都返回false,导致业务逻辑错误 分析原因:equal为java的Object中的方法,因此除了基本类型外其他所有类型都可以调用,Object中方法定义如下: public

Java String == && equal

[.net超级群:27921837] Java中equals和==的区别 java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值.2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.JAVA当中所有的类都是继承

java中equal和==的比较

equals 方法是 java.lang.Object 类的方法. 有两种用法说明: (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同. “==”比较两个变量本身的值,即两个对象在内存中的首地址. “equals()”比较字符串中所包含的内容是否相同. 比如: String s1,s2,s3 = "abc", s4 ="abc" ; s1 = new String("abc"); s2 = new St

java ==与equal

java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个e

Java学习指南学习笔记

1, Java是一种静态类型.动态绑定的语言.具体来说,每一个对象都是编译时确定的良好类型.同时,可以在运行时检查一个对象究竟是什么. 2, Java中除了基本数字类型之外,Java中所有的对象都是通过引用来访问. 3, 跟C++相同,不同的类实例的数据是不同的,但是方法都是相同的. 4,所有实例变量均被设置为默认值0.false或者NULL.如果使用尚未初始化的对象,将会导致一个运行时错误. 5,命令行运行java/javac时,需要在项目classpath.何为项目classpath,如果代

几个java面试题的简洁回答

java中equal和==的区别: equal方法除非进行了重写(比如String类和基本类型包装类),否则都是进行对象引用的比较.而==除了比较基本类型时是比较值,其他情况均是比较引用地址. java适配器模式? 将原来的实现接口所有方法变成了继承实现了接口方法的抽象类(adapter),然后再实现想要的方法. 抽象类和接口的区别 抽象类和普通类的区别只是抽象类包含至少一个抽象方法,并且在声明时要加上个abstract. 接口是一种特殊的抽象类,有以下特点: 成员变量:只能是常量      成

关于JAVA

资料1:   一.单继承 1.1Java类是否支持多重继承? 答:继承的基本原则是: 子类继承父类的所有成员变量(包括静态成员): 子类继承除父类构造方法外的所有成员方法(包括静态方法): 子类不能继承父类的构造方法,但在其构造方法中会隐含调用父类的默认构造方法. Java的类是单继承的,不支持多继承,即extends关键字后只能有一个类名称,即直接父类.因此Java的类继承关系形成一个树型结构,而不是网状结构. 要想实现类似于C++的多继承关系,Java是通过接口间接实现的,即多个父类实现某一

python之路-------字符串与正则表达式

1.1.#####去掉字符串中的转义符string.strip() print "hello\tworld\n" >>> word="\thello world\n" >>> print "word.strip()后输出:",word.strip() word.strip()后输出: hello world >>> print "word.lstrip()后输出:",wor