- PR -

文字列の比較

投稿者投稿内容
てんきゅう
会議室デビュー日: 2003/04/10
投稿数: 3
お住まい・勤務地: 埼玉県・新宿
投稿日時: 2003-05-15 09:41
お疲れ様です。てんきゅうです。

皆さん、ありがとうございました。
皆さんの意見が聞けてとてもよかったです。

私的には(かなり好みで決めました)
if( string == null || string.length() <= 0 ) {
が良いかと思いましたので
以後、これで行きたいと思います。

ありがとうございました。

MUSE
常連さん
会議室デビュー日: 2003/04/06
投稿数: 42
投稿日時: 2003-07-24 19:24
カメレスですみませんが、
引用:

zaxx_MDさんの書き込み (2003-05-02 14:01) より:
私は
if (string == null || string == "") {
このような記述を見つけたら怒り出します。
ingHelper.isNULL( string ) || string.trim().length() == 0 )


なぜ、この記述で怒りだすのですか?
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-07-24 19:48
zaxx_MDさんではありませんが、
引用:

LEDさんの書き込み (2003-07-24 19:24) より:
なぜ、この記述で怒りだすのですか?


これは、
コード:
String string = new String("");
if (string == null || string == "") {
   ...
}


こんなコードを実行してみればわかると思いますよ。

もっとも、
String string = new String("");
の時点で怒り出しかねないですが…。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2003-07-25 09:31
引用:

もっとも、
String string = new String("");
の時点で怒り出しかねないですが…。




こんにちわ。

僕は細かい実行効率などはあまり意識していなかったのですが
このコメントを見付けてちょっと実験してみました。

Stringの初期化について以下の3つのパターンがあると思います。
A.String str = "";
B.String str = new String();
C.String str = new String("");

上記3パターンについて以下の処理を行いました

コード:
public class Sample {
	private static final int cnt = 1000000;
	
	public static void main( String[] args ) {
		Sample sample = new Sample();
		
		System.out.println( "test1 : " + sample.test1() );
		System.out.println( "test2 : " + sample.test2() );
		System.out.println( "test3 : " + sample.test3() );
	}
	
	private long test1() {
		long before = System.currentTimeMillis();
		for ( int i=0; i<cnt; i++ ) {
			String str = "";
		}
		return System.currentTimeMillis() - before;
	}
	
	private long test2() {
		long before = System.currentTimeMillis();
		for ( int i=0; i<cnt; i++ ) {
			String str = new String();
		}
		return System.currentTimeMillis() - before;
	}
	
	private long test3() {
		long before = System.currentTimeMillis();
		for ( int i=0; i<cnt; i++ ) {
			String str = new String("");
		}
		return System.currentTimeMillis() - before;
	}
}



処理性能結果は
A > C > B

となりました。

僕は結構頻繁に
String str = new String();

というコードを使用していたため、ちょっとびっくりしているんですが。
でもなぜ
BよりCの方が早いかはいまいちわかりません。

そもそも僕のテストコードがおかしいのか・・。
stoc
会議室デビュー日: 2003/03/27
投稿数: 11
投稿日時: 2003-07-25 13:59
こんにちは、stocです。
コード:

僕は結構頻繁に
String str = new String();

というコードを使用していたため、ちょっとびっくりしているんですが。
でもなぜ
BよりCの方が早いかはいまいちわかりません。 僕は結構頻繁に
String str = new String();

というコードを使用していたため、ちょっとびっくりしているんですが。
でもなぜ
BよりCの方が早いかはいまいちわかりません。


jdk1.4.2のString.javaソースを私なりに確認したんですが、
B.String str = new String();
は、内部のchar型配列を毎回newしているようです。

C.String str = new String("");
の方は、サイズが同じなのでデータをコピーしているようです。

ただ、AとCの差は、僕も驚きました。


[ メッセージ編集済み 編集者: stoc 編集日時 2003-07-25 14:01 ]

[ メッセージ編集済み 編集者: stoc 編集日時 2003-07-25 14:03 ]
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-07-25 18:58
こんにちはWataです。
引用:

(株)ぽちさんの書き込み (2003-07-25 09:31) より:
A.String str = "";
B.String str = new String();
C.String str = new String("");


BとCはどっちも余分なオブジェクトが1個作られること意外、Aと実質的な違いは何もありません。
よく
String str = new String("abc" + "efg");
みたいなコードを書く人がいますが、まったくの無駄です。
こんなのも積もり積もればGC頻発の原因になるので注意した方がいいですよ。
String(String original)のコンストラクタはdeprecatedにして欲しいです。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-07-25 20:00
>System.out.println( "test1 : " + sample.test1() );
>System.out.println( "test2 : " + sample.test2() );
>System.out.println( "test3 : " + sample.test3() );
順番は入れ換えてみましたか?
このままだと先にやるほうが不利になるのでは.
うのきち
ベテラン
会議室デビュー日: 2003/02/17
投稿数: 55
投稿日時: 2003-07-26 09:19
あの〜、なんか論点がずれていっていませんか?
LEDさんが言いたいのは、こういうケースだと思います。

String empty = new String("");
if (empty == "") {
System.out.println("Empty");
}
else {
System.out.println("Not empty");
}

Stringを==で比較するには、「一般には」間違いです。

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