String a=“123”;String b=“123456”;String c=a+“123”;,c==d 等于 false

5 篇文章 0 订阅
  • 理解使用 + 运算符 直接 连接 两个 字符串 字面量 所执行的操作;
  • 理解使用 + 运算符 连接 一个 字符串 字面量 和 另一个 String 类型的引用变量 所执行的操作;

向 面试官 回答时,主要将 Java 8 中的实现过程,在 Java 11 中所完成的操作暂时仅做了解。

例子:

String a = "黄沙百战" ; 
String b = "穿金甲" ; 
String c = "黄沙百战穿金甲" ; 

String d = "黄沙百战" + "穿金甲" ;

对于:String d = "黄沙百战" + "穿金甲" ;

  • java 8 中的解释:
  1. 当使用 + 连接 两个 字符串 直接量时,在 String 常量池中完成 字符串 的 连接操作;
  2. 如果 新字符串 在 String常量池 中不存在,则首先将 新字符串 添加到 String 常量池 中并返回该串的地址;
  3. 如果 新字符串 在 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 中的解释:
  1. StringBuilder sb = new StringBuilder( a ) ; // 创建一个字符缓冲区,并在其中存放 ‘黄’ , ‘沙’ , ‘百’ , ‘战’;
  2. sb.append( “穿金甲” ) ; // 在 字符缓冲区 中 追加 ‘穿’ , ‘金’ , ‘甲’ ,此时在 字符缓冲区中存在 7 个字符;
  3. 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值