② 下面我们再看一题经典的笔试面试题:String javaStr = "小学徒" + "的" + "成长历程";总共创建了多少个字符串对象?

  答案是一个,因为如果一个字符串连接表达式的值可以在编译时确定下来,那么JVM会在编译时计算该字符串变量的值,并让他指向字符串池中对应的字符串。但如果程序使用了变量,或者调用了方法,那么只能等到运行时才可确定该字符串连接式的值,也无法在编译时确定字符串变量的值,因此无法确定该字符串变量的值,所以无法利用JVM的字符串池。

  下面我们写一段代码验证一下吧:

public class Test{
   
     public static void main(String[] args) {
         String anotherStr = "小学徒的成长历程";
       
         //虽然javaStr的值不是直接量,但是因为javaStr的值可以在编译时确定
         //所以javaStr也会直接引用字符串池中对应的字符串
         String javaStr = "小学徒" + "的" + "成长历程";
       
         String a = "的";
       
         //使用了变量,只能等到运行时才可确定该字符串连接式的值
         //也无法在编译时确定字符串变量的值,因此无法确定该字符串变量的值,所以无法利用JVM的字符串池
         String contactStr = "小学徒" + a + "成长历程";
       
         //调用了方法只能等到运行时才可确定该字符串连接式的值
         //也无法在编译时确定字符串变量的值,因此无法确定该字符串变量的值,所以无法利用JVM的字符串池
         String methodStr =  "小学徒的成长历程" + a.length();
       
         //判断各个字符串是否相等
         System.out.println("javaStr == anotherStr : " + (javaStr == anotherStr));
         System.out.println("contactStr == javaStr : " + (contactStr == javaStr));
         System.out.println(" methodStr == javaStr : " + (methodStr == javaStr));
       
   
     }
 }

  运行结果:

  ③ 呵呵,我们再用一题经典面试笔试题目来抛砖引玉吧,这样比较可以诱导大家的思考,同时增加大家的兴趣,不会太过闷,而且还能提醒大家在笔试面试的时候该注意什么地方,好啦,言归正传。String name = "小学徒";  name = name + "的成长空间";两条语句总共创建了多少个字符串对象?

  答案是两个,因为当一个String对象创建完成后,该String类里包含的字符串序列被固定下来了,以后永远都不能改变。(如果目前不懂这句的话,没关系,看下补充你理解的了)

public class Test{
   
     public static void main(String[] args) {
         String name = "小学徒";    //定义一个字符串变量
         System.out.println(System.identityHashCode(name));    //输出该对象的hashCode值
         name = name + "的成长空间"; //拼接字符串变量
         System.out.println(System.identityHashCode(name));//输出该对象的hashCode值
     }
 }

  运行结果: