Just Java IT

          西門町學士關于Java的隨便一說而已……

          Tiger pitfall

          在SDN踩到一個Tiger的pitfall:
          package sdn;

          import java.util.ArrayList;

          public class BoxingEquality {
             
              /** Creates a new instance of BoxingEquality */
              public BoxingEquality() {
              }
             
              /**
               * @param args the command line arguments
               */
              public static void main(String[] args) {
                  // TODO code application logic here
                  int i = 1;
                  int j = 1;
                  ArrayList<Integer> list = new ArrayList<Integer>();
                  list.add(i);
                  list.add(j);
                  System.out.printf("It is %b that i == j.\n", (i==j));
                  System.out.printf("It is %b that list.get(0) == list.get(1).\n", (list.get(0)==list.get(1)));
                  System.out.printf("It is %b that list.get(0).equals(list.get(1)).",            list.get(0).equals(list.get(1)));
              } 
          }

          輸出結果出乎意料:
          It is true that i == j.
          It is true that list.get(0) == list.get(1).    // WHY???
          It is true that list.get(0).equals(list.get(1)).

          然而,僅僅將 i 和 j 的值改成1000:
          int i = 1000;
          int j = 1000;
          就這一個改動后輸出結果雖然符合了java的思維方式,但在這個context中卻更顯得怪異:
          It is true that i == j.
          It is false that list.get(0) == list.get(1). // Oops
          It is true that list.get(0).equals(list.get(1)).

          Sun給出的解釋:
          The primitives are equal and the values of the boxed ints are equal. But this time the ints point to different objects. What you have discovered is that for small integral values, the objects are cached in a pool much like Strings. When i and j are 2, a single object is referenced from two different locations. When i and j are 2000, two separate objects are referenced. Autoboxing is guaranteed to return the same object for integral values in the range [-128, 127], but an implementation may, at its discretion, cache values outside of that range. It would be bad style to rely on this caching in your code.

          呵呵,要不注意說不定還真中招了!

          posted on 2006-03-16 22:03 西門町學士 閱讀(336) 評論(4)  編輯  收藏 所屬分類: Java

          Feedback

          # re: Tiger pitfall 2006-10-21 09:56 11

          11111111111111111  回復  更多評論   

          # re: Tiger pitfall 2006-10-21 09:58 11

          不好意思!剛才發錯了!  回復  更多評論   

          # 你好! 2006-10-21 10:04 11

          由于最近在做一個在線購物系統!所以看到你的主頁后就來想想你這個留言版是怎么實現的~!:)  回復  更多評論   

          # 關于你的留言版的實現原理 2006-10-21 10:07 11

          由于最近在做一個在線購物系統!所以看到你的主頁后就來想想你這個留言版是怎么實現的~!:)   回復  更多評論   

          主站蜘蛛池模板: 皮山县| 余姚市| 射洪县| 济源市| 双城市| 双流县| 陕西省| 屯昌县| 吉木乃县| 永寿县| 谢通门县| 诸暨市| 常宁市| 宝应县| 涿鹿县| 改则县| 蒙城县| 千阳县| 兰考县| 西藏| 临泉县| 安国市| 淮南市| 千阳县| 顺义区| 武穴市| 安康市| 古交市| 榆社县| 奉化市| 屏南县| 龙岩市| 遂溪县| 石门县| 南乐县| 玉环县| 阳原县| 本溪| 通山县| 晋中市| 唐海县|