Java,猜猜输出是什么?

看看下面代码的输出是什么:

public class MemoeryManager {
    public static void main(String[] args){
        String a="a";
        String b="b";
        String ab="ab";
        final String af="a";
        String plus=a+"b";
        String result=af+"b";
        System.out.println((a+b)==ab);
        System.out.println("a"+"b"==ab);
        System.out.println(result==ab);
        System.out.println(plus==ab);
        System.out.println(plus.intern()==ab);
    }
}

输出是:

false
true
true
false
true

解释:

  • (a+b)==ab

  a+b是两个变量相加,需要到运行时才能确定其值,到运行时后JVM会为两者相加后产生一个新的对象,因此a+b==ab的结果为false。

  ● (“a”+”b”)==ab

  “a”+”b”是常量,在编译时JVM已经将其变为”ab”字符串了,而ab=”ab”也是常量,这两者在常量池即为同一地址,因此(“a”+”b”)==ab为true。

  ● result==ab

  result=afinal+”b”,afinal是个final的变量, result在编译时也已经被转变为了”ab”,和”ab”在常量池中同样为同一地址,因此result==ab为true。

  ● plus=ab

  plus和a+b的情况是相同的,因此plus==ab为false。

  ● plus.intern()==ab

  这里的不同点在于调用了plus.intern()方法,这个方法的作用是获取plus指向的常量池地址,因此plus.intern()==ab为true。

      String的intern()方法是一个本地方法,定义为public native String intern(); intern()方法的价值在于让开发者能将注意力集中到String池上。当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

      (也就说,一个String对象可能是指向堆的,也可能是指向池的,并且在运行时生成的String,貌似都指向堆?这个不能肯定,以后确定。)

posted @ 2013-10-09 15:32  orchid  阅读(220)  评论(0编辑  收藏  举报