日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

題目如下:

public static void main(String[] args) {
		Integer i1 = 100;
		Integer i2 = 100;
		Integer i3 = 150;
		Integer i4 = 150;
		System.out.println(i1 == i2);
		System.out.println(i3 == i4);
}

你想好答案了嗎?
答案是:

true
false

為什么不都是true呢?
這就需要我們看看Integer i1 = 100;執行這條語句的時候發生了什么?
當我們給一個Integer對象賦一個int值的時候,會調用Integer類的靜態方法valueOf,查看jdk源碼,valueOf方法內容如下:

/**
 * Returns an {@code Integer} instance representing the specified
 * {@code int} value.  If a new {@code Integer} instance is not
 * required, this method should generally be used in preference to
 * the constructor {@link #Integer(int)}, as this method is likely
 * to yield significantly better space and time performance by
 * caching frequently requested values.
 *
 * This method will always cache values in the range -128 to 127,
 * inclusive, and may cache other values outside of this range.
 *
 * @param  i an {@code int} value.
 * @return an {@code Integer} instance representing {@code i}.
 * @since  1.5
 */
public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

從代碼和注釋上可以看到,這個方法是從jdk1.5之后開始添加的

如果整型字面量的值在-128到127之間,直接引用常量池中的Integer對象,否則new新的Integer對象。所以上面的面試題中i1 == i2的結果是true,而i3 == i4的結果是false。


從這道面試題中我們可以看到基本數據int 轉換成了 Integer類型,JAVA中為什么存在這兩種類型呢?

我們知道在Java中,new一個對象會存儲在堆里,通過棧中的引用來使用這些對象;但是對于經常用到的一系列類型如int,如果我們用new將其存儲在堆里就不是很高效,特別是簡單的小的變量。所以就出現了基本類型,對于這些類型不是用new關鍵字來創建,而是直接將變量的值存儲在棧中,因此更加高效。

既然基本類型會將值直接存儲到棧中實現高效率,為什么還要有包裝類型呢?

我們知道Java是一個面向對象的編程語言,基本類型并不具有對象的性質,為了讓基本類型也具有對象的特征,就出現了包裝類型(如我們在使用集合類型Collection時就一定要使用包裝類型而非基本類型),它相當于將基本類型“包裝起來”,使得它具有了對象的性質,并且為其添加了屬性和方法,豐富了基本類型的操作。

另外,當需要往ArrayList,HashMap中放東西時,像int,double這種基本類型是放不進去的,因為容器都是裝Object,這時就需要這些基本類型的包裝器類了。

到此我們知道了Java中為什么會同時存在基本類型和包裝類型了,那兩者有什么區別呢?

1、聲明方式不同:

基本類型不使用new關鍵字,而包裝類型需要使用new關鍵字來在堆中分配存儲空間;

2、存儲方式及位置不同:

基本類型是直接將變量值存儲在棧中,而包裝類型是將對象放在堆中,然后通過引用來使用;

3、初始值不同:

基本類型的初始值如int為0,boolean為false,而包裝類型的初始值為null;

4、使用方式不同:

基本類型直接賦值直接使用就好,而包裝類型在集合如Collection、Map時會使用到。


說到這里,我們說下Java的基本數據類型和其對應的包裝類型有哪些?

一道簡單面試題引出的Java數據類型連環問

 

可參看【Java官網數據類型描述】:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

boolean類型的大小我寫了個問號,大小不確定。我們看下Java官網中關于boolean類型的描述:

boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its “size” isn’t something that’s precisely defined.

布爾類型:布爾數據類型只有兩個可能的值:真和假。使用此數據類型為跟蹤真/假條件的簡單標記。這種數據類型就表示這一點信息,但是它的“大小”并不是精確定義的。也就是說,Java規范中,沒有明確指出boolean的大小

那么boolean類型到底占幾個字節呢?

有以下三個說法:

1、1個bit

boolean類型的值只有true和false兩種邏輯值,在編譯后會使用1和0來表示,這兩個數在內存中按位算,僅需1位(bit)即可存儲,位是計算機最小的存儲單位。

2、1個字節

雖然編譯后1和0只需占用1位空間,但計算機處理數據的最小單位是1個字節,1個字節等于8位,實際存儲的空間是:用1個字節的最低位存儲,其他7位用0填補,如果值是true的話則存儲的二進制為:0000 0001,如果是false的話則存儲的二進制為:0000 0000。

3、4個字節

在《Java虛擬機規范》一書中的描述:“雖然定義了boolean這種數據類型,但是只對它提供了非常有限的支持。在Java虛擬機中沒有任何供boolean值專用的字節碼指令,Java語言表達式所操作的boolean值,在編譯之后都使用Java虛擬機中的int數據類型來代替,而boolean數組將會被編碼成Java虛擬機的byte數組,每個元素boolean元素占8位”。也就是說JVM規范指出boolean當做int處理,也就是4字節,boolean數組當做byte數組處理,這樣我們可以得出boolean類型占了單獨使用是4個字節,在數組中是確定的1個字節。

如果認同第三條,那么存在一個問題:虛擬機為什么要用int來代替boolean呢?為什么不用byte或short,這樣不是更節省內存空間嗎?

經過查閱資料發現,使用int的原因是,對于當下32位的處理器(CPU)來說,一次處理數據是32位(這里不是指的是32/64位系統,而是指CPU硬件層面),32 位 CPU 使用 4 個字節是最為節省的,哪怕你是1個bit它也是占用 4 個字節。因為 CPU 尋址系統只能 32 位 32 位地尋址,具有高效存取的特點。

It depends on Java virtual machine.這取決于java虛擬機 。

總結:Java規范中,沒有明確指出boolean的大小。在《Java虛擬機規范》給出了4個字節,和boolean數組1個字節的定義,具體還要看虛擬機實現是否按照規范來,所以1個字節、4個字節都是有可能的

一道簡單面試題引出的Java數據類型連環問

 

分享到:
標簽:面試
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定