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(); } } }
相關文章
相關標籤/搜索