【问题标题】:Creating Strings from Bytes/Ints in Java在 Java 中从字节/整数创建字符串
【发布时间】:2010-11-23 11:06:33
【问题描述】:

我想知道为什么下面的代码不起作用:

String test = new String(new byte[] {92, 92, 92, 92, 92});
System.out.println(test);
String compare = "\\\\\\\\\\";
System.out.println(compare);
if (test == compare) {
System.out.println("Yes!");
}

输出是:

\\\\\
\\\\\

我不理解的数据类型转换发生在哪里?

编辑: /fail :(

【问题讨论】:

标签: java types type-conversion


【解决方案1】:

字符串与 .equals() 进行比较,而不是 ==

原因是对于引用(就像字符串变量一样),== 只是检查内存位置的相等性,而不是内容。

文字 \\\ 存在于内存中的一个位置。另一个是在您构建字符串的其他地方创建的。它们不在同一个位置,所以当你这样做时它们不会返回 true ==

你应该这样做

if(test.equals(compare))

【讨论】:

  • 没错。您正在做参考比较,而不是价值比较。它们不是同一个对象,但它们是等价的。使用 Equals 和 is 应该可以工作。
【解决方案2】:

您正在使用身份比较,而不是字符串比较。

试试test.equals(compare)。然后尝试test.intern() == compare。两者都应该工作。 intern 方法是对String 对象执行对象身份比较的唯一可靠方法。

【讨论】:

  • 只是为了提出一个关于这个答案的观点,“实习生()”只需要“测试”被实习生(),因为“比较”是源文件中的文字(这意味着它是已经实习了)。如果它的创建方式与“测试”相同,则需要使用 test.intern() == compare.intern() (这通常是不好的做法,除非保证相对较小或至少受到限制, 不同字符串的数量)。
  • 没错!感谢您指出这一点,Calum。实习字符串可能对 XML 处理器或其他可以创建大量字符串的东西很有用。这是一种享元模式。
【解决方案3】:

Java 中的字符串是引用类型,== 检查它们是否是 same 字符串,而不是 equal 字符串。混乱我知道。长话短说,您需要这样做:

if( test.equals( compare ) ) {

更多信息可以在这里查看:http://leepoint.net/notes-java/data/strings/12stringcomparison.html

【讨论】:

    【解决方案4】:

    您正在测试它们是否是同一个对象,而不是它们是否是相等的字符串。

    但是以下测试将是正确的:

    test.intern() == compare.intern()
    

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多