关于基础,关于String

  String pig="length: 10";
  String duk="length: "+10;
  String dog="length: "+pig.length();
  System.out.println(pig==dog);
  System.out.println(pig==duk);
      为什么 pig==dog 是false
      pig==duk是true这是知道的

在java里字符串是常量,直接定义String pig="length: 10"后字符串对象是保存在jvm的string pool里的,和String duk="length: "+10;是指向同一个。所以两个会相等

但是在字符串连接时包含变量的时候,是在堆栈区创建一个String对象,所以和string pool里的就不是同一个了

楼主不妨搜一下java里string的原理之类的多了解下,比如http://hellsing42.iteye.com/blog/570916

dog 是 "length:" + pig.length(); pig.length()是一个int,值为string pig的长度,即9.所以dog = "length:" + 9;

这个是编译器跟你优化的结果,写一个简单的代码:
public class Test {
public static void main(String args[]) {
String s = "a" + "b";
System.out.println(s);
}

}
通过javap -c Test查看字节码
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String ab
2: astore_1
3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
6: aload_1
7: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: return

}
你会发现直接上只生成了一个String对象值为ab。但是当字符串拼接的时候加的是一个变量
编译器就不是这样优化了,而是生成一个StringBuilder调用append函数进行字符串的拼接
最后通过toString()方法返回
相应的字节码你可以自己去看看