/* 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追加,因为它是可变的,它仍然给我代码厨师使用相同的内存。
答案 0 :(得分:1)
这个问题在codereview.stackexchange.com上可能会更好,但不过,我会在这里发表一些评论。
在使用的2638 KB内存中,我希望其中绝大部分内存由Java Runtime Environment使用,而不是直接由您的应用程序使用。你仍然可以节省几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;
从1开始r
并使用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 +" ";
不需要前面的""+
代码。您正在通过执行此操作来创建新的String(从而浪费内存)。但是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);
}
}