質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • Java

    13478questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

[Java]メモリの浪費箇所はどこ?

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 650

colonee

score 5

現在Aize Online Judgeの問題に取り掛かり始めたものです。
取り組んでいる問題
以下のコードではメモリの使用量が多すぎてオンラインジャッジがうまくいきません。
どの部分がメモリを浪費してしまっているのでしょうか?
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String text = new String();
        int num;
        int count = 1;
        while (true) {
            num = scan.nextInt();
            if (num == 0) {
                scan.close();
                System.out.println(text);
                break;
            } else {
                text += "Case " + count + ": " + num + "\n";
                count++;
            }
        }
    }
 
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

メモリの使用量ではなく,消費時間の問題のような気がします.主にここの.
                text += "Case " + count + ": " + num + "\n";
JavaのStringにおいて+演算子で文字列を連結すると,そのたびに新たにStringを生成する仕組みになっています.
つまり,ループごとに
  1.  "Case "と数値countを連結
  2.  1.と": "を連結
  3.  2.と数値numを連結
  4.  3.と改行記号を連結
  5.  文字列textと4.を連結し,textに格納
という工程を踏みます.最終的に使うのは5.だけです.
Stringの生成コストは結構あるようで,えらく時間がかかるのです→あえて言うほどではない 文字列結合 Java編
改善策として,StringBuilderを使ってはいかがでしょうか?
textを次のように定義し直します
StringBuilder text = new StringBuilder();
そして文字列連結では次のようにします
text.append("Case ").append(count).append(": ").append(num).append("\n");
StringBuilderは文字の配列を次々足しているだけで新たなStringを生成するわけではないので
高速化,省メモリできます.
最後に出力するときだけ文字列を生成します.これにはtoString()するのですが,println()にオブジェクトを渡すと自動的に内部でそのオブジェクトのtoString()を出力に使うので,このままでいいです.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/13 20:05

    おかげさまで先に進むことができました!ありがとうございます。
    JavaのGCも信頼なりませんね。。

    キャンセル

0

text += "Case " + count + ": " + num + "\n";
textは、メモリの使用効率がやや悪いうえに、入力が終わるまで無制限に容量が増え続けます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    javaの繰り返しについて

    java初心者です。 forの繰り返しを使って、以下のようなプログラムを作成しました。

  • 解決済

    占いの機能 Javaの学習中

    ただいま、Javaの初歩の本を利用し、占いの機能を製作したのですがエラーがでてしまいました。 その理由がわからないため質問させていただきたいと思います。 ソースコード publ

  • 受付中

    10進数から16進数に変換

    10進数を入力すれば16進数に変換されるというプログラムを作っているのですがいまいちうまくいきませんどこがまちがっているのでしょうか? import java.io.IOExce

  • 解決済

    エラー解決

    package otamesi; public class Main { public static void main(String[]args){          

  • 解決済

    非同期処理 wait,notifyAllの使い方

    import java.util.Collections; import java.util.LinkedList; import java.util.List; import j

  • 解決済

    SimpleDateFormatで日時形式判定

    実現したいこと Javaの初心者です。 ログ解析用のツールを作成しているのですが、 標準入力から入力された日時が以下のいづれかの形式でなければエラーとなり、もう一度標準入力を

  • 解決済

    メソッドの一部が機能しない

    public class Numeron2{ public static void main(String[] args){ int clearTurn = 0;

  • 受付中

    四則演算の優先順位について

     前提・実現したいこと 電卓を作っています。 実現したいことは以下です。 数字は何回でも入力できる = が入力されたときに終了(結果をだす) 計算は乗算除算を優先する。 乗

同じタグがついた質問を見る

  • Java

    13478questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。