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整型变量和整型常量
166 0
|
8月前
|
存储 安全 Java
Java整型数据详解
Java整型数据详解
83 0
|
8月前
|
Java
【Java探索之旅】数据类型与变量 字面常量 整型变量
【Java探索之旅】数据类型与变量 字面常量 整型变量
70 0
|
8月前
|
Java
【详识JAVA语言】交换两个整型变量
【详识JAVA语言】交换两个整型变量
48 0
|
8月前
|
存储 缓存 Java
Java中的Integer缓存池
Java中的Integer缓存池
72 0
|
缓存 Java 编译器
Java引用类型的自动装箱与缓存池
Java引用类型的自动装箱与缓存池
78 0
|
存储 Java
【剑指offer知识点】Java中无符号整型、如何与int/long类型互相转化
【剑指offer知识点】Java中无符号整型、如何与int/long类型互相转化
435 0
【剑指offer知识点】Java中无符号整型、如何与int/long类型互相转化
|
安全 Java
Java的长整型Long/long后面的数字什么情况下必须加L?
Java的长整型Long/long后面的数字什么情况下必须加L?
769 0
|
缓存 Java
Java中基本类型和包装类的各类比较(==),以及包装类的对象缓存池
Java中的`基本类型`及其`包装类的比较(==)`一直是一个比较头疼的问题,不仅有`自动装箱和拆箱`操作,部分的包装类还有对象`缓存池`,这就导致了这部分知识容易混淆。 对于`==`操作符来说,如果比较的数据是`基本类型`,则比较它们的`值`,如果比较的是`对象`,则会比较`对象的内存地址`。另外,如果一个是基本类型、一个是包装类型,在比较前会先把包装类型`拆箱`成基本类型,然后进行比较。
java中整型数据(byte、short、int、long)溢出的现象及原理
java中整型数据(byte、short、int、long)溢出的现象及原理

热门文章

最新文章