【问题标题】:Is String sequence of characters in Java?Java中的字符串是字符序列吗?
【发布时间】:2018-01-13 06:38:54
【问题描述】:
String s1 = "a";
System.out.println(s1.equals('a'));

输出:

错误

谁能解释我为什么会出现false,即使字符串s1只有一个字符'a'

【问题讨论】:

  • 我看不出这个结果如何让您感到惊讶。 JavaDoc 非常清楚地声明“当且仅当参数 [..] 是字符串对象 [..] 时,结果才为真”。
  • 我反其道而行之——令我惊讶的是,您可能认为它们是相等的:|
  • @AashitGarodia 请阅读此meta.stackexchange.com/a/5235

标签: java character string-comparison string-matching


【解决方案1】:

要了解您为什么收到false,这对您来说是出乎意料的。首先,你需要了解你的代码

s1.equals('a')

s1String'a'Character,因此您正在比较两个不同的对象。

根据documentation

true 如果给定对象表示一个 String 等价于这个 字符串,false 否则

现在,回到 String 类中的 equals 方法实现。

// some more code
if (anObject instanceof String) {
  // code here
  // some more code
 }
 return false;

您可以看到,它正在检查您传递的对象是否为String 的类型?在你的情况下,No,它是Character。因此,您将收到false

【讨论】:

    【解决方案2】:

    应该始终参考规范而不是实现(除非有理由怀疑实现是错误的,这里不是这种情况)。在这种情况下,equals 的规范,正如上面评论中所引用的那样,是 Class String, method equals,它说:

    将此字符串与指定对象进行比较。当且仅当参数不为 null 并且是表示与此对象相同的字符序列的 String 对象时,结果才为真。

    因为 'a' 不是字符串,所以结果为假。 'a' 是 char 类型的文字,但它被装箱为 Character 类型,因为 equals 需要引用,而 'a' 是一个值。

    【讨论】:

      【解决方案3】:

      没有。 charString 在 Java 中是两个不同的东西。

      char 恰好是一个单个字符。

      另一方面,String零个或多个 个字符。您可以拥有长度为01> 1 的字符串。但是一个字符只能的长度是1

      定义字符的方式是在赋值过程中使用单引号。

      char first = 'a' // single quotes
      

      对于字符串,您使用 引号。

      String first = "a" // double quotes
      

      【讨论】:

      • OP 比较 CharacterString,而不是 charString
      • 哦。我懂了。看来我犯了一个错误。但是,我认为即使我们使用 Character 对象类型,逻辑仍然成立。
      • 正确,与String 相比,两者都是不同的类型,equals 调用不应产生true'a' 也是 char 文字,但是对于 equals 调用将被装箱,因为该方法没有接受原始类型的重载版本。因此 OP 实际上将CharacterString 进行比较。但你是对的,这两种类型非常不同。
      【解决方案4】:

      单引号用于文字char,双引号用于文字String。 此外,如果您将查看 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;
        }
      

      char 既不是 String 类的实例,也不是在堆上引用同一个对象。

      【讨论】:

        【解决方案5】:

        单引号 '' 和双引号 "" 之间可能有区别

        【讨论】:

        • 我是故意这样做的。
        【解决方案6】:

        如果您使用的是 Eclipse 或 IntelliJ 等 IDE,您可以看到 String.equals() 是如何实现的。该方法检查参数是否为String 的实例,如果参数不是String,则返回false。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-17
          • 1970-01-01
          • 2012-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-01
          相关资源
          最近更新 更多