语法问题

在C++中有两种方式来建立一个对象 在堆中和在栈中
但在java中 据说有一个种那就是在堆中了!用new来申明(除去一些特殊情况)

那:
String a ="aaaaaaaaaa";
String a= new String("aaaaaaaaa");

有什么区别?

没有区别,写法区别而已,String是个对象

首先,我们要知道,"aaaaaaaaaa"这个字符常量是在Class结构的Constant Pool里面分配的。
参考这个link.
http://jakarta.apache.org/bcel/manual.html
里面有类加载到内存中的结构。


字符串常量和一般字符串还是有一些区别:
字符串常量的声明方法,和一般字符串的声明方法之间的区别。下面举例说明这个区别。

String a = “ABC”; // 字符串常量
String b = “ABC”; // 字符串常量
String c = new String(“ABC”); // 不是字符串常量

这里我们有a == b,a和b 这两个字符串的reference相等,都指向字符串常量”ABC”。
尽管c.equals(a)并且c.equals(b),但是c != a,c != b。c有自己的reference,指向new String(“ABC”)。

可以运行这段代码,看看结果。
这可能是JVM为了做优化所导致的结果。