关于常量池的问题

来源:6-5 Java数据类型、拆箱和装箱

慕前端7365659

2020-08-08

老师,我想问如果 String s1=“ab”+new String(“cd”);
这句话会有数据被放入常量池吗,还是说这句话等于新建了一个String对象,存储的值为abcd?
另外如果是Integer num=1000, 这个1000会被放入常量池吗?我看有的教程说-127到128是事先放入常量池的。

写回答

1回答

ccmouse

2020-08-19

String s1=“ab”+new String(“cd”), 这句话只有"ab", "cd"会被放入常量池,"abcd"并没有。所以的确新建了一个对象,其值为"abcd"。(当然中间还创建了new String("cd")),以及放入常量池的"ab"和"cd")

整数的话,的确是你所说的,不过范围是-128到127。这里面的整数对象是预先放入一个叫“整数缓存”IntererCache的地方。1000不会。

可以写一段程序证明:

String s1 = "abcd";
String s2 = "abcd";
System.out.printf("s1 == s2: %b\n", s1 == s2); // true
String s3 = "ab" + new String("cd");
System.out.printf("s1 == s3: %b\n", s1 == s3); // false
Integer n1 = 100;
Integer n2 = 100;
System.out.printf("n1 == n2: %b\n", n1 == n2); // true
Integer n3 = 1000;
Integer n4 = 1000;
System.out.printf("n3 == n4: %b\n", n3 == n4); // false


0
2
ccmouse
回复
慕前端7365659
只有在代码里写"abcd",才会把"abcd"放入常量池。如果只是这样一句:String s1=“ab”+new String(“cd”),“abcd"不会。(不过后面的例子因为有String s1="abcd"出现,所以是会的) 如果需要把运算结果也放入常量池,可以用intern函数: String s1=(“ab”+new String(“cd”)).intern();
2020-08-20
共2条回复

Google面试官亲授-Java面试新手尊享课

为面试新手量身定制的Java面试尊享课,解锁“鲤鱼跃龙门”的妙招

2853 学习 · 180 问题

查看课程