Java语法——String

String(JDK 1.8)

字符串拼接如何实现?

参考:Java String + 拼接字符串原理

String str1 = "111111";

String str2 = "222222";

String str = str1 + str2;

System.out.println(str);

// 实现原理:

String str1 = "111111";

String str2 = "222222";

StringBuilder sb = new StringBuilder();

sb.append(str1);

sb.append(str2);

String str = sb.toString();

System.out.println(str);


字符串字面量什么时候在字符串常量池创建实例对象?

参考:Java字符串字面量是何时进入到字符串常量池中的

// 测试1
// 执行到该行在字符串常量池创建“str1”实例
String str1 = "str1";

// 执行到改行在字符串常量池和堆区都创建一个“str2”实例(没错!创建了2个对象)
String str2 = new String("str2");

// 执行到改行在堆区创建“str1str2”实例
String str3 = str1 + str2;

// 执行到改行,将堆区“str1str2”实例的引用存入字符串常量池
str3.intern();

// 从字符串常量池返回给 str4 的是指向堆区“str1str2”实例的引用
String str4 = "str1str2";
// 编译时被优化为“str1str2”,因此从字符串常量池返回给 str5 的也是指向堆区“str1str2”实例的引用
String str5 = "str1" + "str2";

System.out.println(str3 == str4);  // true
System.out.println(str3 == str5);  // true

// 测试2
// 字面量"1"会在字符串常量池创建实例对象1a,new 会在堆区创建实例对象1b,返回给 s 的是堆区的1b的引用
String s = new String("1");

// 在字符串常量池发现已经存在 equals("1") 的实例对象1a,于是什么都不做
s.intern();

// 字面量一定是先去字符串常量池查找有无 equals 的字符串实例对象
// 由于字符串常量池已经存在"1"实例对象1a,所以返回给 s2 的是字符串常量池1a的引用
String s2 = "1";

System.out.println(s == s2);  // false

// 测试3
System.out.println(null + str1);  // nullstr1

总结

  • 只要是字符串字面量,使用时(程序执行到此处)一定会在字符串常量池创建String实例对象。
  • 只要使用 new 关键字,一定会在堆区创建String实例对象。
  • 字符串拼接的时候底层也使用了 new 关键字,一定会在堆区创建String实例对象。
  • 若String实例对象只在堆区存在,调用 intern() 方法会将堆区String实例对象的引用存入字符串常量池。
  • 遇到字符串字面量一定是在字符串常量池创建对象或获取对象引用。
  • new 返回的一定是堆区的String实例对象。
  • “str1” + “str2” 在编译时会被优化为 “str1str2”。
  • null 在字符串拼接时会被当作"null"处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值