您的位置:首页 > 移动开发 > Objective-C

Object常用方法介绍及注意事项equals(),hashCode(),getClass(),toString()

2016-04-14 23:54 836 查看

equals

public boolean equals()

官方API描述 :

equals 方法在非空对象引用上实现相等关系 Object 类的 equals

方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回

true(x == y 具有值 true)。 实际中,根据对象 的特有内容来判断对象是否相同,覆盖此方法

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode

方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

Object的equals()方法比较的是地址,但是实际开发中一般根据对象 的特有内容来判断对象是否相同,覆盖此方法。

hashCode

public int hashCode()

官方API描述 :

hashCode 的常规协定是:

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals

比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 如果根据

equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。

如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode

方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 实际上,由 Object

类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是

JavaTM 编程语言不需要这种实现技巧。)

getClass

public final Class
<?>
getClass()返回此 Object 的运行时类。

官方API描述 :

返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。

实际结果类型是 Class
<? extends |X|>
,其中 |X| 表示清除表达式中的静态类型,该表达式调用 getClass。 例如,以下代码片段中不需要强制转换:

Number n = 0;

Class
<? extends Number>
c = n.getClass();

当我们在创建对象时,必须先有类.class文件加载完成,然后通过.class文件获取到里面的具体内容,包括属性及行为,所以对于同一个类型的对象getClass()获取的内容时相同的

toString

public String toString()返回该对象的字符串表示。

官方API描述 :

通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at

标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + ‘@’ + Integer.toHexString(hashCode())

实际中建议所有子类都覆写这个方法来实现特有功能

代码演示

class Demo
{
private int age;
Demo(){}
Demo(int age)
{
this.age = age;
}

//根据对象 的特有内容来判断对象是否相同,覆盖此方法
public  boolean equals(Object o)
{

if(o instanceof Demo)
return this.age == ((Demo)o).age;//这里必须做类型转换,否则Object对象不能访问子类特有内容
else
throw new ClassCastException("类型错误!");
}

//实际情况中若覆写了equals方法,也要覆写hashCode()方法,以保证相同对象产生相同哈希值
public int hashCode()
{
return age;//瞎写的
}
}
class EqualDemo
{
public static void main(String[] args)
{
//equals测试
Demo d = new Demo(10);
Demo d1 = new Demo(10);
Demo d2 = d;
System.out.println(d.equals(d1));
System.out.println(d.equals(d2));

//hashCode测试
System.out.println(d.toString()+'\n'+d1.toString()+'\n'+d2.toString());
//打印对象哈希值
//Demo@2a139a55
//Demo@15db9742
//Demo@2a139a55

System.out.println(d.hashCode());//哈希值的十进制705927765
//System.out.println(Integer.toHexString(d.hashCode()));//同样是705927765
System.out.println("d哈希值 : "+d.hashCode()+"d2哈希值 : "+d2.hashCode());//d哈希值 : 10d2哈希值 : 10

//getClass()测试
Class  c1 = d.getClass();
Class c2 = d1.getClass();
System.out.println(c1==c2);//true,因为c1,c2产生自同一个Class文件

}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息