Integer对象大小比较问题

一、问题

先来看一看例子

public class IntegerTest {

	public static void main(String[] args) throws Exception {

		Integer a1 = 127;
		Integer b1 = Integer.valueOf(127);
		System.out.println("1:"+(a1 == b1));

		Integer a2 = 127;
		Integer b2 = 127;
		System.out.println("2:"+(a2 == b2));

		Integer a3 = 128;
		Integer b3 = 128;
		System.out.println("3:"+(a3 == b3));

		Integer a4 = 127;
		Integer b4 = new Integer(127);
		System.out.println("4:"+(a4 == b4));
	}
}

答案是true、true、false、false

二、分析

答案1:基本类型和包装类直接互相转换时会触发装箱拆箱操作,所以Integer b2 = 127等于Integer b1 = Integer.valueOf(127)

答案23:比较127的时候是true,比较128的时候缺变成false了,查看Integer.valueOf()的代码:

public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

如果数字的大小在范围内,会直接从缓存中取,如果大于范围就new Integer(i)创建对象

使用了享元模式共用对象,减少了频繁操作数字范围内的开支

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }

查看IntegerCache代码发现下限是-128固定了,上限默认127,可以通过-Djava.lang.Integer.IntegerCache.high=1000参数调整

答案4:127和new Integer(127)直接用==比较,实际上是比较两个对象的地址,结果是false

三、结论

Integer对象正确的比较大小方法需要用equals()方法:

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

Integer的equals方法重写了object里的equals,调用了intValue,比较两个对象的值

原文地址:https://www.cnblogs.com/ctxsdhy/p/8488411.html

时间: 2024-08-04 16:30:20

Integer对象大小比较问题的相关文章

Integer对象用== 和equals比较大小的问题

Integer对象用== 和equals比较大小 先看以下代码: Integer i1 = 127; Integer i2 = 127; if (i1 == i2) { System.out.println("i1 == i2 (==)"); } else { System.out.println("i1 != i2 (==)"); } Integer i3 = 128; Integer i4 = 128; if (i3 == i4) { System.out.pr

两个Integer比较大小需要注意的误区

通过下面的例子,来了解integer比较大小需注意的几点. eg.定义Integer对象a和b,比较两者结果为:a不等于b 1 Integer a = 1; 2 Integer b = 1; 3 if(a==b){ 4 System.out.print("a等于b"); 5 }else{ 6 System.out.print("a不等于b"); 7 } 因为Integer是对象类型,虽然两者内容相同,但是两者是不同的两个对象,在虚拟机中完全是不相干的2个对象,指向不

聊聊JVM(三)两种计算Java对象大小的方法

这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐),按照8的倍数对齐 数组对象结构是 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对

java调优随记-java对象大小

在java中,基本数据类型的大小是固定.但是java对象的大小是不固定的,需要通过计算. 在java中,一个空对象(没有属性和方法的对象)在堆中占用8byte,比如 Object obj = new Object();另外栈中存储引用需要占用4byte的空间,总共需要16byte空间(喂,为为什么不是12byte?因为java在内存分配的时候都是以8的倍数在分配).在java中所有的对象都继承Object,所以不论什么样的对象大小都不能小于8byte. 计算一下下面的对象的大小? Class O

JAVA中Integer对象的引用

JAVA中没有指针一说,但也有引用的概念.这里要说的主要是Integer是不是同一个对象. 1.先看一段代码: public static void main(String[] args){ Integer a1 = 100; Integer b1 = a1;//另一种也可以b1=100 Field field = null; try { field = a1.getClass().getDeclaredField("value"); } catch (NoSuchFieldExcep

(转)JS获取当前对象大小以及屏幕分辨率等

原文 JS获取当前对象大小以及屏幕分辨率等 <script type="text/javascript">function getInfo(){      var s = "";         s += " 网页可见区域宽:"+ document.body.clientWidth+"\n";          s += " 网页可见区域高:"+ document.body.clientHeig

关于Integer对象比较,和int基本类型比较的一些问题

public class Test { public static void main(String[] args) { Integer j = 192; int i = 192; System.out.println(new Integer(12) == new Integer(12));//false对象比较.///必然不同 System.out.println(new Integer(192) == i);//true自动拆箱 System.out.println(j == i);//tr

两个值相同的Integer对象的比较

package com.jj.test; import java.util.Objects; public class ObjectEqualsTest { public static final Integer COUNT_NONE = 0; public static void main(String[] args){ Integer a=new Integer(0); boolean bool = Objects.equals(a,COUNT_NONE); a.equals(COUNT_N

Qt之美(一):d指针/p指针详解(解释二进制兼容,以及没有D指针就会崩溃的例子。有了D指针,所使用的对象大小永远不会改变,它就是该指针的大小。这个指针就被称作D指针)good

Translated  by  mznewfacer   2011.11.16 首先,看了Xizhi Zhu 的这篇Qt之美(一):D指针/私有实现,对于很多批评不美的同路人,暂且不去评论,只是想支持一下Xizhi Zhu,在引用一下Jerry Sun的话,“C++需要宏定义就像需要设计模式一样.也许你不知道,宏是图灵完全(turing complete)的,至少LISP下是这样,C/C++需要宏,几乎所有重要的C/C++库都需要和依赖宏.这些都超过咱们的想象,宏能带给我们所谓语法糖(Synta