1. Java走过的坑-整型池比较

简介:

看看如下代码,以下所有代码均在JDK1.8下测试通过,源码可能会有更新,望注意

public class IntegerPool {

	public static void main(String[] args) {
		Integer a = 1;
		Integer b = 1;
		
		System.out.println(a == b);
		
		Integer c = 127;
		Integer d = 127;
		
		System.out.println(c == d);
		
		Integer e = 128;
		Integer f = 128;
		
		System.out.println(e == f);
		
		System.out.println(e.equals(f));
	}
}

控制台输出:
true
true
false
true

我们可以看出,Integer类型的变量为1和127的时候用“==”进行比较都是正确的,

当值为128的时候比较出现了false,但是用equals方法比较的对的。

解释如下:

  1. new产生的Integer对象

    1. new声明的就是要生成一个新的对象,2个对象比较内存地址肯定不相等,比较结果为false

  2. 装箱生成的对象

    1. 对于这一点首先要说明的是装箱动作是通过Integer.valueOf方法进行的。

    2. Integer i = 100; (注意:不是 int i = 100; )

      实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100); 此即基本数据类型的自动装箱功能。

  3. valueOf如何生成对象

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

        这是JDK1.8的源码,low=-128,h=127,这段代码意为如果是-128到127之间的int类型转换为Integer对象,则直接从IntegerCache里获取,来看看IntegerCache这个类

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        // 内部静态数组,容纳-128到127之间的对象
        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) {
                try {
                    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);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

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

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

 

总结:

整型池的出现提高了系统性能,在判断对象是否相等的时候尽量使用equals方法,避免使用“==”产生非预期结果。

通过包装类的valueOf生成包装实例可以提高空间和时间性能。

目录
相关文章
|
Java C++
Java整型变量和整型常量
Java整型变量和整型常量
310 0
|
9月前
|
存储 传感器 缓存
java变量与数据类型:整型、浮点型与字符类型
### Java数据类型全景表简介 本文详细介绍了Java的基本数据类型和引用数据类型,涵盖每种类型的存储空间、默认值、取值范围及使用场景。特别强调了`byte`、`int`、`long`、`float`、`double`等基本类型在不同应用场景中的选择与优化,如文件流处理、金融计算等。引用数据类型部分则解析了`String`、数组、类对象、接口和枚举的内存分配机制。
323 15
|
9月前
|
Java
课时10:Java数据类型划分(整型类型)
本文主要围绕Java中整型数据展开,详细讲解整型变量、常量的概念,整型数据运算规则,包括数据溢出问题及解决方法,数据类型转换(自动转换与强制转换)的原理和注意事项,同时介绍了整型数据默认值的相关知识,以及byte数据类型与int数据类型的关系和使用场景,帮助读者全面掌握Java整型数据的相关内容。
237 4
|
存储 安全 Java
Java整型数据详解
Java整型数据详解
244 0
|
Java
【Java探索之旅】数据类型与变量 字面常量 整型变量
【Java探索之旅】数据类型与变量 字面常量 整型变量
138 0
|
Java
【详识JAVA语言】交换两个整型变量
【详识JAVA语言】交换两个整型变量
115 0
|
存储 缓存 Java
Java中的Integer缓存池
Java中的Integer缓存池
126 0
|
缓存 Java 编译器
Java引用类型的自动装箱与缓存池
Java引用类型的自动装箱与缓存池
141 0
|
存储 Java
【剑指offer知识点】Java中无符号整型、如何与int/long类型互相转化
【剑指offer知识点】Java中无符号整型、如何与int/long类型互相转化
663 0
【剑指offer知识点】Java中无符号整型、如何与int/long类型互相转化
|
安全 Java
Java的长整型Long/long后面的数字什么情况下必须加L?
Java的长整型Long/long后面的数字什么情况下必须加L?
1286 0