字符串相关题目

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

....未完...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,026评论 18 399
  • 前言 不知道大家有没有这样一种感觉,程序员的数量井喷了。可能是因为互联网火了,也可能是各家培训机构为我们拉来了大量...
    活这么大就没饱过阅读 7,657评论 6 25
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,471评论 11 349
  • 有个墨迹老公,什么都不提前干,块气死了
    阿娟手记阅读 1,638评论 0 0
  • 在佛教初传不久的魏晋南北朝时,曾经把壁画中的飞仙亦称为飞天,是飞天、飞仙不分。后业随着佛教在中国的深入发展,佛教的...
    三哥说玉阅读 4,268评论 1 1