最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

挑戰(zhàn)4道Java試題

 更新時間:2015年12月21日 14:49:17   作者:_Himan_  
這篇文章主要為大家分享了4道Java基礎題,幫助大家鞏固基礎知識,夯實java基礎技能,感興趣的朋友快點挑戰(zhàn)

四道Java基礎題,你能對幾道?

一、==符的使用
首先看一段比較有意思的代碼

Integer a = 1000,b=1000; 
Integer c = 100,d=100;  public void mRun(final String name){ 
    new Runnable() { 
       
      public void run() { 
        System.out.println(name); 
      } 
    }; 
  } 
   
 
System.out.println(a==b); 
System.out.println(c==d); 

如果這道題你能得出正確答案,并能了解其中的原理的話。說明你基礎還可以。如果你的答案 是 true 和true的話,你的基礎就有所欠缺了。
首先公布下答案, 運行代碼,我們會得到 false  true。我們知道==比較的是兩個對象的引用,這里的abcd都是新建出來的對象,按理說都應該輸入false才對。這就是這道題的有趣之處,無論是面試題還是論壇討論區(qū),這道題的出場率都很高。原理其實很簡單,我們去看下Integer.java這個類就了然了。

public static Integer valueOf(int i) { 
   return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128]; 
 } 
 
 /** 
  * A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing 
  */ 
 private static final Integer[] SMALL_VALUES = new Integer[256]; 
 
 static { 
   for (int i = -128; i < 128; i++) { 
     SMALL_VALUES[i + 128] = new Integer(i); 
   } 
 } 

      當我們聲明一個Integer c = 100;的時候。此時會進行自動裝箱操作,簡單點說,也就是把基本數(shù)據(jù)類型轉換成Integer對象,而轉換成Integer對象正是調用的valueOf方法,可以看到,Integer中把-128-127 緩存了下來。官方解釋是小的數(shù)字使用的頻率比較高,所以為了優(yōu)化性能,把這之間的數(shù)緩存了下來。這就是為什么這道題的答案回事false和ture了。當聲明的Integer對象的值在-128-127之間的時候,引用的是同一個對象,所以結果是true。
二、String
接著看代碼

String s1 = "abc"; 
String s2 = "abc"; 
String s3 = new String("abc"); 
System.out.println(s1 == s2); 
System.out.println(s1 == s3); 

大家又來猜一猜這道題的答案是什么?
       按照==的語法來看, 首先s1、s2、s3是三個不同的對象,常理來說,輸出都會是false。然而程序的運行結果確實true、false。第二個輸出false可以理解,第一個輸出true就又讓人費解了。我們知道一些基本類型的變量和對象的引用變量都是在函數(shù)的棧內存中分配,而堆內存中則存放new 出來的對象和數(shù)組。然而除此之外還有一塊區(qū)域叫做常量池。像我們通常想String s1 = "abc"; 這樣申明的字符串對象,其值就是存儲在常量池中。當我們創(chuàng)建String s1 = "abc"這樣一個對象之后,"abc"就存儲到了常量池(也可叫做字符串池)中,當我們創(chuàng)建引用String s2  = "abc" 的時候,Java底層會優(yōu)先在常量池中查找是否存在"abc",如果存在則讓s2指向這個值,不會重新創(chuàng)建,如果常量池中沒有則創(chuàng)建并添加的池中。這就是為什么答案是true 和false的原因。

三、final關鍵字
還是來看一段代碼

 public void mRun(final String name){ 
    new Runnable() { 
       
      public void run() { 
              try { 
               Thread.sleep(1000); 
              } catch (InterruptedException e) { 
               // TODO Auto-generated catch block 
              e.printStackTrace(); 
              }  
              System.out.println(name); 
      } 
    }.start(); 
  } 

      這種代碼相信大家寫過很多,當內部類訪問局部變量的時候,需要在局部變量前加final修飾符,不然編譯器就會報錯。通常我們也是這么干的。好的,第二個問題來了,為什么要加final修飾符?相信大多數(shù)小伙伴都沒有思考過這個問題,但凡使用的時候,直接加上就得了,從來沒去深究過其中的原理。這對于一個優(yōu)秀的程序員來說是不可取,我們不僅要知其然還要知其所以然。
      現(xiàn)在我們來分析一下,為什么要加final關鍵字。首先內部類的生命周期是成員級別的,而局部變量的生命周期實在方法體之類。也就是說會出現(xiàn)這樣一種情況,當mRun方法執(zhí)行,new 的線程運行,新線程里面會睡一秒。主線程會繼續(xù)執(zhí)行,mRun執(zhí)行完畢,name屬性生命周期結束。1秒之后,Syetem.out.printh(name)執(zhí)行。然而此時name已經(jīng)壽終正寢,不在內存中了。Java就是為了杜絕這種錯誤,嚴格要求內部類中方位局部變量,必須使用final關鍵字修飾。局部變量被final修飾之后,此時會在內存中保有一份局部變得的復制品,當內部類訪問的時候其實訪問的是這個復制品。這就好像是把局部變量的生命周期變長了。說到底還是Java工程師提前把這個坑給我們填了,不然不知道又會有多少小伙伴會為了內部類局部變量而發(fā)愁了。
四、Integer與int那些事
看下面代碼

Integer a = new Integer(1000); 
int b = 1000; 
Integer c = new Integer(10); 
Integer d = new Integer(10); 
System.out.println(a == b); 
System.out.println(c == d); 

這道題是繼第一題的后續(xù),如果這道題你能很快速的得出答案,那么恭喜你,==比較符你就算掌握的比較透徹了。
揭曉正確答案: true  、false
看到這個答案很多小伙伴又會不解,先來說下第二個,按第一題來說Integer不是把-128-127緩存起來了嗎?這不是應該是true嘛,但是你仔細看,這里的Integer是我們自己new出來的,并不是用的緩存,所以結果是false。 現(xiàn)在來看第一個為啥又是true了呢? 首先這里的值為1000,肯定和我們所知的Integer緩存沒有關系。既然和緩存沒有關系,a是新new出來的對象,按理說輸入應該是false才對。但是注意b這里是int類型。當int和Integer進行==比較的時候,Java會把Integer進行自動拆箱,也就是把Integer轉成int類型,所以這里進行比較的是int類型的值,所以結果即為true。

做對了幾題,快點根據(jù)自己測試的水平,進行查漏補缺吧!

相關文章

  • Java使用easyExcel實現(xiàn)導入功能

    Java使用easyExcel實現(xiàn)導入功能

    這篇文章介紹了Java使用easyExcel實現(xiàn)導入功能的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • springboot?html調用js無效400問題及解決

    springboot?html調用js無效400問題及解決

    這篇文章主要介紹了springboot?html調用js無效400的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • JAVA JVM運行時數(shù)據(jù)區(qū)詳解

    JAVA JVM運行時數(shù)據(jù)區(qū)詳解

    這篇文章主要介紹了JVM運行時數(shù)據(jù)區(qū)劃分原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-09-09
  • springboot實現(xiàn)敏感字段加密存儲解密顯示功能

    springboot實現(xiàn)敏感字段加密存儲解密顯示功能

    這篇文章主要介紹了springboot實現(xiàn)敏感字段加密存儲,解密顯示,通過mybatis,自定義注解+AOP切面,Base64加解密方式實現(xiàn)功能,本文通過代碼實現(xiàn)給大家介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • SpringBoot注入靜態(tài)屬性或靜態(tài)對象的方法

    SpringBoot注入靜態(tài)屬性或靜態(tài)對象的方法

    我們在使用SpringBoot為一些靜態(tài)屬性或者靜態(tài)對象注入時會發(fā)現(xiàn)注入不成功,我們可以以下這幾種方式把需要注入的值注入到靜態(tài)屬性中,感興趣的朋友一起看下
    2024-12-12
  • Java異常處理與throws關鍵字用法分析

    Java異常處理與throws關鍵字用法分析

    這篇文章主要介紹了Java異常處理與throws關鍵字用法,結合實例形式分析了java常見的異常、錯誤處理及throws關鍵字相關使用技巧、注意事項,需要的朋友可以參考下
    2019-01-01
  • Java Base64解碼錯誤及解決方法

    Java Base64解碼錯誤及解決方法

    本篇文章給大家從一個Java Base64解碼錯誤著手給大家分析了錯誤的原因以及解決辦法,有興趣的可以參考學習下。
    2018-02-02
  • java開發(fā)WMS倉庫商品預警需求示例解析

    java開發(fā)WMS倉庫商品預警需求示例解析

    這篇文章主要為大家介紹了java開發(fā)WMS倉庫商品預警需求示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Java通過FTP服務器上傳下載文件的方法

    Java通過FTP服務器上傳下載文件的方法

    本文介紹了如何使用Apache Jakarta Commons Net(commons-net-3.3.jar)基于FileZilla Server服務器實現(xiàn)FTP服務器上文件的上傳/下載/刪除等操作,需要的朋友可以參考下
    2015-07-07
  • MyBatis-Puls插入或修改時某些字段自動填充操作示例

    MyBatis-Puls插入或修改時某些字段自動填充操作示例

    這篇文章主要為大家介紹了MyBatis-Puls插入或修改時某些字段自動填充操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12

最新評論

乡宁县| 塔河县| 沙雅县| 东源县| 阳泉市| 微山县| 富裕县| 常宁市| 沙雅县| 石景山区| 鲁甸县| 江源县| 景德镇市| 内江市| 延安市| 康乐县| 金湖县| 临清市| 新田县| 台湾省| 敦煌市| 吴旗县| 宽甸| 皋兰县| 怀来县| 行唐县| 郎溪县| 井陉县| 油尖旺区| 闻喜县| 香格里拉县| 罗甸县| 上思县| 泗洪县| 白朗县| 枣庄市| 鲜城| 凤冈县| 永定县| 韩城市| 虞城县|