Java程序猿都知道常量池,字符串会缓存,小于128的Int也会缓存。那你知道下面几种情况的输出结果吗?
String str = "127";
Integer int1 = Integer.parseInt(str);
Integer int2 = Integer.parseInt(str);
System.out.println("1:" + (int1 == int2));
String str2 = "128";
Integer int3 = Integer.parseInt(str2);
Integer int4 = Integer.parseInt(str2);
System.out.println("2:" + (int3 == int4));
int int5 = 126;
Integer int6 = Integer.parseInt("126");
System.out.println("3:" + (int5 == int6));
String str3 = String.valueOf("127");
String str4 = String.valueOf("127");
System.out.println("4:" + (str3 == str4));
String str5 = String.valueOf("127");
String str6 = String.valueOf(127);
System.out.println("5:" + (str5 == str6));
String str7 = String.valueOf(127);
String str8 = String.valueOf(127);
System.out.println("6:" + (str7 == str8));
不喜欢卖关子,直接上结果,如果和你的结果一致,那么恭喜你,可以不用往下看了。
如果你和我一样,对结果有疑问,那么我们一起来探讨。
1、2、3:通过Integer.parseInt()方法将同一个字符串解析成数字,如果数字小于128,则缓存了,所以1是true,2是false,3是true。
4、5、6,:这里我们通过String.valueOf()的重载方法来获得字符串,所以我们要想知道结果是怎么来的,先要查看这两个重载方法有什么区别。直接上源码:
很明显,我们可以看到传入字符串的话,我们得到的字符串就是传入的这个字符串。所以4是true就很好解释了。
我们再看传入int类型的时候的源码:
继续往里面看:
我们发现他new了一个新的字符串,既然有new这个关键字,那么肯定在堆中产生了一个新的对象。所以5、6都是false。