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

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不同。侧面证明了不同常量值的地址不同,但是同一个字符串都是从同一个常量池中取值的
     所以不再字符串池中创建这个说法目前来看站不住脚
    
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器