美文网首页java面试题
字符串相关题目

字符串相关题目

作者: 梁海杰_IRV | 来源:发表于2017-10-16 00:22 被阅读0次

    问: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/

    ....未完...

    相关文章

      网友评论

        本文标题:字符串相关题目

        本文链接:https://www.haomeiwen.com/subject/bhrhuxtx.html