学习笔记之Object类(Java8)

2019-07-22  本文已影响0人  lirudong

1.Object类中有哪几个方法?
2.hashCode方法有什么用?
3.hashCode()equals()的区别?

如果你不是很清楚请往下看

首先有一下几个方法

屏幕快照 2019-07-22 上午9.10.17.png

1 hashCode和equals函数用来判断对象是否相同

首先参考一下别人的博客:http://blog.csdn.net/hla199106/article/details/46907725

1.1 ==

***对象是放在堆栈中的,栈中存放的是对象的引用(地址),由此可见==是对栈中的值进行比较的。如果要对栈中的对象内容进行比较的话,就要重写equals()方法了

1.2 equals()
先看一下默认的方法,判断是不是同一个对象

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

以下是String的equals方法

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = length();
            if (n == anotherString.length()) {
                int i = 0;
                while (n-- != 0) {
                    if (charAt(i) != anotherString.charAt(i))
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

判断流程为:
即String中equals方法判断相等的步骤是:

1、若A==B 即是同一个String对象 返回true
2、若对比对象是String类型则继续,否则返回false
3、判断A、B长度是否一样,不一样的话返回false
4、逐个字符比较,若有不相等字符,返回false

重新实现equals()方法需要满足以下5个特性:自反,对称,传递,一致,非空性

1.3 、hashcode()

  hashCode() 方法返回的就是一个数值,从方法名称上可以看出,其目的就是生成一个hash码,hash码的主要用途就是在对对象进行散列的时候作为key输入,据此可以推断出我们需要每个对象的hash码尽可能不相同,这样才可能保证散列的存取性能。哈希算法也称为散列算法,是将数据依特定的算法直接指定到一个地址上。
   初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。

1.4 hashcode() 和 equals() 的区别

1、如果两个对象equals(),Java运行时环境会认为他们的hashcode一定相等。 
2、如果两个对象不equals,他们的hashcode有可能相等。 
3、如果两个对象hashcode相等,他们不一定equals。 
4、如果两个对象hashcode不相等,他们一定不equals。
2 wait(),wait(long),wait(long,int),notify(),notifyAll()
这几个函数体现的是Java的多线程机制
在使用的时候要求在synchronize语句中使用
wait()用于让当前线程失去操作权限,当前线程进入等待序列
notify()用于随机通知一个持有对象的锁的线程获取操作权限
notifyAll()用于通知所有持有对象的锁的线程获取操作权限
wait(long) 和wait(long,int)用于设定下一次获取锁的距离当前释放锁的时间间隔
3 toString()和getClass()

toString()返回一个String对象,用来标识自己
如Object默认

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

getClass()返回一个Class对象。

4 clone()

使用clone方法的几个条件:

1)在派生类中实现Cloneable借口。
2)为了获取对象的一份拷贝,我们可以利用Object类的clone方法。
3)在派生类中覆盖积累的clone方法,声明为public。
4)在派生类的clone方法中,调用super.clone()。

具体:http://www.cnblogs.com/gw811/archive/2012/10/07/2712252.html

5 finalize()用于在垃圾回收
6 registerNatives() 本地注册

native修饰的方法表示本地方法(跟系统有关,也可以理解为这个方法不是在java中实现的),据说这个方法在一个名为java.dll的动态库文件中。Object类中第40行(我的是jdk1.8)开始的 static{ registerNatives(); } 表示的是在类被加载时,调用 registerNatives()方法进行一些跟系统有关的方法调用,而这个方法的实现就在java.dll中(里面会根据不同系统来执行不同的底层操作)。

上一篇 下一篇

猜你喜欢

热点阅读