栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java中字符串连接时为“ ==”

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中字符串连接时为“ ==”

发生了四件事:

  1. (您清楚地知道这一点,但对于潜伏者来说)

    ==
    测试以查看变量是否指向 同一
    String
    对象
    ,而不是 等效的 字符串。所以,即使
    x
    "foo"
    y
    "foo"
    x == y
    可能是真的还是假的,这取决于是否
    x
    y
    指向同一个
    String
    对象或不同的。这就是为什么我们使用
    equals
    而不是
    ==
    比较字符串的等效性的原因。以下所有内容仅是为了解释为什么
    ==
    有时是正确的,并不是建议使用
    ==
    字符串进行比较。:-)

  2. 相同类中的等效字符串常量(根据JLS中的各种规则,编译器知道的字符串是常量)由编译器(它也在类的“常量池”中列出)引用相同的字符串。这就是为什么

    a == b

  3. 当类被加载,它的每一个字符串常量自动 扣留 - JVM的字符串池检查等效字符串,如果找到一个,即

    String
    使用对象(如果没有,新
    String
    的恒新对象添加到池)。因此,即使
    x
    是在类中初始化的字符串常量
    Foo
    和在类中初始化
    y
    的字符串常量
    Bar
    ,它们也将
    ==
    彼此存在。

JLS§3.10.5部分覆盖了以上第2点和第3点。(关于类常量池的一点是实现细节,因此是到JVM规范的链接;
JLS只是讲到了内部。)

  1. 编译器在处理常量值时会进行字符串连接,因此
    String d = "dev" + "ender";

编译为

    String d = "devender";

并且

"devender"
是一个字符串常量,编译器和JVM将上面的第2点和第3点应用于该常量。例如,不
StringBuilder
使用,则串联发生在
编译时 ,而不是运行时。JLS§15.28-
常量表达式
中对此进行了介绍。所以
a== d
是真正出于同样的原因
a == b
是正确的:它们指向同一个常量字符串,所以编译器确保他们指的在类的常量池相同的字符串。

当任何一个操作数都不是常量时,编译器将无法执行此操作,因此它不能使用以下操作:

    String e = c + "ender";

…即使代码分析可以很容易地显示出的价值

c
肯定是
"dev"
,因此
e
也肯定是
"devender"
。具体来说,该规范仅允许编译器使用常量值进行连接。因此,由于编译器无法执行此操作,因此它将输出
StringBuilder
您引用的代码,并且工作在运行时完成,从而创建了一个新
String
对象。该字符串不会自动
e
插入,因此最终会指向与该
String
对象不同的对象
a
,因此
a== e
为false。

请注意,如Vinod所说,如果您声明

c
final

    final String c = "dev";

然后它将是一个
常量变量
(是的,它们确实被称为该
变量
),因此将应用§15.28,并且编译器将打开

    String e = c + "ender";

进入

    String e = "devender";

并且

a == e
也将是如此。

只是重申一下:这都不意味着我们应该使用

==
比较字符串的等效性。:-)那
equals
是为了什么。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437975.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号