1

我的问题是,如果实习生正在使用字符串和具有 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();  
}  
}
4

3 回答 3

7

添加到@Joachim Sauer 的答案中,我们可以更改上限缓存值

一些选项是

  1. -Djava.lang.Integer.IntegerCache.high=值
  2. -XX: AutoBoxCacheMax =值
  3. -XX:+ AggressiveOpts

链接Java 专家

于 2011-06-01T09:53:08.750 回答
5

自动装箱使用公共值的缓存,如JLS 的 § 5.1.7 装箱转换中所定义:

如果p被装箱的值是true, false, a byte, achar在 to 的范围内\u0000,\u007f或一个介于 -128 和 127 之间的数字, 那么让int和是的任意两次装箱转换的结果。总是如此。shortr1r2pr1 == r2

但是请注意,这称为“实习”。该术语仅用于对String文字执行的操作以及可以使用String.intern().

于 2011-06-01T09:47:41.400 回答
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
于 2011-06-01T10:22:37.753 回答