0

DefaultHandlerのイベント メソッド内のすべての文字列がインターンされていることに気付きました。==文字列がではなく と等しいかどうかを確認した方がよいでしょうequals()か?

@Override
public void startElement(String uri, String localName, String qName,
     Attributes attributes) throws SAXException {

if(localName == "element")
// do something

// or

if(localName.equals("element"))
// do something

}

すべての文字列リテラルがインターンされるため、パフォーマンスが向上するはずです。しかし、私が見たすべてのチュートリアルと例は使用していますequals()

私が見ることができる問題は、使用する必要があるかどうかですequalsIgnoreCase()

4

1 に答える 1

7

少なくとも Oracle JDK7 では、String.equals(Object) が最初に行うことは、オブジェクト参照が String インスタンスと同じかどうかを確認することです。

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    ...

したがって、==これらのケースで正しい結果が得られたとしても、達成した唯一の節約は、(ほぼ) すぐに返されるメソッド呼び出しです。どのような種類の測定でも、コスト削減が顕著になるとは思えません。

ある程度のコスト削減があったとしても、==これらの文字列の比較が正しいと常に仮定することは、非常に危険な最適化であるように思われます。SAX クラスの将来のバージョンで動作が変更された場合はどうなりますか? 文字列インターンは API の文書化された機能ですか? 疑わしいですね。

于 2013-03-05T22:14:04.310 に答える