【发布时间】:2016-02-06 06:03:00
【问题描述】:
在程序 1 中,我声明了两个字符串并将它们初始化为“MADAM”。运行时,我正在检查它们的引用变量的相等性(通过 '==' 运算符')然后我得到一个“真实”的响应。
但在程序 2 中,我声明了一个字符串“S”并将其初始化为“MADAM”。之后,我正在运行一个反向循环并将“S”的字符以相反的顺序存储在其他字符串变量中。现在我再次尝试检查引用变量的相等性(通过'=='运算符')并且得到的响应为'false'。由于两个 String 对象具有相同的值并存储在常量池区域中,因此两个变量都应该相等,并且两个场景中的输出都应该是“真”。但是为什么不一样呢?
方案一:
class Reverse {
public static void main(String[] args) {
String s="MADAM"; String rev="MADAM"; System.out.println(s==rev);
}
}
输出 - 真
方案二:
class Reverse {
public static void main(String[] args) {
String s="MADAM"; String rev="";
for(int x=s.length()-1;x>=0;x--) { rev+=s.charAt(x); }
System.out.println(s==rev);
}
}
输出错误
【问题讨论】:
-
"由于两个字符串对象 [...] 都存储在常量池中" 你的问题是,这个假设是错误的;在第二种情况下,
rev字符串被分配在堆中并且没有被实习。
标签: java string memory functional-programming