理解java最终变量

理解java最终变量,java,string,final,Java,String,Final,你们能帮我理解,若在字符串连接中使用最终变量,会发生什么情况吗? 这是一个认证问题,所以不是关于如何比较字符串的问题 String var1 = "varan"; String an = "an"; final String an2 = "an"; System.out.println(var1 == ("var"+an)); System.out.println(var1 == ("var"+an2)); 输出: false true TL;DR 因为“var”

你们能帮我理解,若在字符串连接中使用最终变量,会发生什么情况吗? 这是一个认证问题,所以不是关于如何比较字符串的问题

String var1 = "varan";       
String an = "an";
final String an2 = "an";
System.out.println(var1 == ("var"+an));       
System.out.println(var1 == ("var"+an2));
输出:

false
true
TL;DR

因为
“var”+an
是运行时新创建的不同
字符串
对象
,而
“var”+an2
是内置的编译时常量,引用的地址与
var1
引用的地址相同


考虑以下与您的代码类似的示例

public class TestString {

    public static void main(String[] args) {
        String stackOverflow = "stackOverflow";
        String overflow = "Overflow";

        final String overflowFinal = "Overflow";

        if (overflow == overflowFinal) {
            System.out.println("Both overflows are same!");
        }

        if (stackOverflow == ("stack" + overflow)) {
            System.out.println("Stack and overflow have same reference !");
        }

        if (stackOverflow == ("stack" + overflowFinal)) {
            System.out.println("Stack and overflowFinal have same reference !");
        }
    }

}
它将给出以下输出:

Both overflows are same!
Stack and overflowFinal have same reference !
首先请注意,
=
比较的是
字符串的引用,而不是实际值

声明

字符串串联的结果是对字符串对象的引用,该对象是两个操作数字符串的串联。在新创建的字符串中,左侧操作数的字符位于右侧操作数的字符之前

字符串对象是新创建的(§12.5),除非表达式是常量表达式(§15.28)

因此,从上面的语句中我们可以说,
“stack”+overflow
将类似于
String newString=newString(“stackOverflow”)(内部编译器将使用
StringBuilder
执行此连接)

对于
最终
字符串
状态

基本类型或类型为
String
,即
final
,并用编译时常量表达式(§15.28)初始化的变量称为常量变量

他说

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

  • 加法运算符
    +
    -

String
类型的编译时常量表达式始终是“内部的”,以便使用该方法共享唯一实例

现在,上面的语句表示,如果我们将
字符串
声明为
最终的
,它最终将成为常量表达式

请注意,
String
literals也被实习

Interned
String
表示如果您正在创建
字符串和一个
字符串
,并且该字符串的内容相同(由
.equals()
方法检查),并且已经存在于内存中,那么它将不会创建新的
字符串
,但它将引用相同的内存位置

比如说,

String a = "test";//String literals
String b = "test";
System.out.println("Is a & b interned ? :"+(a == b));
输出:

Is a & b interned ? : true

这与
final
@mad物理学家无关,我相信他们的问题是,当与非
final
值串联时,为什么与
final
值串联会产生与文本相同的
String
,而与非
final
值串联则不会。
final
可能会阻止字符串插入,但我不确定它是否能保证,因为您正在将字符串添加到一起以创建一个新字符串。您好,谢谢您的提问,这是一个认证问题,因此我需要了解结果,@resueman:OP edit question with
这是一个认证问题,所以,这并不是一个关于如何比较字符串
行和注释OP中的行的问题,而是一个想要了解结果的问题。这就是为什么我提供了重新打开的投票,或者TAsk answer也解释了OP发布的每一行代码片段。不管
final
,字符串文本始终处于内部状态。
var1
an
引用的文本也被拘留,因此你的部分答案无法解释任何问题。你的推理仍然不合理。常量字符串表达式是固定的,仅包含最终字符串变量或文字的字符串表达式是固定的。