搞清楚一道關於Integer的面試題

請看題1:面試

   {
       ([] ) {
           ;
           ;
           ;
           ;
        ..(  );
        ..(  );
    }
}

上面這道題輸出:ide

false
true

由於Java的自動拆箱和自動封箱,那麼spa

Integer a = 888;

就是至關於orm

Integer a = new Integer(888);

天然上面的變量a和b都是各自指向不一樣的對象引用地址。那麼答案就確定是false。對象

那爲何c===d就是指向同一個對象呢?內存

再來看看,Integer中部分源碼ci

    
       ( ) {
        
         (  .    .)
             .[  (.)];
          ();
    }
    
        {
             ;
           ;
        
           [];

         {
            
                
            
              ;
            
            
               [(  )  ];
               ;
            (   ;   .; )
                
                
                []   ();
        } 
        () {}
    }

面試題2:源碼

   {
       ([] ) {
            ();
        ();
        ..();
    }
      ( ){
         ();
    }
}

上面應該輸出多少呢?it

面試題3:form

   {
       ([] ) {
            ();
          ;
        ..();
    }
}

這裏又將輸出多少呢?

繼續看源碼:

        {
  
  
     ;
   ( ) {
     .  ;
 }
}

面試題3中的a=99至關於a=new Integer(99);從新給把一個新的對象引用地址給了a,因此a變了,最後輸出是99。

那麼面試題2呢?

咱們都知道在Java中,Java 只有值傳遞,只不過值傳遞分爲:內存中數值的值傳遞以及內存地址數值的值傳遞,傳遞一個Integer變量參數進去,其實是構建了一個副本,經過這個副本咱們只能去修改原來Integer變量的非final成員變量(假若有的話,也能夠是其餘類型),上面也說了,若是去修改Integer類型的final變量,那麼是會新new一個Integer變量,去覆蓋這個變量副本,因此原來的Integer a變量仍是原來的,僅僅是test這個方法裏的副本變量變了,這麼理解就清楚了。因此面試題2 輸出88。

相關文章
相關標籤/搜索