【问题标题】:why these strings are not pointing to the same object in java? [duplicate]为什么这些字符串没有指向java中的同一个对象? [复制]
【发布时间】:2021-04-18 17:36:11
【问题描述】:

我知道如果我有 2 个具有相同值的字符串变量,由于 java 字符串池,它们指向同一个字符串对象。

这是一个例子:

String test = "1234";
String test2 = "1234";
    
System.out.println(test == test2);
System.out.println("1234" == test2);

输出如下:

true
true

但如果我有以下代码,它会打印出它们不是同一个对象

String test = "1234";
int i = 1234;
String s = "" + i;
    
System.out.println(test == s);
System.out.println("1234" == s);

输出:

false
false

请谁给我解释一下这种行为的原因?

【问题讨论】:

  • I know that if I have 2 string variables with the same value, they point to the same string object because of the java string pool. 不,他们没有。
  • 这是因为 i 根据 Java 对该术语的非常狭隘的定义,它不是一个常量表达式。
  • 字符串池用于字符串常量。 "" + i 不是字符串常量。参考stackoverflow.com/questions/2486191/…
  • 这能回答你的问题吗? How do I compare strings in Java?
  • @Sachin - 您提出的重复目标没有回答这个问题。

标签: java string pool


【解决方案1】:

"" + i; 不是一个常量表达式,所以它没有被实习。如果i是final或者直接写成"" + 1234,那么这个值就会被interned。

§3.10.5. String Literals:

此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串字面量 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用 String.intern 方法共享唯一实例。

§15.28. Constant Expressions:

常量表达式是表示原始类型值或字符串的表达式,它不会突然完成并且仅使用以下内容组成:
  • 原始类型的文字和字符串类型的文字(§3.10.1、§3.10.2、§3.10.3、§3.10.4、§3.10.5)
  • 转换为原始类型和转换为字符串类型(第 15.16 节)
  • 一元运算符 +、-、~ 和 ! (但不是 ++ 或 --)(§15.15.3、§15.15.4、§15.15.5、§15.15.6)
  • 乘法运算符 *、/ 和 %(第 15.17 节)
  • 加法运算符 + 和 - (§15.18)
  • 移位运算符 > 和 >>>(第 15.19 节)
  • 关系运算符 和 >=(但不是 instanceof)(第 15.20 节)
  • 等式运算符 == 和 !=(第 15.21 节)
  • 按位和逻辑运算符 &、^ 和 | (§15.22)
  • 条件与运算符 && 和条件或运算符 || (§15.23, §15.24)
  • 三元条件运算符? : (§15.25)
  • 带括号的表达式(第 15.8.5 节),其包含的表达式是常量表达式。
  • 引用常量变量 (§4.12.4) 的简单名称 (§6.5.6.1)。
  • TypeName 形式的限定名称 (§6.5.6.2)。引用常量变量的标识符(第 4.12.4 节)。

【讨论】:

    猜你喜欢
    • 2018-10-02
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    • 2021-11-16
    • 2010-12-20
    相关资源
    最近更新 更多