通過本質看現象:關於Integer受內部初始範圍而出現的有趣現象

2021-01-07 朱季謙

作者:朱季謙

前幾天我在逛論壇的時候,偶然看到有人討論這樣一個現象,定義四個Integer類型的變量,分別初始化賦值為a=100,b=100,c=1000,d=1000,然後用println分別列印輸出a==b和c==d的boolean值。這時就會出現一個很有趣的現象,a==b會被判斷為ture,而c==d被判斷為false。我覺得這個問題有點意思,就自己在eclipse上玩了一遍,運行截圖如下:

問題便來了,同樣類型的數值,為何a==b是正確的,而c==d則被判斷為錯誤。在我們現實生活中,人們總說要透過現象去看本質,但若能反過來通過本質來分析現象,我想,同樣可以深入理解很多東西。就像你能讀懂一個人,就會很容易理解這個人的所作所為。打一個比方,你要弄懂一個人為何要犯罪,首先得了解他做這件事的心理,這就是通過本質回過頭去看現象。

這道題,如果能通過本質來看現象,就會茅塞頓開。

Integer的本質是什麼,當然是它的源碼咯。

在我們定義Integer a=100時,編譯器會轉成Integer.valueOf(100),即內部實現是Integer a= Integer.valueOf(100),而在Integer的源碼裡valueOf方法如下:

publicstatic Integer valueOf(int i){

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

通過Integer的內部代碼,可以看到有一個範圍,即IntegerCache.low和IntegerCache.high。通常情況兩者默認初始化為IntegerCache.high=127,IntegerCache.low=-128,同時,Integer內部還有一個靜態static代碼塊,它會在類被加載時被執行,該代碼塊如下:

static {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);h = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {}}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;}

在執行該靜態代碼塊時,會新建一個數組cache,把-128到127的數字都放在這裡面。再結合前面的valueOf方法,可以看出,如果賦值的參數在127個-128之間,就會直接從靜態代碼塊的緩存中返回一個實際數,它們都屬於同一個對象;如果超過這個範圍,就會return new Integer(i),即返回一個新建且不同的對象值。

分析完Integer的部分源碼後,就可以知道前面問題為何會出現這樣的現象了。當a,b賦值為100時,兩者都在127~-128的範圍間,在同一個緩衝中,屬於同一個對象且數值相同,那樣a==b即為true;而當c,d賦值為1000時,就超過了範圍,就會創建新的對象,兩個引用指向不同的對象,即使對象擁有相同的內容,用==比較結果依然是false,這樣的話,c,d已不屬於同一個對象了,自然就會為false。

相關焦點

  • 評論丨透過現象看本質
    黨員幹部應把學習馬克思主義,特別是馬克思主義中國化最新成果作為政治必修課,通過深入學習實踐,不斷把握規律、追求真理,認識世界、改造世界。馬克思主義深刻揭示了事物的本質、內在聯繫及發展規律,是「偉大的認識工具」。1946年6月,全面內戰爆發。當時,國民黨在軍隊數量、軍事裝備、後備資源及外來援助等方面,都明顯超過共產黨。
  • 試論現象學哲學的公理化改革:以認識主體與主觀現象為初始概念
    總之我們認為,在哲學領域裡,胡塞爾現象學最重要的、最有新意的、同時也是最具有思想啟發性的特徵是:第一,它強調以「認識論」而不是「本體論」為重心構造基礎的哲學學說;第二,它以「現象」為根本的基礎概念和統一的思維方向,通過觀察和思維現象來還原人的認識本質,第三,它以「科學化」為自己的理論目標和旨趣。
  • 談談「透過現象看本質」
    這些調整,是需要分析清楚 「社會現象」,其根源(「原因」、「本質」)在哪裡?想起了「透過現象看本質」這句話。為什麼要「透過現象看本質」?現象是表現形式,是性狀;本質是呈現出該性狀的本體內容。仔細分析就能發現,上述共同挑戰(「現象」),無不是由人類自身不恰當的、過度的欲望帶來的,或者在不恰當欲望的累積作用下導致環境改變而引起的(指氣候變化和重大傳染性疾病)。
  • 善於透過現象看本質
    習主席在2020年秋季學期中央黨校(國家行政學院)中青年幹部培訓班開班式上強調:「要能夠透過現象看本質,做到眼睛亮、見事早、行動快。」習主席這一重要論述,飽含著對中青年幹部的殷切期望,也為我們成事成才指明了努力方向。
  • 閒論:透過現象看本質
    真理的發現往往都是通過一些自然現象來說明,覺悟高的人可以將看到的自然現象和某些事物聯繫在一起,如此,自然界中的某種法則就誕生了。我們透過現象可以說明自然界最大的秘密就是平常,很多人看到一些平常現象不知道感悟聯想,而覺悟高的人會周密的追究現象的內在本質,所以這些懂得思考觀察的人,無論在哪一方面都可以獲得突破性成果。想當年,牛頓先生思考蘋果為何會往下落而不是往其它方向落地呢?
  • 如何擁有透過現象看本質的本領?
    普遍來說,很多事情都是一個又一個的輪迴,只要知道背後的運作規律,下一次遇到類似的事情,我們也能知道背後的本質。二、本質方法論我們看到有些人,看到一個現象就能看到本質,很有可能是因為他本身就有一套屬於自己的本質方法論。通過反覆實踐,構建了屬於自己的體系架構。
  • 關於幻覺、超自然現象和意識狀態
    首先通過對實證資料的初步梳理,總結出意識狀態改變中會出現的四種基本現象,然後依次對它們進行深入分析:最先,從幻覺狀態下、外部客觀刺激和內部虛假刺激可同時作用於知覺層這一新的維度,通過對二者相對強弱關係變化的剖析,揭示不同幻覺狀態的特徵,並對出體體驗和ESP(超感官知覺)等超自然現象作出科學的解讀;其次,通過建立一個新的過濾假說來解釋覺知的更敏感現象,並發掘其潛在價值。
  • 透過現象看本質
    如果這個案子直接定性為自殺,受害者就會永遠沉冤,可偏偏有位諮深偵探員深刻道出了案件的真相,告慰了亡者在天之靈,也使害人者未能逃脫制裁,終受法律懲罰。使受害者沉冤得雪,高度頌揚其偵探水平和職業道德,這種透過現象看本質的辦案執業理念讓人佩服。
  • 2016高考作文熱點素材:透過現象看本質
    2016高考作文預測範文:透過現象看本質   閱讀下面的材料,按照要求寫一篇不少於800字的文章(60分)   霍金和加州理工學院的理論物理學家萊昂納德•蒙羅蒂諾合寫的一篇文章。
  • 普通人真的可以「透過現象看本質」麼?
    普通人真的可以「透過現象看本質而且,想要透過現象看到本質,本身就要對於現象有充足的了解,才能通過產生這種現象的可能存在的原理進行剖析。其實這就是一句想當然的話,如果人們能夠跳脫出自身的固定思路,並且對於沒有認知的事物進行本質的確認,那用通俗點的話就是全知全覺了,成神了。
  • 透過現象看本質究竟有多麼可怕?老闆:給我招聘一個司機
    我們有時會非常佩服於一個人看問題看得非常深刻,分析的非常透徹,通常就是因為他對於現象背後的本質發現的比我們更多或者是更深一層。舉個例子:「老闆想招聘一個司機」,從這句話中你會為老闆的這個需求提供怎樣的服務呢?真的招聘一個司機嗎?
  • 我們每個人,要學會,透過現象看本質
    大家好,我是專注教育小分享,今天我給大家分享的是:透過現象看本質觀察法透過現象看本質觀察法1.解剖觀察法對某些事物,從整體到局部、從宏觀到微觀2.重複觀察法對同一事物或現象,再次或多次進行觀察的一種方法。自然界有很多的現象出現非常迅速,觀察者的觀察速度往往跟不上它,只好重複觀察才能掌握其實質。例1:觀察人造彩虹的實驗。實驗時用噴霧器,向太陽的方向噴射,噴出的霧狀水滴中,就呈現出由七種顏色的光所組成的「虹」,但瞬間便消失了。
  • 有趣的歧義現象
    水中嬉戲——畢肖弘攝於四平植物園2020.6有趣的歧義現象我說的是玻璃球子,你聽的是胯骨軸子
  • 透過現象看本質,實現真正意義上的認識
    我們身處在社會中,對於事物的認識,認識的深度,可能各自有差異,面對一個事物的認知了解,應該是通過現象和看本質,而不是只關注於其表面的認識,總結起來也可以說是追起溯源。這就是好比我們在學習中,對於知識的學習,難題的理解,有人只是理解大意,而有的人則會探其本質,尋找題目中的真材實料,掌握要點,可惜解題的技巧,從而遇到這一類題目,都可以找到解決的衝破口,只有透過現象看本質,才能更好的掌握知識。
  • 事業單位面試熱點:社會現象題如何「透過現象看本質」
    社會現象題是面試中最常考的題目之一,考察考生看問題的高度、廣度和深度。對於大多數考生來說,社會現象產生的原因都能談到幾點,但往往談得不夠深刻,無法透過現象看本質,找不到問題的根本原因。今天我們帶著大家來學習如何「透過現象看本質」,找到社會現象的根本原因。
  • 透過現象看本質,你做得到嗎?
    A:1、開課之前,請讀友思考這兩個問題:怎樣才能透過現象看本質?什麼叫做甘於膚淺,什麼叫做追求深刻?2、再來看個案例,一起做個簡要分析。豐田汽車公司某一生產線上的機器總是停轉,雖然修過多次但仍不見好轉。於是,豐田公司前副社長大野耐一,與工人進行了以下的問答:一問:「為什麼機器停了?」答:「因為超過了負荷,保險絲就斷了。」
  • 本質和現象的關係,應該這樣理解
    先理解本質還是先理解現象,其實沒有確定答案。有的事物,本質比現象更容易理解,也有些事物,本質則深深地藏在現象後面,錯綜複雜。一、透過現象看本質生命的本質。在一個社會高速發展的過程中,不同階段會出現不同的問題,如果一種問題成為了一種大眾現象,那背後可能是社會的發展所遺留的問題。然而這種社會現象所牽扯到的本質,估計社會學家都難以下定論。比如天價彩禮可能只是拜金問題的一個側面,那麼拜金問題又是什麼問題的側面呢?剖析下去,一環又一環,沒完沒了。到最後,都丟出一個統一的結論:人性的問題。
  • 管理通鑑|股份公司內部的「撕裂」現象
    從形式上看,一家新的股份公司建立,這家公司就作為一個獨立的法人整體,出現在世人面前。然而,從實際來看,不同的資本來源通過不同的方式,在公司裡都有自己的代表,它們不只是組合成了當下公司的全部資本,同時也帶來了不同出資方的理念、經驗和某些獨特的「利益訴求」,這使得公司有著「物理拼塊式」的初始特性,潛在地存在「部分撕裂整體」的力量。
  • 透過現象看本質:魚骨圖分析法!
    問題的特性總是受到一些因素的影響,我們通過頭腦風暴找出這些因素,並將它們與特性值一起,按相互關聯性整理而成的層次分明、條理清楚,並標出重要因素的圖形就叫特性要因圖。因其形狀如魚骨,所以又叫魚骨圖,它是一種透過現象看本質的分析方法,又叫因果分析圖。同時,魚骨圖也用在生產中,來形象地表示生產車間的流程。
  • 2016考研政治唯物辯證法五大範疇:現象和本質
    我們在考研政治中講到了唯物辯證法的五大範疇,即原因和結果、必然性和偶然性、可能性和現實性、現象和本質、內容和形式。下面為大家梳理現象和本質這對範疇。   現象和本質是揭示客觀事物的外部表現和內部聯繫相互關係的範疇。現象和本質也是既對立又統一的。   一方面,現象和本質是有區別的。