1. 程式人生 > >java萌新的進化旅程01

java萌新的進化旅程01

初識java(01)

作為一名第一次接觸java的萌新,很多東西改變了我的認知,使我意識到以往思考方式的不全面。

比如:“1≠1”

這個神奇的東西開始讓我意識到java這門程式語言水有多深
讓我覺得java是個有趣的東西
程式碼如下:

public class Test1 {
    public static void main(String[] args) {
        Integer a=new Integer(1);
        Integer b=new Integer(1);
            System.out.println(a==b)
; } }

其結果居然是 false

後來查了一下資料發現是這樣的

Integer
馬上又出現了一個新問題

包裝類是什麼?

所謂包裝類,就是能夠直接將簡單型別的變量表示為一個類,在執行變數型別的相互轉換時,我們會大量使用這些包裝類。Java共有六個包裝類,分別是Boolean、Character、Integer、Long、Float和Double,從字面上我們就能夠看出他們分別對應於 boolean、char、int、long、float和double。而String和Date本身就是類。所以也就不存在什麼包裝類的概念了。

這是從百度整理來的

那麼現在已經大致清楚包裝類是個什麼東西了


回到問題本身,是什麼導致了1≠1

Interger記憶體

簡單地說,也就是Integer(包裝類)裡面存的其實是一個記憶體地址,而不是一個數值

到這裡豁然開朗


然而這個問題到這裡還沒有結束
執行下面程式碼會發現結果為true

public class Test1 {
    public static void main(String[] args) {
        Integer a=new Integer(1);
        int b=1;
            System.out.println(a==b);
    }
}

原理如下

在這裡插入圖片描述

簡單地說,當一個Integer(包裝類)遇到一個int(基本資料型別)還是按照int(基本資料型別)來看就ok了


你以為到這裡就完了?

下面又出現了一個蜜汁情況

public class Test1 {
    public static void main(String[] args) {
        Integer a=new Integer(1);
        Integer b=1;
            System.out.println(a==b);
    }
}

其執行結果是false

查閱資料發現原來是這樣

在這裡插入圖片描述


到這裡結束了嗎?

還沒!

public class Test1 {
    public static void main(String[] args) {
        Integer a=new Integer(130);
        Integer b=new Integer(130);
            System.out.println(a==b);
    }
}

false,是的,是false

此後博主就陷入懷疑人生階段
然後在正式上課時聽老師講解才明白

首先,為了知道在按下run之後這段程式發生了什麼,我們需要參考原始碼

在這裡插入圖片描述
這裡使用的是source insight4.0

然後在這裡輸入想要查詢的東西

在這裡插入圖片描述

查詢內容如下

private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty(“java.lang.Integer.IntegerCache.high”);
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}

也就是說

這個Integer new一個數字是有取值區間的

其區間為-128—127

而130已經超出了這個區間


到了這裡,問題完了嗎?
暫時完了

以前從來都沒有想過一個簡簡單單的1和1比較會引出一堆問題,有些時候我們在考慮問題時先入為主,認為一些東西理所當然的就該這樣,而忽略了其背後的原因、原理。

同時,我們在發現問題時不妨多思考一些相關問題,這樣又能獲得一些其他知識。

最為重要的是,當我們學會了一個知識,應當記住的是它的思想,而不是程式碼,只有在掌握好思想後才能舉一反三。




在這裡插入圖片描述資料整理來源,如有侵權會馬上刪除本篇部落格