比较命令行参数引用 return false 而字符串数组 return true
Comparing command line arguments reference return false while array of String return true
目前我正在处理字符串操作,在做演示时我发现了一些不同的行为。
下面是我的代码。
public class HelloWorld{
public static void main(String []args){
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
String strArray[] = {"Hello","Hello"};
String strArray1[] = new String[] {"Hello","Hello"};
System.out.println("str1==str2:: "+(str1==str2));
System.out.println("str1==str3:: "+(str1==str3));
System.out.println("strArray[0]==strArray[1]:: "+(strArray[0]==strArray[1]));
System.out.println("str1==strArray[1]:: "+(str1==strArray[1]));
System.out.println("strArray1[0]==strArray1[1]:: "+(strArray1[0]==strArray1[1]));
System.out.println("str1==strArray1[1]:: "+(str1==strArray1[1]));
System.out.println("args[0]==args[1]:: "+(args[0]==args[1]));
}
}
以上代码的输出是。我正在 运行 代码传递命令行参数。
java HelloWorld Hello Hello
str1==str2:: true
str1==str3:: false
strArray[0]==strArray[1]:: true
str1==strArray[1]:: true
strArray1[0]==strArray1[1]:: true
str1==strArray1[1]:: true
args[0]==args[1]:: false
这里我有两个问题。
如果我比较 String str1==str3 的引用,那么它将 return false 因为 str3 是使用 new String 创建的,所以不会驻留在字符串池中,那么如何 str1==strArray1[1] return true??
strArray[0]==strArray[1] 会 return true,strArray1[0]==strArray1[1] 也会 return true 那为什么命令行参数args[0]==args[1] return false??
请指导。
如果您只想比较内容,请不要 检查参考文献。这就是 String
class 首先提供 equals()
方法的原因。前者测试引用相等性,后者测试值相等性。
内部处理字符串的方式在过去发生过变化,将来也可能会发生变化。使用引用相等依赖于你不应该真正依赖的实现细节。
封装的整个 要点 是允许在不影响客户端代码的情况下在幕后更改内容。你应该遵守 "rules" 这样你就不会被咬了。
如果您真的想了解它是如何工作的,您应该阅读 Java 语言规范,可用 here。这是该语言的标准,任何未明确说明的实现细节都应该无关紧要。
if i compare reference of String str1==str3 then it will return false
because str3 is created using new String so that will not reside in
String pool, So how str1==strArray1[1] return true??
String strArray1[] = new String[] {"Hello","Hello"};
创建一个新的字符串数组,并引用数组* 中的 相同的字符串 "hello"
。
strArray[0]==strArray[1] will return true, strArray1[0]==strArray1[1]
also return true then why command line argument args[0]==args[1]
return false?
args[0]==args[1]
returnsfalse
,因为它们是2个不同的个实例(没有加入String池),它们就像new String()
。
您可以使用 :
轻松测试它
System.out.println(System.identityHashCode(args[0]));
System.out.println(System.identityHashCode(args[1]));
因此,传递给 main()
的参数 不会 添加到 字符串常量池 .
目前我正在处理字符串操作,在做演示时我发现了一些不同的行为。
下面是我的代码。
public class HelloWorld{
public static void main(String []args){
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
String strArray[] = {"Hello","Hello"};
String strArray1[] = new String[] {"Hello","Hello"};
System.out.println("str1==str2:: "+(str1==str2));
System.out.println("str1==str3:: "+(str1==str3));
System.out.println("strArray[0]==strArray[1]:: "+(strArray[0]==strArray[1]));
System.out.println("str1==strArray[1]:: "+(str1==strArray[1]));
System.out.println("strArray1[0]==strArray1[1]:: "+(strArray1[0]==strArray1[1]));
System.out.println("str1==strArray1[1]:: "+(str1==strArray1[1]));
System.out.println("args[0]==args[1]:: "+(args[0]==args[1]));
}
}
以上代码的输出是。我正在 运行 代码传递命令行参数。
java HelloWorld Hello Hello
str1==str2:: true
str1==str3:: false
strArray[0]==strArray[1]:: true
str1==strArray[1]:: true
strArray1[0]==strArray1[1]:: true
str1==strArray1[1]:: true
args[0]==args[1]:: false
这里我有两个问题。
如果我比较 String str1==str3 的引用,那么它将 return false 因为 str3 是使用 new String 创建的,所以不会驻留在字符串池中,那么如何 str1==strArray1[1] return true??
strArray[0]==strArray[1] 会 return true,strArray1[0]==strArray1[1] 也会 return true 那为什么命令行参数args[0]==args[1] return false??
请指导。
如果您只想比较内容,请不要 检查参考文献。这就是 String
class 首先提供 equals()
方法的原因。前者测试引用相等性,后者测试值相等性。
内部处理字符串的方式在过去发生过变化,将来也可能会发生变化。使用引用相等依赖于你不应该真正依赖的实现细节。
封装的整个 要点 是允许在不影响客户端代码的情况下在幕后更改内容。你应该遵守 "rules" 这样你就不会被咬了。
如果您真的想了解它是如何工作的,您应该阅读 Java 语言规范,可用 here。这是该语言的标准,任何未明确说明的实现细节都应该无关紧要。
if i compare reference of String str1==str3 then it will return false because str3 is created using new String so that will not reside in String pool, So how str1==strArray1[1] return true??
String strArray1[] = new String[] {"Hello","Hello"};
创建一个新的字符串数组,并引用数组* 中的 相同的字符串 "hello"
。
strArray[0]==strArray[1] will return true, strArray1[0]==strArray1[1] also return true then why command line argument args[0]==args[1] return false?
args[0]==args[1]
returnsfalse
,因为它们是2个不同的个实例(没有加入String池),它们就像new String()
。
您可以使用 :
System.out.println(System.identityHashCode(args[0]));
System.out.println(System.identityHashCode(args[1]));
因此,传递给 main()
的参数 不会 添加到 字符串常量池 .