如何优化以下代码以获得更好的内存使用?

时间:2018-02-22 08:01:20

标签: java arrays performance

/* 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追加,因为它是可变的,它仍然给我代码厨师使用相同的内存。

1 个答案:

答案 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);
    }
}