在Java开发中,我们经常会用到这两个比较运算符,因此掌握它们的用法显得十分重要,下面是我的一些理解,欢迎批评指正:

1. 首先,他们的共同点是参与比较的类型必须一致,或者是父类与子类的关系,否则就无法进行比较。

2. “==”常用来比较两个基本类型,比如int,long,float…等,而equals只能用来比较引用类型。

3. “==”也可以用来比较两个引用类型,比较时判断两个变量是不是指向同一个引用,即这两个值是不是存储在同一块内存空间,下面打印结果为:true

String a = “hello";
String b = "hello";
System.out.println(a == b);

另外一种情况的打印结果为:false

String a = new String(“hello");
String b = new String("hello");
System.out.println(a == b);

后一种情况下,两次都开辟了新的内存空间,所以a和b被看成不同的引用。

然而我们在比较两个字符串相等时,如果用”==“就显得没有意义,因为他只能判断他们是否指向同一个引用,而并不是比较两个字符串的内容。如果要比较两个引用类型的内容的话,就要用到equals方法了。

下面这个情况的打印结果为true

String a = new String(“hello");
String b = new String("hello");
System.out.println(a.equals(b));

因为他们的类型相同,且内容也相同,所以返回为TRUE。

4.equals方法是Object类的方法,所以这个方法可以被重写。许多包装类如Double, Integer…等都重写了这个方法。举个例子:


//实体类
public class Person {
private String name;
private int age;
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 Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object arg0) {
// TODO Auto-generated method stub
if(this==arg0)return true;
if(!(arg0 instanceof Person)) return false;
Person p = (Person)arg0;
if(p.name == this.name)return true;
return false;
}

}

//测试类
public class TestEqual {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));

Person p1 = new Person("Tom", 23);

Person p2 = new Person("Tom", 22);

System.out.println(p1==p2);
System.out.println(p1.equals(p2));

}

}

我们通过重写equals方法,可以指定Person的name属性相同就可以确定两个此类型的变量相等。打印结果为true.如果用”==”的话,结果应该是false.

本文系个人原创,转载时请注明出处!

VN:F [1.7.9_1023]
Rating: 0.0/10 (0 votes cast)
VN:F [1.7.9_1023]
Rating: 0 (from 0 votes)

标签:, ,

Leave your comment