String 和 == 的小实验

本文详细探讨了Java中String对象的比较方式,包括常量与对象的区别,以及JVM编译期优化对字符串拼接的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为Java开发也有些年了。一直对于String对象的使用 == 比较有些疑问点。
有人说,String这么简单的对象有什么好搞不清的。
事实上,还真的有些小复杂。
这里涉及到几个方面:
1. 常量
2. 对象
3. jvm编译期优化


下面以几种情况做测试,并尝试解释原因。

  1. 对象

    String a = new String("i am String");
    String b = new String("i am String");
    

    这是初始化了两个对象,肯定指向不同地址。 a != b

  2. 常量

    String a = "i am String";
    String b = "i am String";
    final String c = "i am String";

    常量都放在常量池里,都是指向一个地址。 a = b = c

  3. 字符串拼接 (有final修饰)

    
    final String a = "i am ";
    final String b = "String";
    String c = a + b;
    
    String d = "i am String";

    final String在JVM眼里是一个常量。在编译期间,JVM会把所有引用常量的代码替换成常量值。所以在程序编译完成之后程序是这样的

    final String a = "i am ";
    final String b = "String";
    String c = "i am String"
    
    String d = "i am String";

    和常量的情况一样。c = d

  4. 字符串拼接 (无final修饰)

    String a = "i am ";
    String b = "String";
    String c = a + b;
    
    String d = "i am String";

    这里a 和 b 不是常量,所以c的值需要在运行期间才能确定。运行期间会生成一个新的String对象。c != d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值