最近在学 Java,这是 Java 面试中会考的一个基础知识
之前我知道 Python 是会对 [-5,256] 之间的小整数调用过一次就会存入缓存,不会再重新创建,因为这些数值较小的数字使用频率很高,反复销毁重建是很浪费资源的。Java 中也是如此,只不过范围略有不同
Java 的基础数据类型的包装类有:Integer,Long,Double,Float,Boolean,Byte,Short,Character。
其高频缓存区间的缓存范围是:
Double: 无缓存
Float: 无缓存
Character:0~127
Boolean:使用静态 final,就会返回静态值
Byte:-128~127
Short:-128~127
Long:-128~127
Integer:-128~127
Integer 是唯一一个可以修改缓存范围的包装类。
在 VM options 加入参数:-XX:AutoBoxCacheMax=555 即将缓存区间的最大值改为 555.
下面看一下代码实例
Integer num1 = 99;
Integer num2 = 99;
Integer num3 = 128;
Integer num4 = 128;
System.out.println((num1 == num2) + "," + (num3 == num4));
太不可思议了,答案是: true, false
前面有写到,Interger 的缓存范围是 -128~127, 因此 128 超出了这个范围,num3 与 num4 所储存的内存地址不同,所以判断为 false
如果我们把 == 换成 equals 呢?System.out.println(num1.equals(num2) + ","+ num3.equals(num4));
答案变成了: true, true
这里要注意的是 equals 和 == 的区别
equals 判断的是两个变量指向的对象是否相同
== 判断的是两个变量的 ” 值 ” 是否相同
在这个例子中 equals 判断的是指向的对象也可以理解为这两个表面上的数是否相同,而 == 判断的是两个变量存放的内存地址是否相同,因此结果有了不同
最后不尽兴,用字符串再做个例子
String s1 = "apple";
String s2 = s1.toUpperCase();
String s3 = "APPLE";
System.out.println(s2 == s3);
结果是 false
参考
https://blog.csdn.net/u014602…
(新手起步,欢迎交流指正!)