なぜStringを比較する際にequals()を使用して比較すべきか


Javaには基本的に処理されるデータ型が存在する.

  • は、元のデータ型(元のデータ型)/非元(クラスなど)の2つに大きく分けられます.
  • 1.元のデータ型

  • boolean,byte,char,short,int,long,float,double(8個)
  • は再分割不可能なデータであり、元のデータ型の変数が宣言されるとメモリ(Stack)に割り当てられ、実際の値が空間に格納される.
  • ✔したがって、==演算子で比較すると、指す値によって比較されます.

    2. java.lang.Objectクラスおよびそれによって派生した他のすべてのクラス。

  • 以外の元のデータ型のクラスは、新しいキーワードでインスタンスを作成すると、別のメモリ領域(heap)に新しい空間を割り当てて値を格納し、変数はその値を格納するメモリのアドレスを指します.
  • ✔したがって、==演算子を使用すると、メモリのアドレスが比較されます.
    // 1번
    String s1 = new String ("java");
    String s2 = new String ("java");
    
    // 2번
    String s3 = "java";
    String s4 = "java";
  • 1のように、新しいキーワードを使用すると、毎回新しいスペースが割り当てられ、新しいアドレスが生成されます.
  • 2を使用する場合、s 3のように同じ文字列が既に生成されている場合、s 4の新しいメモリ領域は割り当てられず、新しい変数は既存の文字列を格納するメモリ、String Pool(Heap)のアドレスを指す.

  • 実際にやってみましょう(==演算子)




    したがって、s 1=s 2はfalse、s 3=s 4はtrueである.

    equals()

  • equalsメソッドは実施によって異なるが,変数が最終的に指す値に基づいて判断する.
  • は、String文字列間で比較する場合==を使用すると値を指すアドレスが比較されるので、値を比較したい場合はequalsメソッドを使用して比較する必要があります.
  • やってみる



  • newキーワードを使用してheap領域で異なる空間のs 1とs 2のアドレスが異なる.
    したがって,==比較アドレスを用いるとfalse
  • となる.
  • ですが、s 1とs 2の実際の値はjavaと同じです.
    したがって、equalsを使用して最終的に指定した値を比較するとtrue
  • になります.

    reference!


    https://www.boostcourse.org/cs128/lecture/264918?isDesc=false