Just Java IT


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>();
        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;
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)).

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 西门町学士 阅读(286) 评论(4)  编辑  收藏 所属分类: Java


# 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

由于最近在做一个在线购物系统!所以看到你的主页后就来想想你这个留言版是怎么实现的~!:)   回复  更多评论