Java中String直接赋值,new String()以及new String(““).intern()的理解

话不多说,直接进入主题。首先是这样一段代码

        String s1 = "ab";
        String s2 = "ab";
        String s3 = "a"+"b";
        System.out.println(s1 == s2); // true
        System.out.println(s3 == s2); // true

像s1,s2这种字面量显示赋值,Java会直接在字符串常量池中寻找对应的字符串"ab",如果不存在则新建,否则就直接返回常量池中的值。代码String s1 = “ab"时,java会在常量池中开辟一段空间存入字符串"ab”。
接着代码String s2 = “ab”,java同样会在字符串常量池中寻找字符串"ab",此时常量池中存在字符串"a",则直接指向字符串常量池中的"ab"。和s1指向同一个对象。所以结果为true。
同时s3的"a"+“b"也会在java编译时自动优化成"ab”,指向的也是同一个对象。
在这里插入图片描述

那如果我们使用new String(“ab”)呢?

        String s1 = "ab";
        String s2 = new String("ab");
        System.out.println(s1 == s2); // false----s2在堆上

首先,要说明new String()一定会在堆内存中开辟一个空间去new 一个对象。且s2一定指向这个堆内存中的对象。但是如果在new String(“ab”)时常量池中不存在"ab",就会现在常量池中创建"ab",在执行new操作。再将new出来的对象引用赋值给s2。这时s1指向的时常量池中的"ab",而s2指向的是堆内存中的对象。如下图:
在这里插入图片描述
那如果是字符串拼接时,其中一个值是变量呢?

        String s1 = "ab";
        String s2 = "a";
        String s3 = s2+"b";
        System.out.println(s1 == s3); // false

当字符串拼接时其中一个是变量时,java会new 一个StringBuilder对象去append字符串。我们直接看字节码文件:
在这里插入图片描述也就是说s3的值是new StringBuilder().append(s2).append(“b”).toString(),而StringBuilder的toString方法实现也是new String();说白了也是new 一个String对象并返回(这个方法并不会在常量池中创建对应的值)。所以s1 == s3的结果为false;

intern方法

接下来就是String的intern的方法。String的intern方法作用是在常量池中寻找对应的字符串。如果存在就直接指向常量池中的对象,否则就在常量池中新建一个对象,但是这个对象的值是引用String的地址。以下面的代码为例:

        String s1 = new String("1") + new String("1");
        s1.intern();
        String s2 = "11";
        System.out.println(s1 == s2); // true

s1同样是通过new StringBuilder().append方法拼接"1"。new String(“1”)在常量池中新建了"1”.但常量池中并不存在"11"。但s1的值是"11",所以s1.intern()时会在常量池中创建一个对象,这个对象存储着s1在堆中的内存地址。此时 String s2 = “11"在常量池中寻找"11”,会指向刚才intern()所创建的"11",也就间接指向了s1。所以s2和s1是同一个对象。

        String s = new String("1") + new String("1");
        String s2 = "11";
        s = s2.intern();
        System.out.println(s == s2); // true

如上面的代码,常量池中已经存在"11",调用intern方法时就改变了指针,指向了和s2。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值