==演算子と文字列

OckhamsRazor:

==演算子が参照の比較に使用されているため、以下のコードは「Bye」を出力しませんが、奇妙なことに「Bye」が出力されます。なぜこれが起こるのですか?IDEとしてNetbeans 6.9.1を使用しています。

public class Test {
    public static void main(String [] args) {
        String test ="Hi";
        if(test=="Hi"){
            System.out.println("Bye");
        }
    }
}
TJクラウダー:

この動作はインターンが原因です動作はのドキュメントに記載されString#internています(呼び出したことがないのにコードに表示される理由を含むString#intern):

文字列のプールは、最初は空で、クラスによってプライベートに維持されStringます。

internメソッドが呼び出されたときに、メソッドStringによって決定されたこのオブジェクトに等しい文字列がプールに既に含まれている場合、プールequals(Object)からの文字列が返されます。それ以外の場合、このStringオブジェクトはプールに追加され、このオブジェクトへの参照Stringが返されます。

これは、任意の二つの文字列のためにそれを次のsts.intern() == t.intern()あるtrue場合にのみs.equals(t)当てはまります。

すべてのリテラル文字列と文字列値の定数式がインターンされます。文字列リテラルは、Java言語仕様の §3.10.5で定義されています

だから例えば:

public class Test {

    private String s1 = "Hi";

    public static void main(String [] args) {

        new Test().test();
        System.exit(0);
    }

    public void test() {
        String s2 ="Hi";
        String s3;

        System.out.println("[statics]          s2 == s1? " + (s2 == s1));
        s3 = "H" + part2();
        System.out.println("[before interning] s3 == s1? " + (s3 == s1));
        s3 = s3.intern();
        System.out.println("[after interning]  s3 == s1? " + (s3 == s1));
        System.exit(0);
    }

    protected String part2() {
        return "i";
    }
}

出力:

[静力学] s2 == s1?true 
[インターン前] s3 == s1?false 
[インターン後] s3 == s1?本当

それを歩く:

  1. 割り当てられたリテラルs1は自動的にインターンされるため、最終的にs1プール内の文字列を参照します。
  2. 割り当てられたリテラルs2も自動的にインターンされるため、最終的s2には同じインスタンスがs1ポイントするようになります。JavaのStringインスタンスは不変であるため、2ビットのコードが互いに完全に認識されていない場合でも、これは問題ありませんそれらを変更することはできません。などのメソッドを使用して、変更toLowerCase後の新しい文字列を取得できますが、呼び出した元の文字列toLowerCaseなどは変更されません。したがって、それらは無関係のコード間で安全に共有できます。
  3. ランタイム操作を介し新しい Stringインスタンスを作成します。新しいインスタンスには、インターンされたインスタンスと同じ文字シーケンスがありますが、別のインスタンスです。ランタイムは、動的に作成された文字列を自動的にインターンしません。これは、コストがかかるためです。プールで文字列を見つける作業。(コンパイルする場合、コンパイラはそれ自体にその費用を取ることができます。一方)だから今、私たちは2つのインスタンス、1持っているs1s2の点に、そして1つのs3にポイントを。したがって、コードはそれを示していs3 != s1ます。
  4. 次に、明示的にインターンしs3ます。おそらくこれは、長い間保持する予定の大きな文字列であり、他の場所で複製される可能性が高いと考えられます。したがって、メモリ節約の見返りとして、インターンする作業を受け入れます。定義による解釈とは、新しい参照を取得できることを意味するため、結果をに割り当てs3ます。
  5. 実際、s3同じインスタンスs1s2ポイントしてポイントしていることがわかります

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

文字列と?:演算子

分類Dev

文字列の連結:concat()と "+"演算子

分類Dev

ToString()と文字列演算子の型推論

分類Dev

C ++文字列追加と演算子の違い+ =

分類Dev

Cでの文字列と演算子の比較

分類Dev

条件演算子を文字列として解析し、条件演算子として使用する

分類Dev

JavaScriptの「in」演算子。文字列比較

分類Dev

+ Javaの文字列の演算子

分類Dev

クエリ文字列演算子

分類Dev

静的文字列のnameof()演算子

分類Dev

Ruby文字列補間演算子

分類Dev

CPythonの文字列 'in'演算子

分類Dev

文字列|| Rubyの比較演算子

分類Dev

ギリシャ文字のC ++文字列と.at()演算子

分類Dev

複数の列とIN演算子

分類Dev

ときに「==」演算子が正常に文字列を比較しますか?

分類Dev

JavaScriptの論理演算子&&と2つの文字列

分類Dev

Java String ==演算子と文字列リテラル

分類Dev

Oracleの文字列連結演算子とは何ですか?

分類Dev

C#6でのヌル条件演算子と文字列補間

分類Dev

文字列をRの論理演算子と比較する

分類Dev

文字列を「<」または「>」演算子と比較する(C)

分類Dev

三項演算子と再帰を使用した文字列の連結

分類Dev

Javascriptで文字列を整数と演算子に変換する方法は?

分類Dev

Pythonで文字列をさまざまな演算子と比較する

分類Dev

コード名1つのStringBuilderと文字列間の「+」演算子

分類Dev

C ++ std :: string :: compare()と文字列の演算子の間の不整合

分類Dev

新しい演算子とリテラルを含むJava文字列

分類Dev

文字列を演算子として使用しますか?

Related 関連記事

  1. 1

    文字列と?:演算子

  2. 2

    文字列の連結:concat()と "+"演算子

  3. 3

    ToString()と文字列演算子の型推論

  4. 4

    C ++文字列追加と演算子の違い+ =

  5. 5

    Cでの文字列と演算子の比較

  6. 6

    条件演算子を文字列として解析し、条件演算子として使用する

  7. 7

    JavaScriptの「in」演算子。文字列比較

  8. 8

    + Javaの文字列の演算子

  9. 9

    クエリ文字列演算子

  10. 10

    静的文字列のnameof()演算子

  11. 11

    Ruby文字列補間演算子

  12. 12

    CPythonの文字列 'in'演算子

  13. 13

    文字列|| Rubyの比較演算子

  14. 14

    ギリシャ文字のC ++文字列と.at()演算子

  15. 15

    複数の列とIN演算子

  16. 16

    ときに「==」演算子が正常に文字列を比較しますか?

  17. 17

    JavaScriptの論理演算子&&と2つの文字列

  18. 18

    Java String ==演算子と文字列リテラル

  19. 19

    Oracleの文字列連結演算子とは何ですか?

  20. 20

    C#6でのヌル条件演算子と文字列補間

  21. 21

    文字列をRの論理演算子と比較する

  22. 22

    文字列を「<」または「>」演算子と比較する(C)

  23. 23

    三項演算子と再帰を使用した文字列の連結

  24. 24

    Javascriptで文字列を整数と演算子に変換する方法は?

  25. 25

    Pythonで文字列をさまざまな演算子と比較する

  26. 26

    コード名1つのStringBuilderと文字列間の「+」演算子

  27. 27

    C ++ std :: string :: compare()と文字列の演算子の間の不整合

  28. 28

    新しい演算子とリテラルを含むJava文字列

  29. 29

    文字列を演算子として使用しますか?

ホットタグ

アーカイブ