理解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也被实习
InternedString
表示如果您正在创建字符串和一个字符串
,并且该字符串的内容相同(由.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
引用的文本也被拘留,因此你的部分答案无法解释任何问题。你的推理仍然不合理。常量字符串表达式是固定的,仅包含最终字符串变量或文字的字符串表达式是固定的。