JAVA String的问题

String s1 = "字符串";
String s2 = "字符串";
System.out.println(s1==s2);       //输出true

String s3 = new String("字符串");
String s4 = new String("字符串");
System.out.println(s3==s4);       //输出false

String s5 = "字"+"符串"; 
String s6 = "字符串";
System.out.println(s5==s6);       //输出true,编译阶段会将直接量直接计算出来,相当于省略+

String s7 = "字";
String s8 = "符串";
String s9 = s7 + s8;
String s10 = s7 + s8;
System.out.println(s9==s10);       //输出false,因为s9和s10是在运行阶段而不是编译阶段确定的

final String s11 = "字";
final String s12 = "符串";
String s13 = s11 + s12;
String s14 = s11 + s12;  
System.out.println(s3==s14);       //输出true,因为final会进行宏替换,如果final变量声明时就指定了初始值并且编译时就能确定,
                         		   //那么这个变量在编译时就全被替换为了确定下来的值,赋值语句就被忽略,相当于变量s11和s12不存在

以上我们知道了如果是直接量,不管是否使用了+连接,在内存中都相当于指向了同一个对象,因为直接量+会在编译阶段计算出来。但如果是变量形式的两个String类型相加,则会在运行时创建两个相同的对象。
综上编译阶段确定下来的相同的直接量Java只会创建一个对象,所有相同的引用变量都指向这个对象。

posted @   epiphanyy  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示