我的问题是,如果实习生正在使用字符串和字符串有一个 它的SPC(字符串池常量)和实习生的概念也适用于整数, 所以有没有任何整数池常量?如果没有那么它的工作原理如何?
class InternExample
{
public void print()
{
Integer i=10;
Integer j=10;
String c="a";
String s="a";
System.out.println(i==j);// prints true
System.out.println(c==s);//prints true
}
public static void main(String args[])
{
new InternExample().print();
}
}
答案 0 :(得分:7)
添加到@Joachim Sauer's回答,我们可以 更改上限缓存值 。
部分选项是
答案 1 :(得分:5)
自动装箱使用常见值的缓存,如§ 5.1.7 Boxing Conversion of the JLS:
中所定义如果框中的值
的情况p
为true
,false
,byte
,char
范围为\u0000
至{{ 1}},或介于-128到127之间的\u007f
或int
个数字,然后让short
和r1
成为{{1}的任意两次装箱转换的结果}。始终是r2
。
但请注意,不称为“实习”。该术语仅用于对p
文字执行的操作以及使用String.intern()
明确执行的操作。
答案 2 :(得分:4)
谨防你的“平等假设”。例如,使用整数:
Integer a = 69;
Integer b = 69;
System.out.println(a == b); // prints true
Integer c = 1000;
Integer d = 1000;
System.out.println(c == d); // prints false
这是由于Integer的内部实现,为小值(从-127到128我想)的整数预先存在的对象。但是,对于更大的整数,每次都会创建一个不同的对象Integer。
对于你的字符串也是如此,源代码中的文字字符串将全部由编译器链接到同一个对象......他足够聪明地做到这一点。但是,当您从文件中读取字符串,或者在运行时创建/操作某个字符串时,它们将不再相等。
String a = "x";
String b = "x";
String c = new String("x");
System.out.println(a == b); // prints true
System.out.println(a == c); // prints false