java 字符串拼接、涉及到jvm的两个问题

瑞hong不还钱
  • 39
public void run(String url, String path){
    string newUrl = url + "/user" + path + "/2";
}

以上是一段字符串拼接的代码,我知道这么写不太规范,仅用来举个例子。以JDK8为准。请问:
1、"/user" 和 "/2" 是否保存到了jvm的常量池里面了?
2、在拼接过程中是否只 new 了 newUrl 这一个对象?如果不是,能否分析下总共 new 了几个对象?

请大神指教,谢谢!

回复
阅读 389
2 个回答
✓ 已被采纳
  1. 还有一个 StringBuilder

如果要认真考虑new了几个对象。我想先明确对象是啥,如果对象说的是保存在堆中的,有对象头的东西,那newUrl这个变量,我感觉不能算一个对象吧。他只是保存了创建出来的对象的引用。因为从字节码层面看,newUrl就是一个占用四字节的变量,保存了对象的地址之类的信息吧。

至于到底new了几个对象,看了下1.8生成的字节码,确实是转变成了new StringBuilder(),然后通过append把四个字符串拼接,最后调用StringBuilder.toString()返回拼接后的字符串。 其实StringBuilder.toString()里边还会new一个String出来;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏