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文件 } }
相关文章推荐
- 在C#的类或结构中重写ToString方法的用法简介
- Equals和==的区别 公共变量和属性的区别小结
- javascript实现类似java中getClass()得到对象类名的方法
- ToString()使用方法汇总(c#)
- java String 类的一些理解 关于==、equals、null
- Java反射学习 getClass()函数应用
- hashCode方法的使用讲解
- C#使用Equals()方法比较两个对象是否相等的方法
- js字符串的各种格式的转换 ToString,Format
- JavaScript中toString()方法的使用详解
- JavaScript中Object.prototype.toString方法的原理
- 浅谈c#.net中巧用ToString()将日期转成想要的格式
- JavaScript中用toString()方法返回时间为字符串
- C#值类型、引用类型中的Equals和==的区别浅析
- javascript中tostring()和valueof()的用法及两者的区别
- JavaScript的Number对象的toString()方法
- asp.net ToString()格式设置大全
- Javascript中valueOf与toString区别浅析
- java的equals和==的比较示例
- java必学必会之equals方法