Java.contains()的行为不符合我的预期

Java.contains()的行为不符合我的预期,java,android,string,contains,Java,Android,String,Contains,查找子字符串时,.contains()没有返回true的问题 请参阅下面的代码片段和图像,其中显示了以下代码的变量值。我遇到的问题是,表达式返回false,而我认为它显然应该是true if (this.fileName.toLowerCase().contains(extension.toLowerCase())){ return true; } 今天我遇到了这种情况,在搜索了网络之后,我看不到任何明显的变化 我使用文字尝试了相同的方法,但仍然没有计算为true: if ("Andro

查找子字符串时,
.contains()
没有返回
true
的问题

请参阅下面的代码片段和图像,其中显示了以下代码的变量值。我遇到的问题是,表达式返回
false
,而我认为它显然应该是
true

if (this.fileName.toLowerCase().contains(extension.toLowerCase())){
  return true;
}

今天我遇到了这种情况,在搜索了网络之后,我看不到任何明显的变化

我使用文字尝试了相同的方法,但仍然没有计算为true:

if ("Android App Image.jpg".toLowerCase().contains("jpg".toLowerCase())){
  return true;
}
我对其进行了进一步分解,因此结果为布尔值:

boolean result = ("Android App Image.jpg".contains("jpg"));

if (result) {
  return true;
}
结果为true,因此
.contains
不是问题所在,而是我的
if()
没有将布尔值计算为true,也不会导致执行
返回true

我现在认为这是我的while循环(下面是完整的函数)的一个问题。枚举是否异步运行

public boolean isImage(){
    String[] imageExtensions = {"jpg", "png", "bmp", "gif"};

    for (String extension: imageExtensions) {

        if (this.localFileURLString != null && this.localFileURLString.toLowerCase().contains(extension)){
            return true;
        }

        boolean result = ("Android App Image.jpg".toLowerCase().contains("jpg".toLowerCase()));

        if (result) {
            return true;
        }else{
            Log.i("TEACH", "If evaluated false");
        }
    }

    return false;
}
更新1/2:

我已经精简了整个函数,使用硬编码的文本,不再使用快速枚举,当我希望它返回
true
时,它仍然返回
false

public boolean isImage(){
    String[] imageExtensions = {"jpg", "png", "bmp", "gif"};

    for (int x = 0; x < imageExtensions.length; x++) {

        // String extension = imageExtensions[x];

        boolean result = ("Android App Image.jpg".toLowerCase().contains("jpg".toLowerCase()));

        if (result) {
            return true;
        }else{
            Log.i("TEACH", "If evaluated false");
        }
    }

    return false;
}
这是在调试模式下单步执行时发生的,编码日志在未连接到bugger时也显示相同的结果

从功能返回后,每一次都正常进行。没有错误或警告

重新安装Android Studio,尝试不同的模拟器和物理Android设备并没有解决这个问题

重命名函数无法解决此问题

将函数的返回类型从
boolean
更改为
boolean
确实解决了问题

我很清楚这些类型的差异,但我仍然不明白为什么会出现这个问题。我只能假设以这种方式更改方法签名是在编译时发生的事情

我将暂时不回答这个问题,因为即使更改退货类型“修复”了我的问题,我仍然不满意我将知道为什么。。。也许永远不会


希望在这类问题上有更多知识的人能够启发大家

为什么不尝试使用:

if (this.fileName.toLowerCase().contains(extension.toLowerCase()==true){
}

你的搜索词会产生误报。原因文件名字符串可以具有与扩展名匹配的子字符串。 为了避免这种情况,可以在搜索词前面加一个点

String[]imageExtensions={.jpg“,.png“,.bmp“,.gif”}

这显然会解决你的问题。 如果文件名中有任何不规则的点使用,则可能产生误报。
希望能有帮助

您的代码本身没有问题。您的示例运行正常。这件事一定是在别的地方发生的。请提供一个更广泛的示例。请注意,将扩展与
.endsWith()进行比较。
您有什么版本的JDK?如果我没记错的话,不久前.contains()不适用于字符串。想想1.4之前的版本吧。你也可以检查.class文件中的编译代码。我已经更新了问题(编辑#2),看起来问题与编译器有关,但目前还不确定。谢谢你的意见!我已经更新了问题(编辑#2),看起来问题与编译器有关,但目前还不确定。谢谢你的意见!我已经更新了问题(编辑#2),看起来问题与编译器有关,但目前还不确定。谢谢你的意见!
if (this.fileName.toLowerCase().contains(extension.toLowerCase()==true){
}