Java中的字符串文本

Java中的字符串文本,java,string,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也是。由于s和s1都包含对Hello

我刚开始学习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也是。由于s和s1都包含对Hello的引用,因此可以对它们进行比较,并且由于“公共字符串池”的缘故,它们总是相等的

我的问题是:如何将保存引用的s与实际的字符串Hello(一个字符序列)进行比较??是否有任何逻辑,或者只是负责内存引用然后比较两者的实现


如果我的理解有误,请纠正我

当调用equals方法时,进入堆栈的是对所传递内容的引用。因此,当您编写s.equalsHello时,堆栈上的一个对象是对Hello的引用。

当调用equals方法时,进入堆栈的对象是对传递的任何对象的引用。因此,当您编写s.equalsHello时,堆栈上的一个东西是对Hello的引用。

您正在调用equals方法,该方法比较两个对象的等效性-它不会检查两个引用是否指向对象的同一实例。要检查对同一对象的两个引用,可以使用s==s1

调用equals方法,该方法比较两个对象的等效性-它不会检查两个引用是否对同一对象实例。要检查对同一对象的两个引用,可以使用s==s1

如果您看到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;
    }

如果您看到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;
    }
我的问题是:如何将保存引用的“s”与实际的字符串Hello(一个字符序列)进行比较

Hello不是字符序列。这是一根绳子。字符串确实实现了,但这不是一回事。因此,当您使用equals或==时,您正在比较字符串实例,而不是一些特殊的东西。字符串文字是一个字符串,在源代码中写入文字时,该字符串包含对其的引用

一开始你似乎对等式和==感到困惑。重读一遍,我不确定你是否是,但以防万一:equals比较两个对象的等价性;如果这两个对象是字符串,则如果它们具有相同的字符序列,则返回true比较两个对象引用,如果它们指向同一对象,则计算为真。==有时对于看起来不同的字符串对象也是如此,因为字符串文本隐式地放在一个公共池中,并从中重新使用以节省内存,因此两个独立但等效的文本实际上最终引用同一个对象。永远不要依赖它。使用==来比较字符串几乎总是一个错误。不使用==的情况在很大程度上是边缘情况。使用相等

我的问题是:如何将保存引用的“s”与实际的字符串Hello(一个字符序列)进行比较

Hello不是字符序列。这是一根绳子。字符串确实实现了,但这不是一回事。因此,当您使用equals或==时,您正在比较字符串实例,而不是一些特殊的东西。字符串文字是一个字符串,在源代码中写入文字时,该字符串包含对其的引用

一开始你似乎对等式和==感到困惑。重读一遍,我不确定你是否是,但以防万一:equals比较两个对象的等价性;如果这两个对象是字符串,则如果它们具有相同的字符序列,则返回true比较两个对象引用,如果它们指向同一对象,则计算为真。==有时对于看起来不同的字符串对象也是如此,因为字符串文本隐式地放在一个公共池中,并从中重新使用以节省内存,因此两个独立但等效的文本实际上最终引用同一个对象。永远不要依赖它。使用==来比较字符串几乎总是一个错误。不使用==的情况在很大程度上是边缘情况。使用相等

我的问题是:如何将具有参考的s与 实际字符串Hello是一个字符序列??有吗 逻辑还是仅仅是负责内存的实现 参考,然后比较两者

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

如果字符串对象与per==运算符相等,则返回true。 如果==返回false,则比较两个字符串的每个字符,如果存在差异,则为foun d、 立即返回false。 如果在比较两个字符串的所有字符后,未发现字符串的字符和长度存在差异,则返回true。 以下是String类中.equals方法的defaullt实现:

 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方法

我的问题是:如何将具有参考的s与 实际字符串Hello是一个字符序列??有吗 逻辑还是仅仅是负责内存的实现 参考,然后比较两者

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

如果字符串对象与per==运算符相等,则返回true。 如果==返回false,则比较两个字符串的每个字符,如果发现差异,则立即返回false。 如果在比较两个字符串的所有字符后,未发现字符串的字符和长度存在差异,则返回true。 以下是String类中.equals方法的defaullt实现:

 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方法。

s==Hello与s.equalsHello不同。equals检查字符串是否相等,而不是引用是否相同。请注意,s和s1通常最多相等。字符串池不是保证@ljgw-你所说的最多通常相等是什么意思。字符串池不能保证!!。您需要了解一些关于Java中字符串和字符串处理的基本知识…可能的重复。你可以参考…-1,因为我的编辑修改了标题中的拼写,删除了主标签,而不是添加了一个更相关的术语s==Hello与s.equalHello不同。equals检查字符串是否相等,而不是引用是否相同。请注意,s和s1通常最多相等。字符串池不是保证@ljgw-你所说的最多通常相等是什么意思。字符串池不能保证!!。您需要了解一些关于Java中字符串和字符串处理的基本知识…可能的重复。你可以参考…-1,因为我的编辑修改了标题中的拼写,删除了主标签,而不是添加了一个更相关的术语现在我明白为什么我被否决了。虽然我已经喝了咖啡,但我误解了他的问题。@marounnaroun:你需要的是睡眠。:-新年快乐!谢谢新年快乐!最好的:现在我明白为什么我被否决了。虽然我已经喝了咖啡,但我误解了他的问题。@marounnaroun:你需要的是睡眠。:-新年快乐!谢谢新年快乐!祝您一切顺利: