不是高手,查了一下jdk,我是这样理解的。1、intern机制对于String的字面常量(literal string)和String 的常量(String constant)是一种默认行为,都会在一个pool中保存唯一的一份。pool中的String都是唯一的(不会重复)。2、intern方法,它会查找池是否有一个和当前String相等(由equals决定),有则返回pool中String的引用,否则,在pool中新增这个string,然后再返回这个新增String的引用。因此,如果s1.intern() == s2.intern() 则 s1.equals(s2)也成立。3、s3.intern():在pool中创建了一个新的String:hello。
   s4.intern():不做什么事,返回s3.intern()创建的那个string。   s5和s6则不需要在pool中产生实例(s5和s6是字面常量(literal string))。它们默认的方式便是在pool中产生。4、
System.out.println(s3.intern() == s4.intern()); //输出true,是因为它们返回的引用是同一个。
System.out.println(s5 == s6); //s5和s6指向了同一个string,也就是说它们的引用是相等的。==操作对于string而言,比较的仅为它的引用,因此,都为true,你还可以试试下面的语句,返回的肯定还是true。
System.out.println(s5 == s3.intern());

解决方案 »

  1.   

    补充:使用new产生的对象并不适用于intern机制。String s1 = "a";
    String s2 = "aaa";
    String s3 = "a";s1、s3同一个引用,s2另一个的引用。但它们都在pool中。
    String newStr = new String("my god!");
    newStr不在pool中,"my god!"会出现在pool中,但是暂无人使用。因此:intern的作用在于:将string加到pool中,供另外的String的字面常量(literal string)和String 的常量(String constant),节约空间和速度。:)
      

  2.   

    首先俺要很严重的感谢您的回答,我认真的读了几遍,感觉基本上是清楚了,刚才正想问一个最后一个问题,就是new String("hello")时,是否涉及到pool,没想到,我刷新了一下,就发现你的补充了,再次严重感谢.
      

  3.   

    小弟愚钝,请再解释一下这句吧System.out.println(s3 == s4);
      

  4.   

    String newStr = new String("my god!");
    newStr不在pool中,"my god!"会出现在pool中,但是暂无人使用。
    newStr和"my god!"是个什么关系?
    一个类被实例化之后不在pool中申请空间吗?
      

  5.   

    string都讨论烂了..
    前一段时间都讨论的那么透彻了...
    还有人问?:(
      

  6.   

    String s3 = new String("hello");
    String s4 = new String("hello");java语言规范,不保证s3==s4,只能保证s3.eqauls(s4).s3==s4要看编译器和jvm,
    当前,sun的javac是同一个class里的相同文本用的是同一个String实例.如果是未优化的编译器和jvm,有可能s3!=s4.