Object类

Object类

Java中有一个比较特殊的类,就是 Object类,它是所有类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类就默认继承 Object类。因此,Object类是 Java 类层中的最高层类,是所有类的超类也称之为基类。

Object类的方法

Object类提供了许多方法。 它们如下:

    • protected Objectclone()

      创建并返回此对象的副本。

      booleanequals(Object obj)

      指示一些其他对象是否等于此。

      protected voidfinalize()

      当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。

      <?>getClass()

      返回此 Object的运行时类。

      inthashCode()

      返回对象的哈希码值。

      voidnotify()

      唤醒正在等待对象监视器的单个线程。

      voidnotifyAll()

      唤醒正在等待对象监视器的所有线程。

      StringtoString()

      返回对象的字符串表示形式。

      voidwait()

      导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。

      voidwait(long timeout)

      导致当前线程等待,直到另一个线程调用 notify()方法或该对象的 notifyAll()方法,或者指定的时间已过。

      voidwait(long timeout, int nanos)

      导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法,或者某些其他线程中断当前线程,或一定量的实时时间。

1.关于 toString() 方法

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

根据自己得业务需求,重写toString() 方法能够很好得显示出自己需要打印得效果。

  public String toString() {

     return "姓名" + this.name + ",年龄:" + this.age + "岁";  

  }

2:关于 equals() 方法

比较两个对象是否一致,在Object类内默认方式是比较两个对象的地址是否一致。

    代码中存在一些情况,需要比较的是两个对象中保存的内容是一致的,但是使用Object类内继承而来的equals方法,是不合理的!!!

Object中的equals源代码如下:

    public boolean equals(Object obj) {
        return (this == obj);
    }

/*                                                                   
 * 重写equals方法                                                        
 *         1. 判断两个对象是不是同一个对象。如果调用方法的类对象和传入参数类对象    
 *         地址一致,那就是同一个对象,返回true,搞定!!!         
 *                                                                   
 *         2. equals方法参数是Object类型,那也就是说任何类型的数据都可以作为参数。   
 *         两个数据类型不一致,是否需要进行比较操作。                               
 *         判断数据类型是否一致                                                   
 *         使用关键字 instanceOf,同数据类型继续运行,非同类型,结束判断返回false   
 *         格式:                                                          
 *             类对象 instanceOf 类名                                        
 *                                                                   
 *         3. 判断对象中保存的数据                                                
 *             Student中我们比较id, name, age, gender就可以了                    
 *                                                                      
 */                                                                  
@Override                                                            
public boolean equals(Object obj) {                                  
    // 1. 判断是不是同地址对象                                                 
    if (this == obj) {                                               
        return true;                                                 
    }                                                                
                                                                     
    // 2. 类型是否一致                                                     
    if (!(obj instanceof Student)) {                                 
        return false;                                                
    }                                                                
                                                            
    // 数据类型强制转换                                                      
    Student stu = (Student) obj;                                     
    return this.id == stu.id                                         
            // this.name.equals(stu.name) 该equals方法是String类equals方法  
            && this.name.equals(stu.name)                            
            && this.age == stu.age                                   
            && this.gender == stu.gender;                            
                                                                     
}        

注意:equals()== 的区别:

  • 在Java中,任何类型的数据都可以用 “==”进行比较是不是相等,一般用于基本数据类型的比较,比较器存储的值是否相等。但是如果用于引用类型的比较,则是比较所指向对象的地址是否相等,在这点上,跟object类提供的equals()方法的作用是一致的。
  • 对于equals()方法

1) 首先,不能用于基本数据类型的变量之间的比较相等;

2) 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

3) 诸如StringDate等类都对equals方法进行了重写,比较的是所指向的对象的内容。

3.关于 hashCode() 方法                          

    在Object类内,hashCode方法,返回的内容是当前对象的空间首地址十进制展示方式。    
    当前类重写equals方法之后,两个当前类对象比较结果为true,那么要求这两个对象的hashCode必须一致!!!
    hashCode使用有一个唯一原则。
    一般会参考参与equals比较的所有成员变量来组成对应的hashCode,这里会使用到一些Java中提供的计算哈希值的方法。
    
    hashCode使用未进行重写的情况下,会使用地址作为hashCode对应的数据,重写之后,不再使用地址。重写之后hashCode 不对应当前对象所在地址。

源代码如下:

                public native int hashCode();     

        1、hashCode方法返回值是int类型的散列码,对象的散列码是为了更好的支持基于哈希机制的java集合类,例如Hashtable,HashMap,HashSet。如果重写equals方法,也要重写hashCode方法。
        2、hashCode方法的一致约定要求
         2.1 在java应用的一次执行过程中,对于同一个对象的hashCode方法的多次调用,他们应该返回同样的值(前提是该对象的信息没有发生变化);
         2.2、对于两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode值一定是相同的;
         2.3 对于两个对象来说,如果使用equals方法返回false,那么这两个对象的hashCode值不要求一定不同(可以相同,可以不同),但是如果不同则可以提高应用的性能。
         2.4 对于Object类来说,不同Object对象的hashCode值是不同的(Object类的hashcode值表示的是对象的地址)。
        3、 hashCode方法应用举例:
        当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合对象中的hashCode值是否与增加的对象的hashCode值一致;如果不一致,直接加进去;如果一致,在进行equals方法比较,equals方法返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。
        4、hashCode编写指导
        在编写hashCode时,由于返回值是个int值,故不能溢出。不同对象的hash尽量不同,避免hash冲突                        

原文地址:https://www.cnblogs.com/HW-CJY/p/13751693.html