见图点题:
这。。。是不是感觉学了假的Java,太懵逼了吧。
首先我们要清楚的一点就是,图片上的这个问题本身想要表达的是什么意思呢?我们可以先来看看下面的代码:
public class IntegerTest {
public static void main(String[] args) {
int a = 1000;
int b = 1000;
int i = 100;
int j = 100;
System.out.println(a==b);
System.out.println(i==j);
}
}
很明显在这种情况下了,我们比较的结果都是true。接着我们再试着使用包装类的形式来创建整型对象,代码如下:
public class IntegerTest {
public static void main(String[] args) {
Integer a,b;
Integer i,j;
a=1000;
b=1000;
i=100;
j=100;
System.out.println(a==b);
System.out.println(i==j);
}
}
运行结果如图所示:
这和我们想象的结果不一致。。。到底是什么原因导致的呢?接着我就又写了一段代码尝试了一下:(PS:其实是我自己查阅了资料之后。。。)
public class IntegerTest{
public static void main(String[] args) {
Integer a,b;
for(int i=-129;i<=128;i++){
a = i;
b = i;
System.out.println(i+":"+ (a==b));
}
}
}
结果如图所示:
我们可以看到,在数据-128~127这个区间内的整数比较的值都是相等的,同时呢, == 操作比较的是两个对象的内存地址,而并不是对象本身的值,由此可见,数据-128~127是存储在同一块内存单元的,其实也就是一个字节的存储单元,在查阅了相关资料之后,我了解到整数型常量池这个概念,也就是说区间的这256个整数是存在这样的一个内存单元当中的,并且这个单元是和字符串一样都处在Java虚拟机的代码区,也就是说,如果我们的代码当中出现了Integer类对象的话,程序在进行Integer类加载的时候会初始化整数型常量池,也即其中的256个类对象。
对于Java语言当中为什么要使用这样的一个机制呢,我们可以从缓存的方面来说明这一点,不难发现,这256个整数型数据是我们在开发当中用的最频繁的,因此选择了把这些数据存放在整数型常量池当中,从而提高了我们的程序执行的效率,这也是缓存的优点,那么其中的缺点就是耗费内存,就是我们常说的用空间来换取时间效率。请着重看下图来了解其中的关系:
以上内容均为个人学习的一点心得,其中的知识点若有错误请留言提醒,若有侵权内容提醒马上删除。