欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

四道Java基礎(chǔ)題,你能對(duì)幾道?

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

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); 

如果這道題你能得出正確答案,并能了解其中的原理的話。說(shuō)明你基礎(chǔ)還可以。如果你的答案 是 true 和true的話,你的基礎(chǔ)就有所欠缺了。
首先公布下答案, 運(yùn)行代碼,我們會(huì)得到 false  true。我們知道==比較的是兩個(gè)對(duì)象的引用,這里的abcd都是新建出來(lái)的對(duì)象,按理說(shuō)都應(yīng)該輸入false才對(duì)。這就是這道題的有趣之處,無(wú)論是面試題還是論壇討論區(qū),這道題的出場(chǎng)率都很高。原理其實(shí)很簡(jiǎn)單,我們?nèi)タ聪翴nteger.java這個(gè)類就了然了。

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); 
   } 
 } 

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

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

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

三、final關(guān)鍵字
還是來(lái)看一段代碼

 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(); 
  } 

      這種代碼相信大家寫過(guò)很多,當(dāng)內(nèi)部類訪問(wèn)局部變量的時(shí)候,需要在局部變量前加final修飾符,不然編譯器就會(huì)報(bào)錯(cuò)。通常我們也是這么干的。好的,第二個(gè)問(wèn)題來(lái)了,為什么要加final修飾符?相信大多數(shù)小伙伴都沒有思考過(guò)這個(gè)問(wèn)題,但凡使用的時(shí)候,直接加上就得了,從來(lái)沒去深究過(guò)其中的原理。這對(duì)于一個(gè)優(yōu)秀的程序員來(lái)說(shuō)是不可取,我們不僅要知其然還要知其所以然。
      現(xiàn)在我們來(lái)分析一下,為什么要加final關(guān)鍵字。首先內(nèi)部類的生命周期是成員級(jí)別的,而局部變量的生命周期實(shí)在方法體之類。也就是說(shuō)會(huì)出現(xiàn)這樣一種情況,當(dāng)mRun方法執(zhí)行,new 的線程運(yùn)行,新線程里面會(huì)睡一秒。主線程會(huì)繼續(xù)執(zhí)行,mRun執(zhí)行完畢,name屬性生命周期結(jié)束。1秒之后,Syetem.out.printh(name)執(zhí)行。然而此時(shí)name已經(jīng)壽終正寢,不在內(nèi)存中了。Java就是為了杜絕這種錯(cuò)誤,嚴(yán)格要求內(nèi)部類中方位局部變量,必須使用final關(guān)鍵字修飾。局部變量被final修飾之后,此時(shí)會(huì)在內(nèi)存中保有一份局部變得的復(fù)制品,當(dāng)內(nèi)部類訪問(wèn)的時(shí)候其實(shí)訪問(wèn)的是這個(gè)復(fù)制品。這就好像是把局部變量的生命周期變長(zhǎng)了。說(shuō)到底還是Java工程師提前把這個(gè)坑給我們填了,不然不知道又會(huì)有多少小伙伴會(huì)為了內(nèi)部類局部變量而發(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
看到這個(gè)答案很多小伙伴又會(huì)不解,先來(lái)說(shuō)下第二個(gè),按第一題來(lái)說(shuō)Integer不是把-128-127緩存起來(lái)了嗎?這不是應(yīng)該是true嘛,但是你仔細(xì)看,這里的Integer是我們自己new出來(lái)的,并不是用的緩存,所以結(jié)果是false。 現(xiàn)在來(lái)看第一個(gè)為啥又是true了呢? 首先這里的值為1000,肯定和我們所知的Integer緩存沒有關(guān)系。既然和緩存沒有關(guān)系,a是新new出來(lái)的對(duì)象,按理說(shuō)輸入應(yīng)該是false才對(duì)。但是注意b這里是int類型。當(dāng)int和Integer進(jìn)行==比較的時(shí)候,Java會(huì)把Integer進(jìn)行自動(dòng)拆箱,也就是把Integer轉(zhuǎn)成int類型,所以這里進(jìn)行比較的是int類型的值,所以結(jié)果即為true。

做對(duì)了幾題,快點(diǎn)根據(jù)自己測(cè)試的水平,進(jìn)行查漏補(bǔ)缺吧!

相關(guān)文章

  • Java8中Stream的一些神操作

    Java8中Stream的一些神操作

    Stream是Java8中處理集合的關(guān)鍵抽象概念,它可以指定你希望對(duì)集合進(jìn)行的操作,可以執(zhí)行非常復(fù)雜的查找、過(guò)濾和映射數(shù)據(jù)等操作,這篇文章主要給大家介紹了Java8中Stream的一些神操作,需要的朋友可以參考下
    2021-11-11
  • 新手小白入門必學(xué)JAVA面向?qū)ο笾鄳B(tài)

    新手小白入門必學(xué)JAVA面向?qū)ο笾鄳B(tài)

    說(shuō)到多態(tài),一定離不開其它兩大特性:封裝和繼承,下面這篇文章主要給大家介紹了關(guān)于新手小白入門必學(xué)JAVA面向?qū)ο笾鄳B(tài)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • Spring Boot集成MyBatis的方法

    Spring Boot集成MyBatis的方法

    今天小編就為大家分享一篇關(guān)于Spring Boot集成MyBatis的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問(wèn)題

    使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問(wèn)題

    這篇文章主要介紹了使用Runtime 調(diào)用Process.waitfor導(dǎo)致的阻塞問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java求兩個(gè)正整數(shù)的最大公約數(shù)和最小公倍數(shù)

    Java求兩個(gè)正整數(shù)的最大公約數(shù)和最小公倍數(shù)

    這篇文章主要介紹了輸入兩個(gè)正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù),需要的朋友可以參考下
    2017-02-02
  • 分享J2EE的13種核心技術(shù)

    分享J2EE的13種核心技術(shù)

    在本文中我將解釋支撐J2EE的13種核心技術(shù):JDBC, JNDI, EJBs, RMI, JSP, Java servlets, XML, JMS, Java IDL, JTS, JTA, JavaMail 和 JAF,對(duì)j2ee的13種核心技術(shù)感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • 基于從request獲取各種路徑的方法介紹

    基于從request獲取各種路徑的方法介紹

    下面小編就為大家分享一篇基于從request獲取各種路徑的方法介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-11-11
  • 堆排序?qū)嵗?Java數(shù)組實(shí)現(xiàn))

    堆排序?qū)嵗?Java數(shù)組實(shí)現(xiàn))

    下面小編就為大家分享一篇使用Java數(shù)組實(shí)現(xiàn)堆排序的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • java連接mysql數(shù)據(jù)庫(kù)的方法

    java連接mysql數(shù)據(jù)庫(kù)的方法

    這篇文章主要為大家詳細(xì)介紹了java連接mysql數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java處理延時(shí)任務(wù)的常用幾種解決方案

    Java處理延時(shí)任務(wù)的常用幾種解決方案

    本文主要介紹了Java處理延時(shí)任務(wù)的常用幾種解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評(píng)論