[英]How can i optimize the following code for better memory usage?
/* package codechef; // don't place package name! */
import java.util.StringTokenizer;
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Codechef
{
String func (String s1)
{
StringTokenizer st =new StringTokenizer(s1);
String fina= new String();
while(st.hasMoreTokens())
{
String s= st.nextToken();
char []ch= s.toCharArray();
int length= ch.length;
int r=0;
int i =1;
while(i<=length/2)
{
char temp;
temp=ch[i];
ch[i]=ch[length-1-r];
ch[length-1-r]=temp;
r++;
i++;
}
String revword=new String(ch);
fina+=""+revword +" ";
}
return(fina);
}
public static void main (String[] args) throws java.lang.Exception
{
String s1="Tarun is a intern";
Codechef c=new Codechef();
String s2=c.func(s1);
System.out.println(""+s2);
}
}
上面的代碼是在codechef ide上運行的,我使用的是2638 KB 的內存。 有沒有其他方法可以用來減少內存使用量? 或者有什么其他優化的方法? 我嘗試使用 StringBuilder 進行追加,因為它是可變的,但它仍然給我代碼廚師相同的內存使用量。
這個問題在 codereview.stackexchange.com 上可能會更好,但盡管如此,我還是會在這里發表一些評論。
在所使用的 2638 KB 內存中,我預計其中的絕大部分是由 Java 運行時環境使用的,而不是直接由您的應用程序使用。 您仍然可以節省幾 KB。 這是逐行評論。
/* package codechef; // don't place package name! */
無需在代碼中保留以上行。
import java.util.StringTokenizer;
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Codechef
{
String func (String s1)
{
StringTokenizer st =new StringTokenizer(s1);
StringTokenizer 的文檔說這是一個為向后兼容而保留的遺留類,較新的代碼應該使用String.split()
代替。 這將提高可讀性,但我懷疑它會提高性能或內存使用情況。
String fina= new String();
你為什么使用new String()
? 只需使用""
。 通過使用new String()
您正在創建一個新對象,從而浪費了幾個字節的內存,當""
引用現有對象時,並且更具可讀性。
while(st.hasMoreTokens())
{
String s= st.nextToken();
char []ch= s.toCharArray();
int length= ch.length;
int r=0;
將r
從 1 開始並使用length-r
而不是length-1-r
可能更具可讀性。
int i =1;
您需要從 0 開始i
,因為這是第一個字符的索引。
while(i<=length/2)
使用for
循環可能更具可讀性。
{
char temp;
temp=ch[i];
為什么不在同一行聲明和初始化? char temp = ch[i];
ch[i]=ch[length-1-r];
ch[length-1-r]=temp;
r++;
i++;
}
String revword=new String(ch);
fina+=""+revword +" ";
不需要""+
前面的revword。 您正在通過這樣做創建一個新字符串(從而浪費內存)。 但是revword
已經是一個字符串,所以不需要將它附加到一個空字符串。
在循環內追加到String fina
消耗 CPU 時間(和一些內存)。 您應該改用StringBuilder
。
此外,如果您使用StringBuilder
您將能夠直接將ch
復制到它,而無需創建一個新的String
,它是ch
的副本。
}
return(fina);
小問題:這里不需要括號,因為它使return
關鍵字看起來像一個方法調用,而事實並非如此。
}
順便說一句,您的方法在返回的字符串末尾添加了一個" "
(空格),這可能不是您想要的。
public static void main (String[] args) throws java.lang.Exception
{
String s1="Tarun is a intern";
Codechef c=new Codechef();
String s2=c.func(s1);
System.out.println(""+s2);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.