华南俳烁实业有限公司

java

當(dāng)前位置:中華考試網(wǎng) >> java >> java基礎(chǔ) >> 文章內(nèi)容

Java基礎(chǔ)題你能對幾道?

來源:中華考試網(wǎng)  [2020年11月14日]  【

  一、==符的使用

  首先看一段比較有意思的代碼

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

  }

  };

  }

  如果這道題你能得出正確答案,并能了解其中的原理的話。說明你基礎(chǔ)還可以。如果你的答案 是 true 和true的話,你的基礎(chǔ)就有所欠缺了。

  首先公布下答案, 運行代碼,我們會得到 false true。我們知道==比較的是兩個對象的引用,這里的abcd都是新建出來的對象,按理說都應(yīng)該輸入false才對。這就是這道題的有趣之處,無論是面試題還是論壇討論區(qū),這道題的出場率都很高。原理其實很簡單,我們?nèi)タ聪翴nteger.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);

  }

  }

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

  二、String

  接著看代碼

  String s1 = "abc";

  String s2 = "abc";

  String s3 = new String("abc");

  填寫下面表單即可預(yù)約申請免費試聽java課程!害怕學(xué)不會?助教全程陪讀,隨時解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國推薦就業(yè)!

預(yù)約申請免費聽java課程

  • 地區(qū):
  • 姓名:
  • 手機:

  System.out.println(s1 == s2);

  System.out.println(s1 == s3);

  大家又來猜一猜這道題的答案是什么?

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

  三、final關(guān)鍵字

  還是來看一段代碼

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

  }

  這種代碼相信大家寫過很多,當(dāng)內(nèi)部類訪問局部變量的時候,需要在局部變量前加final修飾符,不然編譯器就會報錯。通常我們也是這么干的。好的,第二個問題來了,為什么要加final修飾符?相信大多數(shù)小伙伴都沒有思考過這個問題,但凡使用的時候,直接加上就得了,從來沒去深究過其中的原理。這對于一個優(yōu)秀的程序員來說是不可取,我們不僅要知其然還要知其所以然。

  現(xiàn)在我們來分析一下,為什么要加final關(guān)鍵字。首先內(nèi)部類的生命周期是成員級別的,而局部變量的生命周期實在方法體之類。也就是說會出現(xiàn)這樣一種情況,當(dāng)mRun方法執(zhí)行,new 的線程運行,新線程里面會睡一秒。主線程會繼續(xù)執(zhí)行,mRun執(zhí)行完畢,name屬性生命周期結(jié)束。1秒之后,

  Syetem.out.printh(name)執(zhí)行。然而此時name已經(jīng)壽終正寢,不在內(nèi)存中了。Java就是為了杜絕這種錯誤,嚴(yán)格要求內(nèi)部類中方位局部變量,必須使用final關(guān)鍵字修飾。局部變量被final修飾之后,此時會在內(nèi)存中保有一份局部變得的復(fù)制品,當(dāng)內(nèi)部類訪問的時候其實訪問的是這個復(fù)制品。這就好像是把局部變量的生命周期變長了。說到底還是Java工程師提前把這個坑給我們填了,不然不知道又會有多少小伙伴會為了內(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

  看到這個答案很多小伙伴又會不解,先來說下第二個,按第一題來說Integer不是把-128-127緩存起來了嗎?這不是應(yīng)該是true嘛,但是你仔細(xì)看,這里的Integer是我們自己new出來的,并不是用的緩存,所以結(jié)果是false。 現(xiàn)在來看第一個為啥又是true了呢? 首先這里的值為1000,肯定和我們所知的Integer緩存沒有關(guān)系。既然和緩存沒有關(guān)系,a是新new出來的對象,按理說輸入應(yīng)該是false才對。但是注意b這里是int類型。當(dāng)int和Integer進(jìn)行==比較的時候,Java會把Integer進(jìn)行自動拆箱,也就是把Integer轉(zhuǎn)成int類型,所以這里進(jìn)行比較的是int類型的值,所以結(jié)果即為true。

責(zé)編:fushihao

上一篇:equals和==的區(qū)別是什么?

下一篇: 沒有了

  • 會計考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學(xué)歷考試
平舆县| 罗城| 绵阳市| 门头沟区| 分宜县| 会理县| 襄樊市| 呼玛县| 彰武县| 包头市| 宁强县| 钟山县| 沁水县| 彭州市| 新民市| 鹰潭市| 且末县| 富裕县| 石城县| 深圳市| 米易县| 苗栗县| 道真| 阳高县| 盘锦市| 东台市| 溧水县| 清新县| 昌邑市| 榆树市| 高阳县| 旬阳县| 峡江县| 尚义县| 开阳县| 抚远县| 双桥区| 孙吴县| 彭州市| 新源县| 清原|