java Object 类解析

1. object类大家都知道,在java.lang.Object中,object类是所有类的超类,包括数组都implement object类。

2.object类中有以下内容:

      private static native void registerNatives();
      static {
        registerNatives();
       }

  public final native Class<?> getClass();

  public native int hashCode();

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

protected native Object clone() throws CloneNotSupportedException;

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

 public final native void notify();

 public final native void notifyAll();

 public final native void wait(long timeout) throws InterruptedException;

protected void finalize() throws Throwable { }

具体可以查看jdk这种object的源码,下面就部分进行详细描述。

3.native 关键字

     该关键字在开发中不被频繁使用,native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不在当前文件,而是再用其他语言,我们知道java不能直接对操作系统进行访问和操作,但是可以通过JNI(java native interface)接口调用c语言实现对底层的访问。

详细的使用可参照博客:https://www.cnblogs.com/b3051/p/7484501.html

4.hashCode()和equals()

为什么object类上有hashcode,它的作用是什么,hashcode和equals怎么配合使用、equals使用时的注意事项等。这里可以有一连串的笔试面试问题。

    hash:哈希,我们都听过,但到底什么是哈希?带这些问题本人深入了解类一下。哈希(散列)大概是value = hash(key),主要作用:将任意长度的数据映射到有限的长度的域,hash算法的产生方式大体可以分为三种基本方法:加法,乘法和移位。

具体实现可参照博客:https://www.cnblogs.com/coder2012/p/3954736.html,这人评价还不错。

这里hashcode()返回的是该对象的一个唯一的hash值,对象稍微改对应的hash值亦发生变化。通过比较hashcode()返回值和调用equals()方法,程序程序就可以判断用一个对象在运行过程是否发生变化。

注意:一般重写equals方法时需要重写hashcode(),而且需要注意equals()需要满足的条件

简单来讲就是判断相等的条件就是:

   (1)自反性:任何不为空的引用值x,x.equals(x) 返回ture

     (2)  对称性:任何不为空的引用值x和y,x.equals(y)返回ture当且仅当y.equals(x)为true.

     (3) 传递性:任意不为空的引用值x、y、z,x.euqals(y)而且y.equals(z),x.equals(z)返回true.

     (4)一致性:对于任何非空引用值x和y,对x.equals(y)的多次调用始终返回true或始终返回false,前提是在对对象的equals比较中不使用任何信息进行修改.

     (5) 对任何不为空的引用值x,x.equals(null)返回false.

5.toStringa()

    返回class对象@hashcode

6.notify()、notifyAll()、wait()

以上方法都是用在控制线程状态:

  notify():唤醒一个正在等待这个对象的线程,通俗来讲就是某一个持有对象锁的线程准备释放对象锁权限(同一个对象同一时间只能由一个线程使用,不然会出现数据不一致的情况),这个时候jvm唤醒一个正在等待的线程,直到之前线程结束Synchronized代码块作用域时,新线程获得对象锁,其他线程仍然等待。

   notifyAll();唤醒所有等待这个对象的线程,持有对象锁的线程正准备释放对象锁权限,通知jvm唤醒所有等待线程,之前的线程结束Synchronized代码块,JVM通过算法将对象锁指派给某一个线程,这里涉及到锁池和等待池;简单解释一下

锁池(monitor):简单理解就是一个对象正在被一个线程使用,其对象锁状态为使用中,其他线程需要使用这个对象需要等待。

等待池(wait):某一线程释放该对象的对象锁,调用wait()方法后就会进入该对象的等待池中,等待notify()或者notifyAll()h唤醒进入锁池等待执行(processed)。

注意:尽量使用notifyAll(),notify()容易发生死锁。

..

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值