当前位置: 首页 > 面试题库 >

当“” == s为假但“” .equals(s)为真时

魏翔
2023-03-14
问题内容

编辑 感谢您的及时答复。请查看真正的问题是什么。这次我已经大胆了。

我确实了解==和.equals之间的区别。所以,这不是我的问题(我实际上为此添加了一些上下文)

我正在执行以下针对空字符串的验证:

if( "" == value ) { 
    // is empty string 
}

过去的 从数据库中获取的值或者从另一个节点反序列化对象时,本次测试 失败
,因为这两个字符串实例确实不同对象的引用,尽管它们含有相同的数据。

因此,解决这些情况的方法是

if( "".equals( value ) ) {
   // which returns true for all the empty strings
}

我很好。这是很清楚的。

今天,这种情况再次发生,但令我感到困惑的是,这次应用程序是一个非常小的 独立应用程序 ,根本不使用 网络
,因此,不会从数据库中获取新字符串,也不会从另一个节点反序列化该字符串。

所以问题是:

"" == value // yields false

"".equals( value ) // yields true

对于本地独立应用程序?

我很确定代码中没有使用 new String()

字符串引用可能是“”的唯一方法是因为直接在代码中为它分配了“”(或者就是我所认为的),例如:

String a = "";
String b = a;

assert "" == b ; // this is true

以某种方式(在阅读了更多代码后,我有了一个线索)创建了两个不同的空字符串对象引用,我想知道 如何

更多jjnguys答案行:

字节!

编辑:结论

我找到了原因。

在jjnguy建议之后,我能够以不同的眼光看代码。

有罪的方法:StringBuilder.toString()

分配并初始化一个新的String对象,以包含该对象当前表示的字符序列。

h!…

    StringBuilder b = new StringBuilder("h");
    b.deleteCharAt( 0 );
    System.out.println( "" == b.toString() ); // prints false

谜团已揭开。

该代码使用StringBuilder处理不断增长的字符串。事实证明,在某个时候有人做到了:

 public void someAction( String string ) { 
      if( "" == string ) {
           return;
       }

       deleteBankAccount( string );
 }

和使用

 someAction( myBuilder.toString() ); // bug introduced.

ps最近我读了太多CodingHorror吗?还是为什么我觉得需要在这里添加一些有趣的动物图片?


问题答案:
String s = "";
String s2 = someUserInputVariale.toLowercase(); // where the user entered in ""

这样的事情将导致s == s2评估为假。

许多代码底稿会创建新的代码,Strings而不会暴露对的调用new String()



 类似资料:
  • s

    描述 (Description) 这不是一个功能。 这是正则表达式替换运算符。 根据PATTERN中指定的正则表达式,数据将替换为REPLACE。 与m //一样,分隔符由s后面的第一个字符定义。 语法 (Syntax) 以下是此函数的简单语法 - s/PATTERN/REPLACE/ 返回值 (Return Value) 此函数在失败时返回0,并在成功时返回替换次数。 例子 (Example)

  • \S

    描述 (Description) 字符类\S匹配任何非空白字符。 例子 (Example) 以下示例显示了预定义字符类匹配的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PredefinedCharacterClassDemo {

  • \s

    描述 (Description) 字符类\s匹配任何空格字符。 例子 (Example) 以下示例显示了预定义字符类匹配的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PredefinedCharacterClassDemo { p

  • 我正在写一段代码来检查签名 如果r和s是正的,我下面的代码可以工作,否则验证失败。 我的代码是 我的签名是从原始的r和s开始,以der格式创建的。请记住,如果r或s是负数,要在der格式中添加“00 ”,我还使用了BouncyCastle ANS1类 但是我仍然能够验证r和s是否为正,如果其中一个为负,我就不能验证(初始字节大于0x80) 我错过了什么? -----编辑----- 我已经创建了一个

  • 问题内容: 在我上大学的这个Java项目中,我遇到一种情况,当前正在使用 其中msgs是一个链接的阻止队列,通过 但是,我想使用一个ObjectInputStream和一个ObjectOutputStream。我已经在构造函数中初始化了它们,并在构造它后刷新了ObjectOutputStream,我读到某个地方必须这样做。 我想同时发送Strings和另一个Object类型,通过网络将其称为gam

  • 如何从字符串解析LocalTime,例如mm:ss中的“10:38.0”。什么格式?我很难改变格式。 出错 java类型的ISO。时间总体安排解析的java。时间总体安排DateTimeParseException:无法分析文本“10:38.2”:无法从TemporalAccessor获取本地时间:{MinuteOfHour=10,MicroOfSecond=200000,MilliOfSecon