JVM缓存机制
下面先来看一些Java 测试代码
。
//第一组
Integer num1 = 127;
Integer num2 = 127;
System.out.println(num1 == num2);
//------------------------------------
//第二组
Integer num3 = 128;
Integer num4 = 128;
System.out.println(num3 == num4);
//------------------------------------
//第三组
Integer num5 = new Integer(127);
Integer num6 = new Integer(127);
System.out.println(num5 == num6);
输出的测试代码为 true false false
原因:JVM的缓存机制所导致.
在创建变量时, jvm运行时会创建一个缓存区域,并创建一个Integer类型的数组.
1.该数组的存储范围为:-128~127之间(包含:128和127)的数据是在常量池维护,不会新分配内存空间,若变量的初始化值在此范围内, JVM便会直接从缓存里加载. 因此第一组的num1和num2指向的时同一内存地址.输出true;
2.在第二组中, num3和num4赋值为128, 超过此缓存区域. 会重新开辟两个内存空间, 内存的地址必然不同, 故输出false;
3.在第三组中, 使用了new关键字, 在Java中使用new关键字,便会在堆内存开辟新内存空间并返回该空间地址值, 创建出两个对象, 而两个对象的哈希值一般不同.故输出false;(这里应与JVM的缓存区域做区分)