- 理解使用 + 运算符 直接 连接 两个 字符串 字面量 所执行的操作;
- 理解使用 + 运算符 连接 一个 字符串 字面量 和 另一个 String 类型的引用变量 所执行的操作;
向 面试官 回答时,主要将 Java 8 中的实现过程,在 Java 11 中所完成的操作暂时仅做了解。
例子:
String a = "黄沙百战" ;
String b = "穿金甲" ;
String c = "黄沙百战穿金甲" ;
String d = "黄沙百战" + "穿金甲" ;
对于:String d = "黄沙百战" + "穿金甲" ;
- java 8 中的解释:
- 当使用 + 连接 两个 字符串 直接量时,在 String 常量池中完成 字符串 的 连接操作;
- 如果 新字符串 在 String常量池 中不存在,则首先将 新字符串 添加到 String 常量池 中并返回该串的地址;
- 如果 新字符串 在 String常量池 中已经存在 则直接返回已经存在的 字符串 的地址 ( 不再添加新拼接的字符串 );
- java 11 中的解释:
在 JDK 11 中在编译阶段就将两个字符串合并了。
开始比较:
使用 == 比较两个变量时是在比较两个变量中存储的值
System.out.println( c == d ); // true
// identityHashCode():返回根据对象物理内存地址产生的hash值
System.out.println( System.identityHashCode( c ) ); // 1509514333
System.out.println( System.identityHashCode( d ) ); // 1509514333
接下来:
String e = a + "穿金甲" ; // 至少在 JDK 11 中已经是通过 invokedynamic 实现的
System.out.println( c == e ); // false : 使用 == 比较两个变量时是在比较两个变量中存储的值
String f = "黄沙百战" + b ;
System.out.println( c == f ); // false
对于:String e = a + "穿金甲" ;
- java 8 中的解释:
- StringBuilder sb = new StringBuilder( a ) ; // 创建一个字符缓冲区,并在其中存放 ‘黄’ , ‘沙’ , ‘百’ , ‘战’;
- sb.append( “穿金甲” ) ; // 在 字符缓冲区 中 追加 ‘穿’ , ‘金’ , ‘甲’ ,此时在 字符缓冲区中存在 7 个字符;
- sb.toString() ; // 在 toString 方法内部创建并返回一个新的 String 实例,其中封装了 “黄沙百战穿金甲”;
- JDK 11 中是通过 invokedynamic 实现的。
String g = a + b ;
// 对于String g = a + b ; 内部实现如下:
// StringBuilder sb = new StringBuilder();
// sb.append( a );
// sb.append( b );
// sb.toString(); 在 toString 方法内部创建并返回一个新的 String 实例
System.out.println( c == g ); // false