当前位置:  开发笔记 > 编程语言 > 正文

Java Wrapper相等测试

如何解决《JavaWrapper相等测试》经验,为你挑选了3个好方法。

在Java中,-128和127(包括)之间的整数通常由相同的Integer对象实例表示.这是通过使用一个名为IntegerCache的内部类(包含在Integer类中,并在调用Integer.valueOf()时或在自动装箱期间使用)来处理的:

private static class IntegerCache {
    private IntegerCache(){}

    static final Integer cache[] = new Integer[-(-128) + 127 + 1];

    static {
        for(int i = 0; i < cache.length; i++)
            cache[i] = new Integer(i - 128);
    }
}

另见:http://www.owasp.org/index.php/Java_gotchas



1> Ross..:

在Java中,-128和127(包括)之间的整数通常由相同的Integer对象实例表示.这是通过使用一个名为IntegerCache的内部类(包含在Integer类中,并在调用Integer.valueOf()时或在自动装箱期间使用)来处理的:

private static class IntegerCache {
    private IntegerCache(){}

    static final Integer cache[] = new Integer[-(-128) + 127 + 1];

    static {
        for(int i = 0; i < cache.length; i++)
            cache[i] = new Integer(i - 128);
    }
}

另见:http://www.owasp.org/index.php/Java_gotchas



2> SCdF..:

基本上-127和127之间的整数是"缓存"的,当你使用这些数字时,你总是在内存中引用相同的数字,这就是你==工作的原因.

超出该范围的任何整数都不会被缓存,因此引用不相同.



3> A. Rex..:

@tunaranch是对的.它也与此Python问题中的问题相同.要点是Java为-128到127之间的整数保留一个对象(Python确实为-5到256),并且每次请求时都返回相同的对象.如果你要求在这个固定范围之外的整数,它每次都会给你一个新的对象.

(回想一下,==返回两个对象实际上是否相同,同时equals比较它们的内容.)

编辑:下面是有关段落第5.1.7节中的Java语言规范:

如果值p被装箱是true, false,一byte,一个char范围内的 \u0000\u007f,或一个int或-128和127之间的短号码,然后让 R1R2是p中的任意两个装箱转换的结果.始终是r1 == r2的情况.

请注意,这也描述了其他类型的情况.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有