- PR -

二種類のString[]生成法の間の違いは?

投稿者投稿内容
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-08-12 13:01
String a = new String("moge");
はメモリの無駄遣いにはならないような気が。
java-house にそういう話題があったと思います。
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2002-08-13 22:01
しょむ さん
> String a = new String("moge");
>はメモリの無駄遣いにはならないような気が。
>java-house にそういう話題があったと思います。
そうですか。
調べてみます。

どうも、また宜しくお願い致します。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-08-14 00:16
http://java-house.jp/ml/archive/j-h-b/003436.html#body

このへん。どっちかよくわからんですね。

http://java-house.jp/ml/topics/

から String まわりでも読んでみてくださいな。いろいろ複雑なんで。

[ メッセージ編集済み 編集者: しょむ 編集日時 2002-08-14 00:17 ]
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2002-08-14 17:04
しょむ さん
情報ありがとうございます。

http://java-house.jp/ml/archive/j-h-b/003436.html#body
↑読みましたが、やはり、String s="abc";のほうが
String s= String("abc");より
原理的に省時間と省メモリである印象は払拭できないですね。

これはC等にも通用すると思います。

ただ、
>IBMJDK 1.3 でコンパイルした .class を javap -c で dump しましたが、
>クラス名、メソッド名以外は同じでした。
これは面白いと思います。
そのdumpを見せていただけませんか。
なぜなら、この辺について、実装による差があるではないかと思いましたのです。
Cでコンパイラースイッチによってリテラルstringを単一化にすることができると
同じと思いますが。



ひろ
常連さん
会議室デビュー日: 2001/12/13
投稿数: 36
投稿日時: 2002-08-15 12:05
Java-Houseの一連の投稿読んでみましたが、
文字列リテラルをStringオブジェクト生成方法と考えることに無理がありそうな気がします。

たしかに文字列リテラルはString型を持ち、内部的には同値のStringオブジェクトがまだ、
生成されていなければ、JVMは新たなStringオブジェクトを生成するのでしょうが、
それはあくまでもJVMが文字列リテラルを扱うときに行う処理であってStringオブジェクトを
生成することが目的ではないと思います。

逆にnew String()を使うということはプログラマが明示的にStringオブジェクトの生成を指示
していることであって、この場合は必ずオブジェクトが生成されなければならない。

BufferedReader br = new BufferedReader(new FileReader("str.txt"));
String line1 = br.readLine();
String line2 = br.readLine();

readLine()は読み込んだストリームを新たなStringオブジェクトとして返しますが、
この場合、line1とline2の値がまったく同じであったとしてもline1とline2が表すものは
ただの文字列という意味ではなく入力ファイルの1行目のテキスト文字列、2行目のテキスト
文字列という意味があると思います。
そう考えれば内部の値がまったく同じであっても新たなオブジェクトが生成されるのは自然に
思えます。

ようするに、文字列値自体が概念的に一つの意味をなす場合に文字列リテラルを使うのであって、
その際String("abc")のような形で新たにオブジェクトを生成することはその生成自体に
意味がある場合以外は避けた方が良いのではないでしょうか。
そういうケースは私には考え付きませんが。

ループ内などで呼び出されると値的にも意味的にも同じオブジェクトが多数生成される
わけですから、メモリと時間を浪費することになりますし、
結局、通常はString(String str)コンストラクタを使う必要はないと思います。

スキルアップ/キャリアアップ(JOB@IT)