参考答案:
一.区别
1.最大的区别就是:==是一个比较运算符,而Equals是一种方法
2.先简单介绍一下==作用:==比较运算符既可以判断基本类型,又可判断引用类型
当判断基本类型时,判断的是值是否相等 eg.int i =10;double d = 10.0;则i == d 为true(这里涉及数据类型的自动转换,大家可以去看我写类型转换的文章)
当判断引用类型时,判断的是地址是否相等,即判断是否为同一个对像
这里我们在复习一下八种基本数据类型
整数:byte、short、int、long
浮点数:float、double
布尔类型 :boolean
字符类型:char(这里需要注意String不是基本类型)
这里我们具体介绍一下Equals方法:equals是Object类中的方法,只能判断应用类型,简单来说就是比较两个对象的地址是否相等,到这里感觉equals和==的方法类似,并且==的作用范围好像还比equals方法更大,但是在子类中往往重写该方法,用于判断内容是否相等,比如Integer,String
二.代码案例
下面举几个例子帮助大家理解(各位读者可以在自己的编译器上看看输出结果)
eg1.
public class Equals01 {
public static void main(String[] args) {
A a = new A();
A b = a;
A c = b;
System.out.println(a == c);
B b2 = a;
B b3 = new B();
System.out.println(b2 == c);
System.out.println(b2 == b3);
Integer integer = new Integer(1);
Integer integer1 = new Integer(1);
System.out.println(integer.equals(integer1));
Object o = new String();
System.out.println(o instanceof String);
String a1 = "asd";
String a2 = "asd";
System.out.println(a1.equals(a2));
}
}
class B{ }
class A extends B{ }
eg2: 判断两个 Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样,则返回 true,反之 false。(重写equals方法)
public class Equalsexercis01 {
public static void main(String[] args) {
Person person = new Person("jack", 10, '男');
Person person1 = new Person("jack", 10, '男');
System.out.println(person.equals(person1));
}
}
class Person{
private String name;
private int age;
private char gender;
//重写Object的Equals方法
public boolean equals(Object obj){
//判断如果比较的两个对象是同一个对象,则直接返回true
if (this == obj){
return true;
}
//类型判断
if (obj instanceof Person){
//类型转换
//向下转型,因为需要得到obj的各个属性
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age && this.gender == this.gender;
}
return false;
}
public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}
三.String中Equals的源码分析
最后给大家分析一下String中Equals方法的源码
public boolean equals(Object anObject) {//先判断传进来的对象是否相等,若相等直接输出true
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
//乍一看感觉这个if语句可能写错了,object不是顶级父类吗?那这个if判断不是永为false
//其实这里的instanceof是判断的运行类型
//不理解的读者可以看一下我写的多态的那篇文章,希望对你有所帮助
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])//判断字符串是否相等
return false;
i++;
}
return true;
}
}
return false;
}