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
後來查了一下資料發現是這樣的
馬上又出現了一個新問題
包裝類是什麼?
所謂包裝類,就是能夠直接將簡單型別的變量表示為一個類,在執行變數型別的相互轉換時,我們會大量使用這些包裝類。Java共有六個包裝類,分別是Boolean、Character、Integer、Long、Float和Double,從字面上我們就能夠看出他們分別對應於 boolean、char、int、long、float和double。而String和Date本身就是類。所以也就不存在什麼包裝類的概念了。
這是從百度整理來的
那麼現在已經大致清楚包裝類是個什麼東西了
回到問題本身,是什麼導致了1≠1
簡單地說,也就是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比較會引出一堆問題,有些時候我們在考慮問題時先入為主,認為一些東西理所當然的就該這樣,而忽略了其背後的原因、原理。
同時,我們在發現問題時不妨多思考一些相關問題,這樣又能獲得一些其他知識。
最為重要的是,當我們學會了一個知識,應當記住的是它的思想,而不是程式碼,只有在掌握好思想後才能舉一反三。
資料整理來源,如有侵權會馬上刪除本篇部落格