JAvaにおけるStringオブジェクトの==とequalsメソッド


まずコードを見てみましょう.

  
  
  
  
  1. package com.anjoyo.test; 
  2.  
  3. public class TestString { 
  4.         public static void main(String[] args) { 
  5.                 String s1="abc"
  6.                 String s2="abc"
  7.                 String s3=new String("abc"); 
  8.                 String s4=new String("abc"); 
  9.                 String s5="abcd"
  10.                 String s6=s1+"d"
  11.                 String s7="abc"+"d"
  12.                 System.out.println(s1==s2); //true 
  13.                 System.out.println(s1.equals(s2));//true 
  14.                 System.out.println(s3==s4);//false 
  15.                 System.out.println(s3.equals(s4));//true 
  16.                 System.out.println(s5==s6);//false 
  17.                 System.out.println(s5==s7);//true 
  18.     } 

まず、Stringは8の基本データ型ではなく、参照データ型であることを明確にしなければならない.Stringオブジェクトを作成するには、次の2つの方法があります.
1. String s = "abc";この賦値は実は3つのステップに分かれている.
   Step 1:文字列プールでabcの値を持つオブジェクトがあるかどうかを探します.ここで定数プールの概念があります.定数プールとは、コンパイル中に決定され、コンパイルされた.classファイルに保存されたインタフェース、クラスの定数、文字列定数、すなわち文字列プールを含むデータの一部です.
   Step 2:あれば,その像への参照をsに割り当てるので,ここでのs 2とs 1は同じオブジェクトを指す.
   Step 3:ない場合はabcの値を持つオブジェクトを作成し、そのオブジェクトの参照をプールに存在させ、sに割り当てます.
ここでのs 1とs 2はいずれも文字列定数であり、それらはコンパイル中に決定されるので、s 1=s 2はtrueであり、s 7は2つの文字列定数の和であるため、文字列定数でもあるため、s 5=s 7の結果もtrueである.
2. String s = new String("abc");この付与方式は文字列プールとは関係なく,毎回構築方法の新規オブジェクトを呼び出す.したがってs 3,s 4は==で比較するとfalseとなり,文字列中のequalsは文字列の内容が等しいか否かを比較するのでs 3.equals(s 4)はtrueとなる.
 
一般に,基本データ型比較には==を用い,参照データ型比較にはequalsを用いる.