Java是否可以跳过已经是大写的文本字符串常量上的.toUpperCase()?

Java是否可以跳过已经是大写的文本字符串常量上的.toUpperCase()?,java,string,optimization,uppercase,Java,String,Optimization,Uppercase,我有一个.toUpperCase发生在一个紧密的循环中,并且已经分析并显示它正在影响应用程序性能。恼人的是,它在已经用大写字母表示的字符串上被调用。我正在考虑放弃对.toUpperCase的调用,但这会降低我的代码在将来使用时的安全性 到目前为止,Java性能优化的这一级别已经不是我的经验了。是否有任何方法可以进行预编译、设置注释等,以跳过对已经大写的字符串的toUpperCase调用?如果可以,您需要做的是对字符串调用.toUpperCase一次,并将其存储起来,这样当您通过循环时就不必每次都

我有一个.toUpperCase发生在一个紧密的循环中,并且已经分析并显示它正在影响应用程序性能。恼人的是,它在已经用大写字母表示的字符串上被调用。我正在考虑放弃对.toUpperCase的调用,但这会降低我的代码在将来使用时的安全性


到目前为止,Java性能优化的这一级别已经不是我的经验了。是否有任何方法可以进行预编译、设置注释等,以跳过对已经大写的字符串的toUpperCase调用?

如果可以,您需要做的是对字符串调用.toUpperCase一次,并将其存储起来,这样当您通过循环时就不必每次都这样做

我不认为存在编译前的情况——您无法预先知道代码将处理哪些数据。如果有人能纠正我的话,那就太棒了

如果您发布一些示例代码,我将能够提供更多帮助—这实际上取决于您在进入循环之前对数据的访问方式。如果您的循环实际上正在进行数据访问(例如,从文件中读取数据),而您无法控制这些文件的来源,那么与硬编码数据相比,您的手会束缚得更紧

在很多情况下,答案都很简单,但在某些情况下,你无能为力


您也可以尝试equalsIgnoreCase。它不会生成一个新字符串。

您需要执行一个if语句,将这些字母从中去掉。好的想法只是有一个条件。然后使用ascii代码,使用int进行转换,然后找到大写的ascii数字,我不知道它是什么,然后继续说如果ascii是真的,那么忽略这一部分,或者如果是一行中的特定字母,那么忽略字符


抱歉,这是一个粗略的解释

不,您不能使用注释或预编译来完成此操作,因为您的输入是在运行时提供的,注释和预编译是编译时构造

如果您事先知道输入,那么您只需在运行应用程序之前,即在编译应用程序之前,将其转换为大写即可


请注意,有许多方法可以优化字符串处理,但如果没有更多信息,我们无法为您提供任何定制的解决方案。

您可以编写一个简单的函数isUpperCaseString,并在调用toUpperCase之前调用它:

if (!isUpperCase(s)) {
    s = s.toUpperCase()  
}
它可能不会明显更快,但至少这样会减少垃圾的创建。如果输入中的大多数字符串已经是大写的,这是非常有效的优化

isUpperCase函数大致如下所示:

boolean isUpperCase(String s) {
    for (int i = 0; i < s.length; i++) {
        if (Character.isLowerCase(s.charAt(i)) {
            return false;
        }
    }
    return true;
}

我建议在存储字符串时这样做。因此,无论该字符串来自何处,在启动/第一次检索/任何对您有效的初始化阶段,将其转换为大写。在后续调用中,您需要进行字符串匹配,以查看是否已缓存该字符串,这大约相当昂贵。如果您真的非常渴望速度,您可能已经考虑了一种不同的语言——您可以在ASCII中的二进制级别上评估案例。第5位-**1****较低,**0****较高。如果使用哈希表,它不是字符串比较,而是字符串哈希上的整数比较。这取决于他能做什么-他没有显示代码,但这可能非常好。这需要检查字符串中的大写字符,这也同样昂贵。应该可以避免完全读取检查中的字符串。