Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串+;int与同一字符串比较+;java中的int?_Java - Fatal编程技术网

字符串+;int与同一字符串比较+;java中的int?

字符串+;int与同一字符串比较+;java中的int?,java,Java,为什么我在下面的语句中得到false int x = 10; System.out.println("X="+x=="X="+x); //false 如果我是对的,那么经过评估后,它会像下面的陈述一样 System.out.println("X=10"=="X=10"); //true 为什么我在这方面得到了true final int y = 10; System.out.println("Y

为什么我在下面的语句中得到
false

int x = 10;    
System.out.println("X="+x=="X="+x); //false
如果我是对的,那么经过评估后,它会像下面的陈述一样

System.out.println("X=10"=="X=10"); //true
为什么我在这方面得到了
true

final int y = 10;
System.out.println("Y="+y=="Y="+y);

让我们比较一下所有的方法

  • “X=“+X==”X=“+X
    为false,因为这两个不同的实例和
    =
    返回false(因为
    =
    比较对象或字符串的地址)
  • 为什么?

    这些不是字符串常量,我们将在下面关于常量的部分中看到

  • “X=10”=“X=10”为真,因为它们是字符串常量,编译器使用
  • 此外,字符串文字总是引用类字符串的同一实例。这是因为字符串文字(或者更一般地说,是常量表达式(§15.28)的值的字符串)被“插入”,以便使用string.intern方法共享唯一实例

  • “Y=“+Y==”Y=“+Y是真的,因为它是常量表达式,这是因为变量
    Y
    被声明为final,并且字符串类型的编译时常量表达式总是“interned”
  • 原语类型或字符串类型的变量称为常量变量,它是最终变量,并用编译时常量表达式(§15.28)初始化

    编译时常量表达式是一个表示原语类型的值或字符串的表达式,该值或字符串不会突然完成,并且仅使用以下内容组成:

    String类型的编译时常量表达式总是“interned”,以便使用String.intern方法共享唯一实例

    常量表达式示例:与您的表达式类似
    “Y=“+Y


    应使用
    equals
    方法比较字符串<代码>=比较身份

    “X=“+X==”X=“+X
    创建两个单独的字符串实例,虽然内容相等,但它们的标识不同

    “X=10”==“X=10”
    真的
    ,因为字符串插入。编译器遇到两个内容相同的字符串文本,并确定这两个实例指向同一个字符串对象,因此它们具有相同的标识


    “Y=“+Y==”Y=“+Y
    true
    ,因为
    Y
    是一个常量表达式,编译器决定可以在编译时串联字符串和int,从而生成两个相等的字符串。实际上,这就像编写了
    “Y=10”==“Y=10”

    一个连接的字符串正在编译中,如果可能的话,可以组合成一个单数字符串,因此
    “X=“+”10”
    使
    “X=10”
    ,如果
    int
    final
    ,这同样有效,但如果它是一个正态变量,那么这个过程当然不会发生

    然后==被简化为比较中临时对象之间的对象比较工具,因此失败


    此外,请不要编写这样的代码,因为您可以看到它会很快导致问题,请在适当的情况下使用大括号和.equals()函数。

    要详细说明死池,请回答最有可能在后台发生的事情是代码优化

    只有当它是同一个对象时,Java才会将
    strings1==strings2
    计算为true。 因为
    y
    被声明为
    final
    ,编译器可以用该值替换
    y
    的所有实例 它是给定的

    所以

    变成

    System.out.println("Y="+10=="Y="+10);
    
    变成

    String tmp = "Y="+10;
    System.out.println(tmp==tmp);
    
    System.out.println(true);
    
    变成

    String tmp = "Y="+10;
    System.out.println(tmp==tmp);
    
    System.out.println(true);
    
    但是,如果您不将变量声明为final,那么编译器将无法执行此操作,因为它无法预测在
    “y=“+y
    “y=“+y
    之间y将发生什么

    也在做类似的事情

    final int y = x;
    System.out.println("Y="+y=="Y="+y);
    
    将导致(我的)编译器跳过此优化,然后其计算结果为false

    TL;博士


    它的计算结果为
    true
    如果它是同一个对象,在某些情况下,编译器将通过预计算优化比较。

    因为这不是比较字符串的方式除了所有答案之外,也许这有助于您理解:什么是
    新字符串(“a”)==新字符串(“a”)
    vs
    new String(“a”).equals(new String(“a”))
    ?Naman我知道如何比较String,我只是问一下输出。你的意思是运行时两个不同的对象存储在SCP外部并指向不同的对象,这就是为什么我得到false的原因。我不知道你所说的“外部到SCP”是什么意思。但是
    intx=10
    不是一个常量表达式,因此编译器假定
    x
    可以在运行时更改。这就是为什么在编译时无法确定
    “X=“+X
    的值,并且编译器无法插入这两个字符串。我不确定“X”和另一个“X”是否是不同的对象引用。当值相同时,文字字符串实例化从相同的字符串池中获取。