1

我是这个网站的新手,没有意识到还有其他问题可以回答我的问题。我已经想通了,我会尽快删除这篇文章。谢谢你。

我刚开始再次学习 java,我有一个简单的问题。

通常,使用 == 来比较字符串是行不通的,你必须使用 .equals 来代替。

但是现在在编码时,我发现他们在不应该做同样的事情时也在做同样的事情,我正试图找出原因。

这是代码。

String s = "Hello";
   String x = "Hello";

   if (x == s){
       System.out.println("It is working!");
   }//end if
   else {
       System.out.println("It is not working");
   }//end else

   if (x.equals(s)){
       System.out.println("Match");
   }//end if
   else {
       System.out.println("No match");
   }//end else
4

3 回答 3

4

基本上你会看到字符串实习的结果。从JLS 的第 15.28 节

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

所以你的两个变量值实际上是指相同的字符串。如果您使用:

String s = new String("Hello");
String x = new String("Hello");

...然后你会看到你期望的行为。

于 2013-02-11T17:05:38.777 回答
0

原因是您的 vars x 和 s 具有相同的引用,因此==行为与.equals.

当 Java 编译器优化您的字符串值(文字)时,它会确定 x 和 s 具有相同的值,因此您只需要一个 String 对象。结果,x 和 s 都指向同一个 String 对象,并且节省了一些内存。这是安全的操作,因为 String 在 Java 中是不可变的对象。

于 2013-02-11T17:05:06.240 回答
0

好吧,在这种特殊情况下,只有一个字符串对象被创建并缓存在字符串常量池中,并且两个引用变量都引用了存储在字符串常量池中的同一个字符串对象。因此你==测试通过

字符串 s = "你好"; 第 1 行字符串 x = "Hello"; 2号线

执行第 1 行时,会创建一个字符串对象 (Hello),并将其缓存在 String Constant pool 中。

**String Constant Pool:** {s--->"Hello"}

执行第 2 行时,首先检查字符串常量池中是否存在具有相同值的对象,如果存在。它只是将引用指向池中已创建的对象。

**String Constant Pool:** {s,x--->"Hello"}
于 2013-02-11T17:05:25.403 回答