全是常量的字符串在编译时会进行优化,也就是说编译器会将你写的语句优化成String s = “welcometo360”
常量区分配发生在编译器,new发生在运行区,所以String str2 = "he" + new String("llo");是在堆上分配
静态常量字符串同样进入常量池

String s = new String("xyz");创建了几个StringObject?
两个或一个都有可能

String::intern()是一个本地方法,它的作用是如果字符串常量池中已经包含一个等于此String对象的 字符串,则返回代表池中这个字符串的String对象的引用;否则,会将此String对象包含的字符串添加 到常量池中,并且返回此String对象的引用

因此Javac编译器会对String连接做自动优化。在JDK 5之前,字符串加***转化为StringBuffer 对象的连续append()操作,在JDK 5及以后的版本中,会转化为StringBuilder对象的连续append()操作
String classFile = "com.jd.". replaceAll(".", "/") + "MyClass.class";
由于replaceAll方法的第一个参数是一个正则表达式,而"."在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成"/"。如果想替换的只是".",那么久要写成"\."