java ==号比较String字符串的地址

==号比较String字符串
java ==号比较
java ==号比较String
java ==号比较


/**
 * java ==号比较String字符串的地址
 * <p>
 * String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。
 * 字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。
 * 因为String对象是不可变的,它们可以被共享
 *
 * @author silence
 * @date 2021/6/18
 */
public class StringTest {
    public static void main(String[] args) {
        String a = "hello";
        String b = "hell" + "o";
        String g = "hell";
        String c = g + "o";
        String d = new String("hello");
        final String e = "hell";
        String f = e + "o";

        System.out.println("a:" + a);
        System.out.println("b:" + b);
        System.out.println("c:" + c);
        System.out.println("d:" + d);
        System.out.println("f:" + f + "\n");

        //a:为字符常量池地址a   b:字符常量"hell" + "o" 相加  java会进行优化为 hello等于 b 进行存储
        //此时字符常量池中已经存储了字符串“hello” 所以b会直接引用常量池的地址值。所以a 和 b 地址值相等
        System.out.println("a == b   " + (a == b));

        //a:为字符常量池地址a  c=变量g("hell") + 字符常量"o"  字符串变量相加 java底层会使用 StringBuilder
        //或StringBuffer  的append()方法拼接,再调用tostring 存储在堆中 所以和字符常量池a 地址不等
        System.out.println("a == c   " + (a == c));

        //a:为字符常量池地址a  d:new String("hello");  new 关键字每次会在堆中开辟一个新的内存空间存储
        // 所以d存储的地址是一个新的内存空间,不在字符常量池中。 所以地址不等
        System.out.println("a == d   " + (a == d));

        //a:为字符常量池地址a   f: final String e = "hell" + "o"  因为变量e 使用final修饰所以
        //是常量不是变量 所以不会调用StringBuilder 拼接。e + a= "hell" + "o"java会优化为hello
        //此时 f 会引用 a在字符常量池的地址  所以a 和 f 的地址相等
        System.out.println("a == f   " + (a == f));
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silence丶你的名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值