2006/01/31
Javaでの空文字の判定方法
アリエル社内の掲示板でJavaでの空文字の判定方法が密かなブームを読んでいます。例によって、かなり脱線した議論もあります。
そもそもの質問者は、
Javaでの空かどうかの判定は、どちらがいいのでしょう?
- str.equals("")
- str.length() == 0
最初の方法はタイプが楽ですが、効率が悪そうです。二つ目の方法は速そうですが、空文字の判定かどうかがわかりづらいです。
というものです。ここで、Pythonistaが
Python的には、s is None
と発言してしまったことに議論の発散が始まります。確かにPythonの方がJavaに比べてシンプルで直感的です。C/C++に慣れているおじさん世代には反論を呼びそうです。
質問者は、Pythonistaに反論して、
C的には、
- *str == '\0'
- 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
文字列リテラルもオブジェクト
Javaでの空かどうかの判定は、どちらがいいのでしょう? 1. str.equals(””) 2. str.length() == 0 最初の方法はタイプが楽ですが、効率が悪そうです。二つ目の方法は速そうですが、空文字の判定かどうかがわかりづらいです。 strがnullだとヌルポがでてしまうので、 ””.equals(str) のほうがよい。空文字リテラルからいきなりメソッドを呼ぶのが、ちょっとかっこいいのも魅力的。まあ、邪悪さはないけど。
Re:Javaでの空文字の判定方法
hashを比較する方法は遅い上に、確実性がないという問題を抱えています。
邪悪なのとは違って、単にバグってます。
Re:Javaでの空文字の判定方法