Personal tools
You are here: Home ブログ アリエル開発者のブログ Javaでの空文字の判定方法
Document Actions

Javaでの空文字の判定方法

アリエル社内の掲示板でJavaでの空文字の判定方法が密かなブームを読んでいます。例によって、かなり脱線した議論もあります。

そもそもの質問者は、

Javaでの空かどうかの判定は、どちらがいいのでしょう?

  1. str.equals("")
  2. str.length() == 0

最初の方法はタイプが楽ですが、効率が悪そうです。二つ目の方法は速そうですが、空文字の判定かどうかがわかりづらいです。

というものです。ここで、Pythonistaが

Python的には、s is None

と発言してしまったことに議論の発散が始まります。確かにPythonの方がJavaに比べてシンプルで直感的です。C/C++に慣れているおじさん世代には反論を呼びそうです。

質問者は、Pythonistaに反論して、

C的には、

  1. *str == '\0'
  2. strlen(str) == 0

二つ目の方法はとても遅くなる可能性があるので、邪悪です。

C++的には、basic_stringを使って、str.empty()が安全確実。

と言うものでした。JavaとCでは、null判定が前提として行われるものとしています。 他の言語を見てきたあとに、Javaの話にようやく戻ります。

第3の方法として、

try { str[0]; }

catch (Exception e) { /* 空文字! */ }

がPythonistaによって提案されました。配列で存在しない要素にアクセスするので、Javaの例外が発生することを利用した実装です。例外で処理するので、当然実効速度は遅くなります。

ここまで来たら、もうやけくそです。さらに邪悪さをまして、次のような案が提案されています。

文字列のhash値を比較する方法

str.hashCode() == "".hashCode()

StringクラスのindexOfを使ってみる

for (int i = 0; i < 65536; i++) {
    if (str.indexOf(i) >= 0 ) {
        // 空文字ではない
        return;
     }
}

この二つの方法に対するコメントは、「まだまだ、邪悪さが足りません。」と言うことでした。さて、あなたならどう書く?

Category(s)
開発
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/dev/empty-string/tbping

Re:Javaでの空文字の判定方法

Posted by anaka at 2006-01-31 17:36
str[0]じゃなくてstr.charAt(0)です。

hashを比較する方法は遅い上に、確実性がないという問題を抱えています。
邪悪なのとは違って、単にバグってます。

Re:Javaでの空文字の判定方法

Posted by Anonymous User at 2006-05-30 17:48
qqq

文字列リテラルもオブジェクト

Posted by 見渡すかぎりの鶏 at 2006-02-07 13:16
Javaでの空かどうかの判定は、どちらがいいのでしょう? 1. str.equals(””) 2. str.length() == 0 最初の方法はタイプが楽ですが、効率が悪そうです。二つ目の方法は速そうですが、空文字の判定かどうかがわかりづらいです。 strがnullだとヌルポがでてしまうので、 ””.equals(str) のほうがよい。空文字リテラルからいきなりメソッドを呼ぶのが、ちょっとかっこいいのも魅力的。まあ、邪悪さはないけど。
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.