比较在审计android源代码时,我发现了一个字符串比较bug,它使用==而不是equals()。但是,该应用程序运行得非常出人意料!android replaceAll和字符串与==
一些测试后,我发现的replaceAll()方法被隐藏的错误。
String description = " ";
description = description.trim();
Result1.setText(description + " == " + "" + ": " + (description == ""));
按我的预期打印“==:false”。但是,
String description = " ";
description = description.trim().replaceAll("\\s+|\\r+|\\n+", " ");
Result1.setText(description + " == " + "" + ": " + (description == ""));
打印“==:true”! (是Android 4.4.2,API 19)
我运行相同的代码在我的桌面文件(javac 1.6.0_45),并打印 “==:假” 如我所料。
这是Android中的错误还是它的预期行为?
首先,我认为这是Android开源项目的一个片段:反正,我不知道,但基于[这个答案](http://stackoverflow.com/a/513839/2821954)这可能与字符串实习有关。 (这只是我的猜测) –
'description.trim()'是空的所以'replaceAll(“\\ s + | \\ r + | \\ n +”,“”)'什么也没做。底线是,不能保证使用'=='的比较是否会返回true或false。但是'equals'方法的行为已经很好的规定了。因此'description ==“”'应该被替换为'description.equals(“”)或'description.isEmpty()'。 –