【问题标题】:String-Comparison in java does not match [duplicate]java中的字符串比较不匹配[重复]
【发布时间】:2014-10-06 17:57:20
【问题描述】:

我在一个 java 项目中有一个长度 = 1 的字符串 response_content,我知道它等于 1 (ASCII 49)。我知道这一点,因为以下几行(在带有 android ADT+SDK 的 Eclipse 中)

Log.i("GET RESPONSE", response_content);
Log.i("GET RESPONSE", response_content.length());
Log.i("GET RESPONSE", response_content.codePointAt(0));

产生这个输出:

1
1
49

但是为什么这些行总是返回 false?

if (response_content.equals(1)) {...}
if (response_content == "1") {...}

我知道equals() 是合适的方法,== 仅用于测试目的。 有没有其他方法可以告诉我,字符串真正包含什么,或者我没有看到错误?

【问题讨论】:

  • == 不用于测试目的。它用于测试参考
  • == 用于比较实例(引用),使用equals()/equalsIgnoreCase()
  • 比较字符串为response_content.equals("1");
  • No "1"=="1" 将始终返回 true!但是如果你测试一个对另一个字符串文字或引用的字符串的引用,那么测试可能是错误的(这取决于字符串的构建方式)。
  • @CedricReichenbach "1"=="1" 将是真的,因为 Java 在编译时对字符串文字进行了实习。只有在运行时生成的字符串才是新对象。

标签: java android string-comparison


【解决方案1】:

第一个

if (response_content.equals(1)) {...}

将 String 对象与 Integer 对象进行比较...它们在对象类型上不匹配,因此计算结果为 false。第二个

if (response_content == "1") {...}

比较的是引用,而不是数据本身...“response_content”是与“1”分开的对象,因此它的评估结果为假。

试试这个:

if (response_content.equals("1")) {...}

【讨论】:

  • 我更喜欢"1".equals(response_content) 以避免可能的空指针。
【解决方案2】:

必须是 response_content.equals("1") 否则 String 对象会与 Integer 对象进行比较

response_content == "1" 可能会返回 true,但并非必须如此,因为它们可以是不同的“1”字符串。

【讨论】:

  • 一个原始的 int 类型,为了更精确。
  • 没有整数对象。 int 不是对象,它被装箱为对象以满足equals 方法的要求。
猜你喜欢
  • 2022-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多