天天看點

JAVA 輸入輸出優化輸入輸出

把以前自己的測試寫一下,當時也一直在網上找怎麼輸入輸出快,在這裡記錄一下我目前知道的幾種輸入輸出方式吧。

有速度更快的歡迎留言交流。

輸入

我知道的有三種,分别是

Scanner

BufferedReader

StreamTokenizer

分别使用了 洛谷 和 CCF 進行了測試。

洛谷

洛谷使用的是題目是P3366,一道最小生成樹的題目,在解法不變的情況下,修改輸入方式

Scanner

最慢速度1000ms(逾時,可能更多),最大記憶體占用125MB(超出記憶體,可能更多)

JAVA 輸入輸出優化輸入輸出

BufferedReader

最慢速度548ms,最大記憶體占用87MB

JAVA 輸入輸出優化輸入輸出

StreamTokenizer

最慢速度285ms,最大記憶體占用23MB

JAVA 輸入輸出優化輸入輸出

CCF

使用的題目是 201412-4 最優灌溉,也是一道最小生成樹的題目。

測試結果如下:

JAVA 輸入輸出優化輸入輸出

測試代碼太久遠,找不到了。我就寫個如何使用吧,有興趣的可以自己去試試。這裡以輸入一個二維int數組為例子。三種輸入方式代碼如下:

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        // Scanner
//        Scanner in = new Scanner(System.in);
//        int n = in.nextInt(), m = in.nextInt();
//        int[][] nums = new int[n][m];
//        for ( int i = 0; i < n; i++ ) {
//            for ( int j = 0; j < m; j++ ) {
//                nums[i][j] = in.nextInt();
//            }
//        }

        // BufferedReader
//        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        String[] line = br.readLine().split(" ");
//        int n = Integer.parseInt(line[0]), m = Integer.parseInt(line[1]);
//        int[][] nums = new int[n][m];
//        for ( int i = 0; i < n; i++ ) {
//            line = br.readLine().split(" ");
//            for ( int j = 0; j < m; j++ ) {
//                nums[i][j] = Integer.parseInt(line[j]);
//            }
//        }

        // StreamTokenizer
//        Input in = new Input();
//        int n = in.nextInt(), m = in.nextInt();
//        int[][] nums = new int[n][m];
//        for ( int i = 0; i < n; i++ ) {
//            for ( int j = 0; j < m; j++ ) {
//                nums[i][j] = in.nextInt();
//            }
//        }

        // 輸出數組
//        for ( int i = 0; i < n; i++ ) {
//            for ( int j = 0; j < m; j++ ) {
//                System.out.print(nums[i][j] + " ");
//            }
//            System.out.println();
//        }
    }

}
class Input {
    StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    public int nextInt() throws IOException {
        in.nextToken();
        return (int)in.nval;
    }
}
           

輸出

我知道的有三種,分别是

直接System.out.println輸出

使用StringBuilder緩沖後輸出

PrintWriter輸出

使用的題目是 CCF 201503-1 圖像旋轉,測試結果如下:

JAVA 輸入輸出優化輸入輸出

測試代碼:

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        // 優化輸入
        Input in = new Input();
        int n = in.nextInt(), m = in.nextInt();
        int[][] nums = new int[n][m];
        for ( int i = 0; i < n; i++ ) {
            for ( int j = 0; j < m; j++ ) {
                nums[i][j] = in.nextInt();
            }
        }

        // 直接輸出
//        for ( int i = m-1; i >= 0; i-- ) {
//            for ( int j = 0; j < n; j++ ) {
//                System.out.print(nums[j][i]+" ");
//            }
//            System.out.println();
//        }

        // StringBuilder緩沖輸出
//        StringBuilder sb = new StringBuilder();
//        for ( int i = m-1; i >= 0; i-- ) {
//            for ( int j = 0; j < n; j++ ) {
//                sb.append(nums[j][i]+" ");
//            }
//            sb.append("\n");
//        }
//        System.out.println(sb.toString());

        // PrintWriter輸出
//        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
//
//        for ( int i = m - 1; i >= 0; i-- ) {
//            for ( int j = 0; j < n; j++ ) {
//                out.print(nums[j][i] + " ");
//            }
//            out.println();
//        }
//        out.flush();
    }

}
class Input {
    StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    public int nextInt() throws IOException {
        in.nextToken();
        return (int)in.nval;
    }
}
           

繼續閱讀