簡體   English   中英

如何優化以下代碼以更好地使用內存?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM