听说new都是在堆内存建立对象。 那String str="x" 没有new是否在堆内存建立对象? 在计算机的内存中有堆和栈两块空间,其中栈中存放所有对象、函数、变量等的饮用;而堆中存放对象、值等。 不管是new出的对象还是用类似String str = "x";这类的对象,都是放在堆中的。 对于你的第一个问题,举一个简单的例子: String str1 = "x" ; String str2 = "x" ; String str3 = new String("x") ; 表面上看这三句回实例化3个String对象,实际上是两个。再java中有一个叫“字符数据池”的内存管理机制,在对str2赋值之前,会检查池中有没有相同的数据,如果有,则直接引用;若没有,系统会实例化这个String的对象;而执行到String str3 = new String("x") ;系统会直接实例化该对象,而不会在池中查找。也不会将这个对象放在池中。 你可能会问,如果改动str1或str2时会不会改动另外一个引用的值。答案是不会。系统会首先在池中查找有没有相同的对象,如果没有,会实例化这个对象。