String s = new String("he")+"llo";
String s = new String("he")+"llo";这个代码反编译回来的结果应该是(new StringBuilder().append("he").append("llo")).toString();
创建了几个对象?
- 如果常量池中么有he和llo,一共创建了5个对象
- 常量池he
- 常量池llo
- StringBuilder对象一个
- new String("he")一个
- toString()生成完整String字符串一个
- 如果常量池中有he和llo中的一个,一共创建了4个对象
- 如果常量池中有he和llo,一共创建了3个对象
在字符串常量池中放置一般有两种情况 第一就是代码层面直接出现字面量 还有就是调用了intern()方法 除此之外可以认为不是经常使用的值 不一定往常量池里放 如果每个程序中出现过的字符串结构都扔到常量池里 那常量池岂不是要爆炸了
有些时候有的字符串是常量池里没有的 也就是我们在代码层面直接观察不到或者无法确定的值 比如从文件中读出的字符串 或者用户在控制台输入的字符串等等