![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
JavaのString、StringBuffer、Charの中でメモリの使用が一番良いものは?
Java初心者です。
現在JavaMEのMIDP(2.0)で辞書アプリケーションを作成しています。
携帯電話のメモリが小さいことから不向きではあると思っていますが、できるだけ多くの単語と説明を登録していようとしています。
基本的な文法は通常のJavaと同じだと思います。
大まかな構造は不要部分を省きますと、
-----
class Dictionary extend Canvas(){
int i,j,start=0,end=0,x=1;
private static Font fontL=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_LARGE);
void paint(Graphics g){
//getsetsumei(x)で単語の意味・説明をString型で受け取っています。
//substringで一文字ずつ増やしながら文字の横幅をgetWidthで受け取り、
//描画画面横幅の最大値240を越えないように部分文字列で表示しています。
//文字の続きは文字サイズの縦幅をfontL.getHeight()で取得し、
//改行のような形で続けて表示します。
//また描画画面縦幅の最大領域getHeight()を越えて表示しないために
//i行目までに描画した文字列の縦幅の総和がこれを越えないようにすることで、
//無駄な描画をしないようにしています。
for(i=1;i!=0 && i*fontL.getHeight()<getHeight()-130;i++){//画面縦幅の描画範囲の判定
while(fontL.stringWidth(getsetsumei(x).substring(start,end+1))<240){//画面横幅の描画範囲の判定
end++;//横幅に達するまで文字数を増やす
if(end==getsetsumei(x).length()){//表示すべき文字列の取得が終わった
g.drawSubstring(getsetsumei(x),start,end-start,0,130+x,Graphics.TOP|Graphics.LEFT);
i=-1;//終了条件のi!=0を満たさなくするため
break;
}
}
//描画すべき文字列の一部をSubstringで描画
g.drawSubstring(getsetsumei(x),start,end-start,0,130+y,Graphics.TOP|Graphics.LEFT);
start=end;//次の行の描画すべき部分文字列の開始位置を指定
y+=fontL.getHeight()+1;//改行のためのy座標の移動
}
}
String getsetsumei(int DicNum){
switch(DicNum){
case 0:return " ";//説明無し
case 1:return "辞典,辞書,字引";//Dictionaryの意味、説明
}
}
}
-----
となっています。
実際は単語の意味をString型で返すgetsetsumeiの引数xの値を変化させて単語に合わせて意味を取得しようとしています。
改行するプログラムのためにgetsetsumei関数は何度も呼ばれることになるので、できるだけメモリを使用せず、高速にしたいと思っています。
色々調べたところStringは非可変文字列であるとのことでした。
これは説明内容が変更されるたびに別のメモリを確保するということでしょうか?
それとも同じメモリに新しい説明が上書きされるのでしょうか?その場合、StringではなくStringBufferを使用すべき、もしくはchar配列を使用すべきでしょうか?
どなたかご教授願います。
No.2ベストアンサー
- 回答日時:
「String型のオブジェクトが不変」ということの意味を勘違いされていると思います。
オブジェクトの中身とオブジェクトへの参照を区別してください。不変なのはオブジェクトの中身のほう。下記のようなコードで変数setsumeiはString型オブジェクトへの参照を保持しているだけなので、実行しても変数setsumeiが保存されているメモリが毎回確保されるなどということはなく、同じ場所が上書きされます。
String setsumei;
setsumei=getSetsumei(1);
setsumei=getSetsumei(2);
setsumei=getSetsumei(3);
No.1
- 回答日時:
> while(fontL.stringWidth(getsetsumei(x).substring(start,end+1))<240){//画面横幅の描画範囲の判定
> end++;//横幅に達するまで文字数を増やす
> if(end==getsetsumei(x).length()){//表示すべき文字列の取得が終わった
> g.drawSubstring(getsetsumei(x),start,end-start,0,130+x,Graphics.TOP|Graphics.LEFT);
xが変わらなければgetsetsumei(x)の結果も変わらないのに、このメソッドを繰り返し呼ぶのは非常に無駄です。以下のように一度Stringの変数で受ければ繰り返して呼ぶ必要がなくなります。
String setsumei=getsetsumei(x);
while(fontL.stringWidth(setsumei.substring(start,end+1))<240){
end++;
if(end==setsumei.length()){//表示すべき文字列の取得が終わった
g.drawSubstring(setsumei,start,end-start,0,130+x,Graphics.TOP|Graphics.LEFT);
回答ありがとうございます!
String型の変数に違う値を代入すると、変更不可能なので違うメモリに値が格納される
という前提でできるだけString型の変数を使わないようにしていたのですが、
そういうことはないということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 政治 私の発明した「二階建て漢字」は使えるでしょうか? 3 2023/02/08 16:40
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- HTML・CSS 要素の幅をいろんな写真の幅に合わせたい。 1 2022/07/25 20:11
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- gooブログ Twitterの動画画面をgooブログに埋め込めない 4 2022/06/03 16:40
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- CAD・DTP 「機能ブロック図」の描画用フリーソフトを教えてください 1 2022/09/23 16:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETのSendMessageを教えてく...
-
画面のちらつきの原因が知りた...
-
VB.NET フォーム上に描いたグ...
-
JAVAでの背景画像表示
-
SwingとEDT(イベントディスパッ...
-
C# DataGridView のCellPaintin...
-
重なった要素上でのイベントで...
-
JavaのString、StringBuffer、C...
-
「タイプ初期化子が例外をスロ...
-
次の日本語の意味を教えて下さい
-
エクセルVBAで、条件に一致する...
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
C#において、同じインスタンス...
-
VBA 同じ名前のオブジェクトを...
-
java eclipse 型に解決できません
-
Excelで =EMBED("Acrobat Docu...
-
VB.NET getとsetの概念がわかり...
-
エクセルVBAにおけるON TIMEメ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVAでの背景画像表示
-
VB.NET フォーム上に描いたグ...
-
VB.NETのSendMessageを教えてく...
-
C# DataGridView のCellPaintin...
-
Javaで文字の角度を変えて表示...
-
canvasで表示されてる画像を1...
-
画面のちらつきの原因が知りた...
-
Labelコントロールの背景をグラ...
-
重なった要素上でのイベントで...
-
java.awt.peer?
-
Canvas等の図形を移動する時,直...
-
OpenLayersの描画を固定で表示...
-
ID3DXSprite::Drawメソッドに関...
-
SwingとEDT(イベントディスパッ...
-
C#のGraphicsクラスについてです。
-
複数画像表示切り替え Visual c++
-
Androidのフォントサイズ(SP)と...
-
Androidで画像の中で指定した範...
-
描画処理が実行されない
-
JavaScript でスライダーを作る...
おすすめ情報