问:String str = new String(“abc”)
,“abc”在内存中是怎么分配的?
问:说说String str = "hello world";
和 String str = new String("hello world");
的区别?
答: 字符串常量区、堆、对象的引用在栈中。
单纯问字符串abc当然是常量
然后new的string在堆用了常量的值
然后栈里的str值为堆区地址
在 java 的 class 文件中有专门的部分用来存储编译期间生成的字面常量和符号引用,这部分叫做 class 文件常量池,在运行期间对应着方法区的运行时常量池,所以String str = "hello world";
在编译期间生成了字面常量和符号引用,运行期间字面常量 "hello world" 被存储在运行时常量池(只保存了一份)。而通过 new 关键字来生成对象是在堆区进行的,堆区进行对象生成的过程是不会去检测该对象是否已经存在的,所以通过 new 来创建的一定是不同的对象,即使字符串的内容是相同的。(简单来说:字面量定义的字符串变量,在创建该对象之前,JVM会在String对象池中去搜索该字符对象是否已经被创建,如果已经被创建,则直接返回一个引用,否则先创建在返回引用。而,用new关键字创建,会创建一个新的对象并且返回一个引用。)
关于堆和栈
Java中所有由类实例化的对象和数组都存放在堆内存中,无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。而栈内存用来存储局部变量和方法调用。
更详细的关于堆和栈的区别 http://droidyue.com/blog/2014/12/07/differences-between-stack-and-heap-in-java/
....未完...
网友评论