2

現在、私は文字列操作に取り組んでおり、デモを行っているときに、いくつかの異なる動作を見つけました。

以下は私のコードです。

public class HelloWorld{

 public static void main(String []args){
    String str1 = "Hello";
    String str2 = "Hello";
    String str3 = new String("Hello");

    String strArray[] = {"Hello","Hello"};
    String strArray1[] = new String[] {"Hello","Hello"};

    System.out.println("str1==str2::  "+(str1==str2));
    System.out.println("str1==str3::  "+(str1==str3));

    System.out.println("strArray[0]==strArray[1]::  "+(strArray[0]==strArray[1]));
    System.out.println("str1==strArray[1]::  "+(str1==strArray[1]));

    System.out.println("strArray1[0]==strArray1[1]::  "+(strArray1[0]==strArray1[1]));
    System.out.println("str1==strArray1[1]::  "+(str1==strArray1[1]));

    System.out.println("args[0]==args[1]::  "+(args[0]==args[1]));
 }

}

上記のコードの出力は次のとおりです。コマンドライン引数を渡すコードを実行しています。

java HelloWorld Hello Hello

str1==str2:: true
str1==str3:: false
strArray[0]==strArray[1]:: true
str1==strArray[1]:: true
strArray1[0]==strArray1[1]:: true
str1==strArray1[1]:: true
args[0]==args[1]:: false

ここに 2 つのクエリがあります。

  1. 文字列 str1==str3 の参照を比較すると、str3 は新しい文字列を使用して作成され、文字列プールに存在しないため、false が返さます

  2. strArray[0]==strArray[1] は true を返し、strArray1[0]==strArray1[1] も true を返すのに、コマンド ライン引数args[0]==args[1] が falseを返すのはなぜですか??

ガイドしてください。

4

2 に答える 2

4

文字列 str1==str3 の参照を比較すると、str3 は新しい文字列を使用して作成され、文字列プールに存在しないため、false が返されます。

String strArray1[] = new String[] {"Hello","Hello"};array* 内の同じ文字列 への参照を持つ新しい String 配列を作成します。"hello"

strArray[0]==strArray[1] は true を返し、strArray1[0]==strArray1[1] も true を返すのに、コマンド ライン引数 args[0]==args[1] が false を返すのはなぜですか?

args[0]==args[1]を返しますfalse。これらは 2 つの異なるインスタンス (文字列プールに追加されていない) であるため、似ていnew String()ます。これは、次を使用して簡単にテストできます。

    System.out.println(System.identityHashCode(args[0]));
    System.out.println(System.identityHashCode(args[1]));

そのため、渡された引数は文字列定数プールに追加されmain()ませ

于 2015-03-25T05:42:26.843 に答える
3

比較したいのがコンテンツだけの場合は、参照をチェックしないでください。そのため、Stringクラスはequals()最初にメソッドを提供します。前者は参照の等価性をテストし、後者は値の等価性をテストします。

文字列が内部で処理される方法は過去に変更されており、将来も変更される可能性があります。参照等価性の使用は、実際には依存すべきではない実装の詳細に依存しています。

カプセル化の要点は、クライアント コードに影響を与えずに内部で変更できるようにすることです。噛まれないように「ルール」を守らなければなりません。

それがどのように機能するかを本当に理解したい場合は、ここから入手できる Java 言語仕様を読む必要があります。これは言語の標準であり、明示的に述べられていない実装の詳細は関係ありません。

于 2015-03-25T05:37:17.590 に答える