java equals使用_Java的equals方法使用方法

[JDK1.4, 1.5 的 String Class 代码如下[code]public final class String    implements java.io.Serializable, Comparable, CharSequence{    /** The value is used for

在标准Java库中包含150多个equals方法的实现,这里给出一个比较完美的实现方法。

1)显示参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量。

2)检测this与otherObject是否引用同一个对象:

if(this == otherObject) return true;

这条语句只是一个优化。实际上这是一种经常使用的形式。

3)检测otherObject是否为null,如果为null,返回false。这项检测很必要。

if(otherObejct == null) return false;

比较this与otherObject是否为属于同一个类。如果equals的语义在每个子类中有所改变,就使用getClass检测:

if(getClass() != otherObject.getClass())  return false;

如果所有的子类都拥有统一的语义,就使用instanceof检测:

if(!(otherObejct instanceof ClassName))  return false;

4)将otherObject转换为相应的类类型变量:

ClassName other = (ClassName)otherObject;

5)现在开始对所有需要比较的域进行比较了。使用==比较基本类型域,使用equals比较对象域。如果所有的域都匹配,就返回true,否则返回false。

return field == other.field&&field.equals(other.field)&&...;

如果在子类中重新定义equals,就要在其中包含调用super.equals(other)。[java == 和 equals() 方法使用:         String a = "abc";         String b="ab";         String c=b+"c";         System.out.println(a==c); // false

import java.util.*;

public class EqualsTest

{

public static void main(String[] args)

{

Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);

Employee alice2 = alice1;

Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);

Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);

System.out.println("alice1 == alice2: " + (alice1 == alice2));

System.out.println("alice1 == alice3: " + (alice1 == alice3));

System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));

System.out.println("alice1.equals(bob): " + alice1.equals(bob));

System.out.println("bob.toString(): " + bob);

Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);

Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);

boss.setBonus(5000);

System.out.println("boss.toString(): "+ boss);

System.out.println("carl.equals(boss): " + carl.equals(boss));

System.out.println("alice1.hashCode(): " + alice1.hashCode());

System.out.println("alice3.hashCode(): " + alice3.hashCode());

System.out.println("bob.hashCode(): " + bob.hashCode());

System.out.println("carl.hashCode(): " + carl.hashCode());

}

}

class Employee

{

public Employee(String n, double s, int year, int month, int day)

{

name = n;

salary = s;

GregorianCalendar calendar = new GregorianCalendar(year, month-1, day);

hireDay = calendar.getTime();

}

public String getName()

{

return name;

}

public double getSalary()

{

return salary;

}

public Date getHireDay()

{

return hireDay;

}

public void raiseSalary(double byPercent)

{

double raise = salary*byPercent/100;

salary += raise;

}

public boolean equals(Object otherObject)

{

//a quick test to see if the objects are identical

if(this == otherObject)

return true;

//must return false if the explicit parameter is null

if(otherObject == null)

return false;

//if the classes don't match, they can't be equal

if(getClass() != otherObject.getClass())

return false;

//now we know otherObject is a non-null Employee

Employee other = (Employee)otherObject;

//test whether the fields have identical values

return name.equals(other.name)

&& salary == other.salary

&& hireDay.equals(other.hireDay);

}

public int hashCode()

{

return 7*name.hashCode() + 11*new Double(salary).hashCode()

+ 13*hireDay.hashCode();

}

public String toString()

{

return getClass().getName() + "[name=" + name

+ ",salary=" + salary + ",hireDay=" + hireDay

+ "]";

}

private String name;

private double salary;

private Date hireDay;

}

class Manager extends Employee

{

public Manager(String n, double s, int year, int month, int day)

{

super(n, s, year, month, day);

bonus = 0;

}

public double getSalary()

{

double baseSalary = super.getSalary();

return baseSalary + bonus;

}

public void setBonus(double b)

{

bonus = b;

}

public boolean equals(Object otherObject)

{

if(!super.equals(otherObject))

return false;

Manager other = (Manager)otherObject;

//super.equals checked that this and other belong to the same class

return bonus == other.bonus;

}

public int hashCode()

{

return super.hashCode() + 17*new Double(bonus).hashCode();

}

public String toString()

{

return super.toString() + "[bonus=" + bonus + "]";

}

private double bonus;

}

运行结果:

--------------------Configuration: --------------------

alice1 == alice2: true

alice1 == alice3: false

alice1.equals(alice3): true

alice1.equals(bob): false

bob.toString(): Employee[name=Bob Brandson,salary=50000.0,hireDay=Sun Oct 01 00:00:00 CST 1989]

boss.toString(): Manager[name=Carl Cracker,salary=80000.0,hireDay=Tue Dec 15 00:00:00 CST 1987][bonus=5000.0]

carl.equals(boss): false

alice1.hashCode(): 377780067

alice3.hashCode(): 377780067

bob.hashCode(): 955285015

carl.hashCode(): 386513600

Process completed.

[java String的equals,intern方法 JAVA中的equals和==的区别 ==比较的是2个对象的地址,而equals比较的是2个对象的内容。 显然,当equals为true时,==不一定为tr

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值