为什么两个值明明相等,==判断却反回false?

先看第一段

Integer a = 3000;
Integer b =3000;
System.out.println(a==b);


返回false,既然这样那为什么

Integer a = 30;
Integer b =30;
System.out.println(a==b);


又返回true呢。了解一下缓存池:


缓存池(Cache)


在Java中,为了提高性能,对于一些常用的对象或值,会使用缓存池(Cache)来复用已经创建的对象或值。这样可以减少对象的创建和销毁,从而提高程序的执行效率和内存利用率。

下面是一些Java中使用缓存池的例子:

String类型的字符串常量池
在Java中,字符串常量池(String Pool)是一种特殊的缓存池。当我们使用字面量创建字符串时,例如:

String s1 = "hello";
String s2 = "hello";

实际上,s1和s2引用的是同一个字符串常量池中的对象。这是因为Java在编译时会对相同的字符串进行缓存,从而避免重复创建对象。

Integer类型的缓存池
在Java中,对于Integer类型的对象,如果数值在-128到127之间,会使用缓存池来复用对象,从而提高性能。例如:

Integer a = 100;
Integer b = 100;
System.out.println(a == b); // 输出 true


在这个例子中,a和b的值都是100,属于缓存池的范围内,因此它们引用的是同一个对象,使用==运算符比较它们的引用时,结果为true。

但是,如果数值超出了-128到127的范围,就不再使用缓存池,而是创建新的对象。例如:

Integer a = 3000;
Integer b = 3000;
System.out.println(a == b); // 输出 false


在这个例子中,a和b的值都是3000,超出了缓存池的范围,因此它们引用的是不同的对象,使用==运算符比较它们的引用时,结果为false。

与此类似的还有一些其他的缓存池,如Boolean类型的缓存池、Long类型的缓存池等等,它们的原理都类似。

猜你喜欢

转载自blog.csdn.net/wang121213145/article/details/134040323