java 相同对象equals_java 对象比较 判断两个对象的某些或某个属性相同 这对象相等。...

知识点:重写equals()方法

首先来看一些文字性的东西:

一、简单类型比较

Java中,比较简单类型变量用“==”,只要两个简单类型值相等即返回ture,否则返回false;

二、引用类型比较

引用类型比较比较变态,可以用“==”,也可以用“equals()”来比较,equals()方法来自于Object类,每个自定义的类都可以重写这个方法。Object类中的equals()方法仅仅通过“==”来比较两个对象是否相等。

在用“==”比较引用类型时,仅当两个应用变量的对象指向同一个对象时,才返回ture。言外之意就是要求两个变量所指内存地址相等的时候,才能返回true,每个对象都有自己的一块内存,因此必须指向同一个对象才返回ture。

在用“equals()”比较引用类型时,情况就比较复杂,甚至有些变态,容易掉进陷阱。

在Java  API中,有些类重写了equals()方法,它们的比较规则是:当且仅当该equals方法参数不是 null,两个变量的类型、内容都相同,则比较结果为true。这些类包括:String、Double、Float、Long、Integer、Short、Byte、、Boolean、BigDecimal、BigInteger等等,太多太多了,但是常见的就这些了,具体可以查看API中类的equals()方法,就知道了。

解析变态的Boolean类:在这些类中,最最变态的是要数Boolean类了,我感觉是开发Boolean类的人员头脑进水了。我也不想细说了,你有好四中方式来创建一个Boolean对象(两构造方法,两个静态方法valueOf(),推荐用静态方法)。

Boolean类的变态之处不在于其equals()方法。而是在于Boolean对象创建方法。其实Boolean类的对象最多有两个,其toString()值分别是true和false。当且仅当用true或者"true"创建的Boolean类为同一个对象且toString()值为true。其他的字符串或者false创建的Boolean对象的值一律相等且toString()值为false。

三、重写equals()方法

在定义一个类的时候,如果涉及到对象的比较,应该重写equals()方法。重写的一般规则是:

1、先用“==”判断是否相等。

2、判断equals()方法的参数是否为null,如果为null,则返回false;因为当前对象不可能为null,如果为null,则不能调用其equals()方法,否则抛java.lang.NullPointerException异常。

3、当参数不为null,则如果两个对象的运行时类(通过getClass()获取)不相等,返回false,否则继续判断。

4、判断类的成员是否对应相等。往下就随意发挥了。呵呵!

下面根据 (三)来看下具体例子:

要求: 从一个List对象中,判断是否包含一个对象。只要List中的某一个对象的 username 属性和想要比较的user对象的username相等,则证明两个对象相等。

user.java

publicclassUser {

privateString username;

privateString password;

privateString gender;

privateintage;

publicUser(String username, String password, String gender,intage) {

this.username = username;

this.password = password;

this.gender = gender;

this.age = age;

}

publicString getUsername() {

returnusername;

}

publicvoidsetUsername(String username) {

this.username = username;

}

publicString getPassword() {

returnpassword;

}

publicvoidsetPassword(String password) {

this.password = password;

}

publicString getGender() {

returngender;

}

publicvoidsetGender(String gender) {

this.gender = gender;

}

publicintgetAge() {

returnage;

}

publicvoidsetAge(intage) {

this.age = age;

}

//注意这里重写了equals方法

@Override

publicbooleanequals(Object obj){

if(obj == null){

returnfalse;

}else{

if(this.getClass() == obj.getClass()){

User u = (User) obj;

if(this.getUsername().equals(u.getUsername())){

returntrue;

}else{

returnfalse;

}

}else{

return false;

}

}

}

}

public class User {

private String username;

private String password;

private String gender;

private int age;

public User(String username, String password, String gender, int age) {

this.username = username;

this.password = password;

this.gender = gender;

this.age = age;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

//注意这里重写了equals方法

@Override

public boolean equals(Object obj){

if(obj == null){

return false;

}else {

if(this.getClass() == obj.getClass()){

User u = (User) obj;

if(this.getUsername().equals(u.getUsername())){

return true;

}else{

return false;

}

}else{

return false;

}

}

}

}

CompareUser.java

importjava.util.ArrayList;

importjava.util.List;

publicclassCompareUser {

/**

* @param args

*/

publicstaticvoidmain(String[] args) {

User u1 = newUser("zhangsan","222","男",12);

User u2 = newUser("lisi","333","男",15);

User u3 = newUser("wangwu","555","女",13);

User u4 = newUser("zhangsan","444","女",14);

List users = newArrayList();

users.add(u1);

users.add(u2);

users.add(u3);

booleanisEqual = users.contains(u4);

System.out.println("u1与u4的比较结果是:"+isEqual);

}

}

import java.util.ArrayList;

import java.util.List;

public class CompareUser {

/**

* @param args

*/

public static void main(String[] args) {

User u1 = new User("zhangsan","222","男",12);

User u2 = new User("lisi","333","男",15);

User u3 = new User("wangwu","555","女",13);

User u4 = new User("zhangsan","444","女",14);

List users = new ArrayList();

users.add(u1);

users.add(u2);

users.add(u3);

boolean isEqual = users.contains(u4);

System.out.println("u1与u4的比较结果是:"+isEqual);

}

}

最终结果是 true,说明u1和u4相等。

四、总结

“==”比较对象是否引用了同一个对象,或者比较简单类型变量值是否相等。

Object类的equals()方法用来比较是否一个对象(内存地址比较),可以重写。

JDK中有些类重写了equals()方法,只要类型、内容都相同,就认为相等。

很变态的Boolean类,仅存在两个实例。具体可查看API。

一般来说,一个类如果涉及到比较,应该重写equals()方法,因为内存地址比较没有意义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值