Java中的字符串文字

时间:2014-01-02 08:48:28

标签: java string

我刚开始学习Java并遇到了这个问题:

String s = "Hello";
String s1 = "Hello";
if(s.equals("Hello") && s.equals(s1))
{
    System.out.println("Equal");
}

if语句中的第一个条件将字符串文字s与字符序列进行比较,其中第二个语句将s与另一个字符串文字s1进行比较。两种比较都证明是正确的。

我的理解是s将引用"Hello"s1也是如此。由于ss1都包含对"Hello"的引用,因此可以对它们进行比较并始终相等(因为'公共字符串池')。

我的问题是:如何将包含引用的s与实际的字符串"Hello"进行比较?有没有逻辑,或者它只是处理内存引用的实现,然后比较两个??

如果我的理解错误,请纠正我......

5 个答案:

答案 0 :(得分:6)

  

我的问题是:如何将包含引用的''与实际的字符串进行比较" Hello"这是一个字符序列?

"Hello" 不是字符序列。它是String。 (String确实实现了CharSequence interface,但这不是同一回事。)所以,当您使用equals==时,您和&String #39;重新比较String个实例,而不是一些特殊的事情。 String文字一个equals(完整地引用了文字在源中的文字)。

起初好像你对==equals感到困惑。重新阅读,我不确定你是谁,但为了以防万一:String比较两个对象的等价性;如果两个对象是true s,如果它们具有相同的字符序列,则返回==true比较两个对象引用,如果它们指向同一个对象,则评估==。对于看似不同的true个对象,String有时会String,因为==文字是隐式intern'd(放在公共池中并从中重用)到保存内存,因此两个独立但等效的文字实际上最终会引用同一个对象。 从不依赖于此。使用String来比较equals几乎总是一个错误(它不是非常多的边缘情况)。使用{{1}}。

答案 1 :(得分:3)

您正在调用equals方法,该方法将两个对象进行比较以进行等效 - 它不检查两个引用是否与对象的同一实例相对应。要检查对同一对象的两个引用,请使用s == s1

答案 2 :(得分:2)

如果您看到equals的源代码,您可以理解equals方法比较每个字符串的值 字符。如果您使用的==只会比较引用。

   public boolean equals(Object anObject) {
      if (this == anObject) {
            return true;
        }
       if (anObject instanceof String) {
            String anotherString = (String)anObject;
           int n = count;
            if (n == anotherString.count) {
                char v1[] = value;
                char v2[] = anotherString.value;
              int i = offset;
               int j = anotherString.offset;
               while (n-- != 0) {
                    if (v1[i++] != v2[j++])
                       return false;
                }
               return true;
           }
       }
       return false;
    }

答案 3 :(得分:0)

当调用equals方法时,进入堆栈的东西是对传递的任何内容的引用。因此,当您编写s.equals("Hello")时,堆栈中的一个内容就是对"Hello"的引用。

答案 4 :(得分:0)

  

我的问题是:如何将具有参考价值的s与之相比较   实际字符串“Hello”,这是一个字符序列??有没有   逻辑或它只是处理内存的实现   引用然后比较两个??

检查字符串是否相等的算法包括:

  1. 如果String对象与==运算符相等,则返回true。
  2. 如果==返回false,则比较两个字符串的每个字符,如果找到差异,则立即返回false。
  3. 如果在比较两个字符串的所有字符后,字符串和字符串长度没有差异,则返回true。
  4. 以下是String类中.equals()方法的默认实现:

     public boolean equals(Object anObject) {
          if (this == anObject) {
             return true;
          }
          if (anObject instanceof String) {
             String anotherString = (String)anObject;
             int n = count;
             if (n == anotherString.count) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = offset;
                int j = anotherString.offset;
                while (n-- != 0) {
                  if (v1[i++] != v2[j++])
                     return false;
                   }
                return true;
               }
             }
           return false;
        }
    

    要检查对同一对象的两个引用,您将使用s == s1。

    要使用.equals()方法比较两个值。