一二三onetwothree
2016-04-29 12:57
采纳率: 33.3%
浏览 1.2k

java String类创建对象相关

“执行语句 String str = new String("abc") 时,不管字符串池中是否存在"abc" ,直接新建一个字符串"abc"(注意:新建的字符串"abc" 不是在字符串池中),然后将其赋给str。”
百度上看到这段,有几个疑问:
1、之前认为new创建String对象时,会先判断常量池中是否存在"abc",如果有就不在常量池中创建"abc",没有就创建并返回给堆中的new String(),自己理解的和上端叙述有点出入,不知道哪个是对的。
2、“(注意:新建的字符串"abc" 不是在字符串池中)”,如果他是正确的,那么新建的"abc",是存在堆中的么?

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • danielinbiti 2016-04-29 14:08
     字符串池中会创建,只是说new String()也同时会在堆中创建一个对象。
     这个可以看jvm指令能说明的。
     String s = new String("abc");
     String s1 = new String("abc");
     String s2 = new String("abc2");
     上面这三句话如果用javap转成jvm指令,s和s1会从同一个地址的常量池中取abc,而s2因为不是同一个字符串,地址和s和s1不同。侧面证明了不同常量值的地址不同,但是同一个字符串都是从同一个常量池中取值的
     所以不再字符串池中创建这个说法目前来看站不住脚
    
    评论
    解决 无用
    打赏 举报
  • Jintao_Ma 2016-05-01 02:34

    1.你的理解是错的,你说的“如果有就不在常量池中创建"abc"”,答案是:即使池中有,这时候仍然要在堆中创建一个,你看一下String的构造函数;
    你说的“没有就创建并返回给堆中的new String()”,答案是:没有的话,创建一个字符串放入池中,接着在堆中新建一个,最后在栈中添加一个堆中Hello的引用;
    详情见:
    http://blog.csdn.net/jintao_ma/article/details/51042900

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题