关于java的实习生

时间:2011-06-01 09:40:41

标签: java string-interning

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

3 个答案:

答案 0 :(得分:7)

添加到@Joachim Sauer's回答,我们可以 更改上限缓存值

部分选项是

  1. -Djava.lang.Integer.IntegerCache.high =值
  2. -XX:的 AutoBoxCacheMax =值
  3. -XX:+的 AggressiveOpts
  4. 链接Java Specialist

答案 1 :(得分:5)

自动装箱使用常见值的缓存,如§ 5.1.7 Boxing Conversion of the JLS

中所定义
  

如果框中的值ptruefalsebytechar范围为\u0000至{{ 1}},或介于-128到127之间的\u007fint个数字,然后让shortr1成为{{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