2013-11-21 27 views
1

我有一個.toUpperCase()發生在一個緊密的循環中,並且已經進行了配置並顯示它正在影響應用程序的性能。令人討厭的是它已經被大寫字母命名了。我正在考慮將電話打到.toUpperCase(),但這會讓我的代碼在未來的使用中變得不安全。Java可以跳過文本字符串常量上的.toUpperCase()大寫字母嗎?

到目前爲止,這個級別的Java性能優化已經超過了我的經驗。是否有任何方法進行預編譯,設置註釋等,以跳過已經大寫字符串的電話toUpperCase

+1

我建議做上存儲的字符串。因此,無論該字符串來自哪裏,在啓動/首次檢索時/無論初始化階段如何工作,都將其轉換爲大寫。 – Taylor

回答

0

如果可以的話,你需要做的就是對字符串調用.toUpperCase()一次,並存儲它,以便在循環時不必每次都做。

我不相信有一個預編譯的情況 - 你不能預先知道代碼將被處理的數據。如果有人能糾正我的話,那真是太棒了。

如果您發佈了一些示例代碼,我將能夠提供更多幫助 - 這取決於您在訪問循環之前對數據的訪問類型。如果您的循環實際上正在執行數據訪問(例如,從文件中讀取數據)並且無法控制這些文件的來源,那麼與數據硬編碼相比,您的循環會更加緊密。

任何許多情況下都有簡單的答案,但在某些情況下,您可以做的事情不多。您也可以嘗試equalsIgnoreCase。它不會創建一個新的字符串。

+0

在隨後的調用中,您需要進行字符串匹配以查看您是否已經緩存了這一個,這相當昂貴。 – djechlin

+0

你必須發佈代碼。我們不知道你的背景是什麼。 – Plasmarob

+0

如果您真的渴望速度,您可能會考慮使用不同的語言 - 您可以使用ASCII碼在二進制級別上評估案例。位5 - \ * \ * 1 \ * \ * \ * \ * \ *較低,\ * \ * 0 \ * \ * \ * \ * * \ *較高。 – Plasmarob

-1

你需要做一個if語句來處理這些字母。好的想法只是有條件。然後使用ascii代碼進行轉換,然後使用(int)進行轉換,然後找到大寫的ascii數字,我不知道它是什麼,然後繼續說如果ascii是真的,則忽略此部分,或者如果它對於一行中的特定字母然後暫時忽略它的charAt(I)

抱歉它是一個粗略的解釋

+0

這需要檢查字符串中的大寫字符,大約是昂貴的。應該可以避免完全讀取字符串。 – djechlin

0

沒有使用註釋或預編譯,因爲你的輸入在運行時給出的註釋和預編譯的編譯,你不能這樣做時間建設。

如果您事先知道輸入,那麼在運行應用程序之前(即編譯應用程序之前),您可以簡單地將其轉換爲大寫。

請注意,有很多方法來優化字符串處理,但沒有更多的信息,我們不能給你任何定製的解決方案。

0

您可以編寫一個簡單的函數isUpperCase(字符串),並調用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; 
} 
相關問題