java Integer判等問題、java基礎問題

 1、作爲Java程序員,瞭解堆和棧,是最基礎的基本功。一句話總結堆和棧的作用,就是:堆放對象棧放常量,當然,棧也放了其他一些東西,比如基本類型。

       今天說說常量池,這東西是jdk1.5提供的一個“緩存池”,包裝類型Integer 在賦值時,比如Integer  a = 10,這個時候我們會考慮,這個a是個對象吧,那它應該存放在堆裏面咯,但事實是這樣嗎?當a的範圍在-128到127之間時,a的“數值”是存放於常量池的。

       所以,當我們遇到面試題,integer之間判斷大小,用==嗎?integer和int比較大小,用==嗎?之類的問題時,我們要明白其中的“隱藏點”。integer是對象,但不代表它的應用對象在值相同的情況下用==比較就爲false,原因就在於緩存池!對象之間比較,比較值用equals方法,==比較的是引用地址。

     但是當integer a =100,integer b = 100,a==b時,得到的結果是true,

Integer里弄了一個緩存,對於在 -128—127 之間的數值,會直接使用該緩存裏的對象  
 也就是說 Integer c = 3 或者 Integer c = Integer.valueOf(3) ,最終 c 得到的是Integer裏的緩存對象

        Integer a=100;
        Integer b=100;
        Integer a1=111110;
        Integer b1=111110;
        System.out.println(a==b); 
        System.out.println(a1.equals(b1)); 
        System.out.println(a1==111110);  被強制比較值
        System.out.println(Objects.equals(a1,b1));

true
true
true
false

 2、如何判斷一個對象是否已經被回收:

1、通過弱引用來判斷
2、如果對象已經被GC回收,那麼很明顯你是無法訪問它的.而如果你可以訪問到它,就說明這個對象還沒被GC回收
3、給你要管理的每個對象分配一個ID,在對象析構的時候,把其ID寫入到一個全局Hashtable裏,後面你以ID爲Key就可以判斷是否析構了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章