java中关于字符串==的问题

String s1 = "hello";
String s2 = "hel" + "lo";
String s3 = "hel" + new String("lo");
System.out.println(s1==s2); // true
System.out.println(s1==s3); // false

主要是关于s3不是很理解,求大佬解释一下s3的创建过程和为什么s1和s3不等

阅读 2.4k
3 个回答
  • new是一个分配内存的过程,会生成内存地址
  • String作为字符串常量,被存在常量池
  • 在编译的时候,String变量之间的加号会被优化为StringBuilder().append()

So
s1:先在字符串常量池查找是否已有“hello”对象,没有,创建之,并把引用地址赋给s1

s2:本质上是new StringBuilder("hel").append("lo"),常量池中已存在“hello”对象,所以是对同一内存对象的引用,故sout(s1 == s2)为true

s3:new String("lo")会在常量池中创建一个新的字符串对象,即使通过new StringBuilder().append()拼接成"hello",也已经是全新的存在了,换句话说,即使s3 = new String("hello"),结果依然是false,因为new

这个不是==的问题,你要去了解一下String的源码。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题