为了账号安全,请及时绑定邮箱和手机立即绑定

Java编译器在编译时如何处理修改后的字符串

Java编译器在编译时如何处理修改后的字符串

收到一只叮咚 2021-04-13 09:16:00
public class MyString {    public static void main(java.lang.String[] args){        String a="Hello";        a=a.trim().concat("World");        String c="HelloWorld";        System.out.println(a==c);//returns false    }字符串字面量应该隐式进行intern。然后为什么将a和c视为两个不同的字符串?a和c会指向字符串池中的相同内存引用吗?由a和c返回的哈希码相同,但a == c返回false。有人可以解释为什么返回的值是错误的。
查看完整描述

2 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

字符串文字应隐式进行实习

是的

那么为什么a和c被当作两个不同的字符串

因为它们是两个不同的String实例,所以碰巧具有相同的内容。a的值不是字符串文字。


查看完整回答
反对 回复 2021-04-28
?
守着一只汪

TA贡献1872条经验 获得超3个赞

该方法concat不会将新创建的字符串添加到字符串内部。这是实现concat:


public String concat(String str) {

    int otherLen = str.length();

    if (otherLen == 0) {

        return this;

    }

    int len = value.length;

    char buf[] = Arrays.copyOf(value, len + otherLen);

    str.getChars(buf, len);

    return new String(buf, true);

}

在JLS中也记录了以下内容:


在运行时通过串联计算的字符串是新创建的,因此是不同的。


这意味着当代码执行时,将String c="HelloWorld";创建一个新的String并将其添加到该intern中,因为前一个HelloWorldintern不存在。


这两个字符串的位置(引用)不同,因此使用==对其进行检查将返回false。


查看完整回答
反对 回复 2021-04-28
  • 2 回答
  • 0 关注
  • 190 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信