【问题标题】:about intern in java关于java的实习生
【发布时间】:2011-06-01 09:40:41
【问题描述】:

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

【问题讨论】:

标签: java string-interning


【解决方案1】:

添加到@Joachim Sauer's答案,我们可以改变缓存上限

有些选项是

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

链接Java Specialist

【讨论】:

    【解决方案2】:

    自动装箱使用公共值的缓存,如§ 5.1.7 Boxing Conversion of the JLS 中所定义:

    如果p 的值被装箱是truefalsebytechar\u0000\u007f 范围内,或者intshort 数字介于 -128 和 127 之间,则令 r1r2p 的任意两次装箱转换的结果。 r1 == r2 总是这样。

    请注意,这被称为“实习”。该术语仅用于对 String 字面量所做的操作以及可以使用 String.intern() 显式完成的操作。

    【讨论】:

      【解决方案3】:

      当心你的“平等假设”。例如,对于整数:

          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
      

      【讨论】:

        猜你喜欢
        • 2018-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多