java中Object源码理解

  • getClass()

    返回是的此object运行时的类,返回的对象是被object锁定的对象,调用这个方法不须要进行强转java

    public static void main(String[]args){ @Data class Demo{ private Integer age; private String name; } Demo demo = new Demo(); Class c = demo.getClass(); //获取类的名称
            System.out.println("类的名称----"+c.getName()); //方法的对象 类中的一个方法就是一个对象(能够获取方法的名称,获取方法的参数类型,获取方法的 返回类型)
            Method[]methods = c.getMethods(); for (int i = 0; i < methods.length; i++) { System.out.println("方法的名称------" + methods[i].getName()); System.out.println("方法的返回类型------" + methods[i].getReturnType()); Class[] params = methods[i].getParameterTypes(); for (int j = 0; j < params.length; j++) { System.out.println("方法的参数类型------" + params[j]); } } }
  • hashCode()

    这个方法返回该对象的哈希码值,支持这个方法主要是为了提高哈希表的性能如(java.util.HashMap),这个方法返回类型为一个Integer类型;同一个对象调用屡次这个方法返回的hashCode值必定会相同;若是两个对象调用equals方法比较返回true,那么这个对象的hashCode值必定相等;若是两个对象调用equals方法返回为false那么这个对象的hashCode值必定不相同.  ide

    public static void main(String[] args) { @Data class Demo { private Integer age; private String name; } //hashCode()方法
            Demo d = new Demo(); d.setName("张三"); d.setAge(12); Demo d1 = new Demo(); d1.setName("李四"); d1.setAge(12); //获取对象的hashCode值
            Integer hashCode = d.hashCode(); System.out.println("张三的hashCode值为---------" + hashCode); //两个对象的hashCode值(两个对象不相等)
     System.out.println(d.equals(d1)); System.out.println(d.hashCode() + "-------------" + d1.hashCode()); //两个对象的hashCode值(两个对象相等)
            d1.setName("张三"); System.out.println(d.equals(d1)); System.out.println(d.hashCode() + "-------------" + d1.hashCode()); }
  • equals

    这个方法主要比较其余对象和此对象是否相等,返回类型为布尔型对于非空对象主要有:性能

    (1)若是同一个对象调用equals方法,返回truespa

    (2)若是obj.equals(obj2)返回的是true,那么obj2.equals(obj)也返回true,也称为equals方法的对称性线程

    (3)equals方法的传递性,若是x.equals(y)和y.equals(z)都返回true,那么x.equals(z)也必定返回truecode

    (4)equals方法的一致性,若是x.equals(y)返回true或者false,那么无论多少次调用都应该返回相同的结果对象

    (5)对于任何非空的对象,x.equals(null),都返回falseblog

    (6)若是x.equals(y)返回true,只有x和y引用同一个对象,那么x==y返回trueip

    (7)若是两个对象调用equals方法返回true,那么这两个对象的hashCode值必定相同get

  • toString

    通常咱们构建实体的时候重写此方法,若是不进行重写,那么默认返回"getClass().getName() + '@' + Integer.toHexString(hashCode())"

  • notify()

    主要唤醒在这个对象上等待的单个线程,选择哪一个线程是随机的,线程等待的对象是经过调用wait方法监控的对象,被唤醒的对象会释放当前对象上的锁;

    被唤醒的线程只能是当前对象监视管理的线程,那么对线程的监视管理有三种方式:

    (1)经过执行该对象的同步实例方法

    (2)加synchronized

    (3)执行该类的同步静态方法

    每一个线程只能有一个对象监视管理

  • notifyAll()

    唤醒正在此对象监视器上等待的全部线程,详见notify方法

  • wait(long)/wait(long,int)/wait()

    使当前线程等待,知道其余线程调用notify()或者notifyAll()或者已经超时才会唤醒,当前线程必须是在当前的对象的监视管理中;

  notify()/notifyAll()/wait():示例代码

  

/** * @title: ThreadDemo * @projectName umBasic * @description: TODO * @author wh * @date 2019/7/617:58 */
package com.um.test; public class ThreadDemo { public static void main(String[]args){ Goods goods = new Goods(); Thread t1 = new Thread(new Runnable() { @Override public void run() { try{ goods.product(); }catch (Exception e){ e.printStackTrace(); } } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { try{ goods.customer(); }catch (Exception e){ e.printStackTrace(); } } }); Thread t3 = new Thread(new Runnable() { @Override public void run() { try{ goods.customer(); }catch (Exception e){ e.printStackTrace(); } } }); t1.start(); t2.start(); t3.start(); } } class Goods{ private static Integer Max_COUNT=10; Integer goodsNum = 0; public synchronized void product() throws InterruptedException{ while (true){ System.out.println(Thread.currentThread().getName()+"product"+goodsNum); Thread.sleep(10); if(goodsNum>Max_COUNT){ System.out.println("数量超出无需生产"); wait(); }else{ goodsNum++; } notifyAll(); } } public synchronized void customer() throws InterruptedException{ while (true){ System.out.println(Thread.currentThread().getName()+"product"+goodsNum); Thread.sleep(10); if(goodsNum<=0){ System.out.println("数量不够"); wait(); }else{ goodsNum--; } notifyAll(); } } }
相关文章
相关标签/搜索