java中==及びequals方法の使い方について話します。

5565 ワード

equals方法はjava.lang.Object類の方法です。
二つの用法説明があります。
(1)文字列変数に対して、「=」と「equals()」を使って文字列を比較する場合、その比較方法は異なります。
"="は、2つの変数自体の値を比較します。つまり、2つのオブジェクトのメモリの先頭アドレスです。
「equals()」は文字列に含まれる内容が同じかどうかを比較します。
たとえば:

String s1,s2,s3 = "abc", s4 ="abc" ;
s1 = new String("abc");
s2 = new String("abc");
では、

s1==s2    false   //            ,               ,    。
s1.equals(s2)   true  //            abc,   。
注意(1):
もし:          StringBuffer s1 = new StringBuffer("a");                      StringBuffer s2 = new StringBuffer("a");結果:          s1.equals(s2) // false説明:
StringBuffer類ではequalsを再定義していないので、この方法はObject類から来ています。Object類のequals方法は「住所」を比較するために用いられています。だからfalseに等しいです。
注意(2):
s 3とs 4はちょっと違っていますので、注意してください。s 3とs 4は2文字です。
シリアル定数で生成された変数は、格納されているメモリアドレスが等しくなります。
ですからs 3==s 4はtrueです。(s 3=s 4がなくても)
(2)非文字列変数に対しては、「=」と「equals」の方法の役割は同じで、そのオブジェクトがスタックメモリにある最初のアドレスを比較するために用いられます。つまり、2つの参照変数が同じオブジェクトを指すかどうかを比較するために使用されます。
たとえば:


class A
{
   A obj1  =  new A();
   A obj2  =  new A();
}
じゃ、Obj 1=obj 2はfalseです。            obj 1.equals(obj 2)はfalseです。
しかしこのように付け加えますと:obj 1=obj 2;
では  obj 1==obj 2  trueです          obj 1.equals(obj 2)はtrueです。
つまり、equals方法は文字列に対して内容を比較し、文字列ではなく対象が同じかどうかを比較するものである。
 == 比較符も対象が同じかどうか、つまり対象がメモリの先頭アドレスです。
Stringクラスでequalsという方法を再定義し、アドレスではなく値を比較した。だからtrueです
equalsと==の違いについては、以下のいくつかの点から:
(1)基本タイプと比較すると、=でしか比較できないので、equalsは使えません。
たとえば:

public class TestEquals {
	public static void main(String[] args) 
	{
		int a = 3;
		int b = 4;
		int c = 3;
		System.out.println(a == b);
		//   false 
		System.out.println(a == c);
		//   true 
		System.out.println(a.equals(c));
		//  ,      ,equals   
		//            
	}
}
(2)Boolean、Charcter、Bytte、Shot、Integer、Long、Float、Doubleなどの基本タイプの包装変数については、=比較アドレスであり、equalsは比較内容である。たとえば:

public class TestEquals {
	public static void main(String[] args) 
	{
		Integer n1 = new Integer(30);
		Integer n2 = new Integer(30);
		Integer n3 = new Integer(31);
		System.out.println(n1 == n2);
		//   false      Integer  ,      , 
		System.out.println(n1 == n3);
		//     new Integer(30)  new Integer(31)      false 
		System.out.println(n1.equals(n2));
		//   true   jdk      ,n1 n2             ,  30, equals      true 
		System.out.println(n1.equals(n3));
		//   false         ,   30   31
	}
}
これはIntegerの例です。他の場合はDouble、Charcter、Floatなども同じです。
(3)String(文字列)、StrigBuffer(スレッドセキュリティの可変文字列)、StrigBuider(可変文字列)の3つのカテゴリーについてさらに説明する。
(a)まず、Stringの使い方を紹介します。以下の例を見てください。

public class TestEquals {
	public static void main(String[] args) {
		String s1 = "123";
		String s2 = "123";
		String s3 = "abc";
		String s4 = new String("123");
		String s5 = new String("123");
		String s6 = new String("abc");
		System.out.println(s1 == s2);
		//(1)true 
		System.out.println(s1.equals(s2));
		//(2)true 
		System.out.println(s1 == s3);
		//(3)flase 
		System.out.println(s1.equals(s3));
		//(4)flase 
		System.out.println(s4 == s5);
		//(5)flase 
		System.out.println(s4.equals(s5));
		//(6)true 
		System.out.println(s4 == s6);
		//(7)flase 
		System.out.println(s4.equals(s6));
		//(8)flase 
		System.out.println(s1 == s4);
		//(9)false 
		System.out.println(s1.equals(s4));
		//(10)true
	}
}
s 1とs 2はそれぞれ文字列定数123によって作成されたオブジェクトを指しています。定数プールでは、オブジェクトは一つしかありません。内容は123で、2つの参照s 1とs 2がこのオブジェクトを指しています。したがって、この2つの参照変数は同じアドレスを指しています。したがって、(1)での移動結果はtrueであり、s 1.equals(s 2)s 1とs 2を比較した対象の内容が等しいかどうかは分かりますが、この2つのオブジェクトの内容はすべて文字列定数123であることを知っています。したがって、(2)での運転結果はtrueです。同じ方法で分析しても、s 1とs 3で指し示すオブジェクトは違っています。内容も違っています。したがって、マーキング(3)と(4)で実行した結果はfalseです。
s 4とs 5を見てください。この二つの参照変数は対象の内容は同じです。(内容は全部123です。)しかし、この二つのオブジェクトはnewオペレータで作成されたクラスです。メモリに二つの空間を割り当ててこの二つのオブジェクトに与えたので、この二つのオブジェクトのメモリアドレスは違っています。物語の二つの異なる対象は、マーク(5)のs 4=s 5で実行された結果はfalseです。ただし、内容は同じですので、(6)のs.4 equals(s 5)の運転結果はtrueです。同じように、s 4とs 6が指す対象アドレスは違っていて、内容も違っています。したがって、(7)(8)で動作結果はfalseとなります。
s 1とs 4はそれぞれ2つの異なる対象を指すので(このように呼ばれるのは、この2つの対象がメモリ中の住所が異なるため、対象が異なる)、(9)のs 1==s 4の運転結果はfalseであり、(10)のs 1.equals(s 4)の演算結果はtrueである。
(4)もう一つの状況を見て、まず一つの例を見ます。(この例はJavaプログラミング思想第三章の例です。)

class Value 
{
	int i;
}
public class EqualsMethod2 {
	public static void main(String[] args) {
		Value v1 = new Value();
		Value v2 = new Value();
		v1.i = v2.i = 100;
		System.out.println(v1.equals(v2));
		//(1)flase 
		System.out.println(v1 == v2);
		//(2)true
	}
}
運転結果の疑問:ちょっと見たところ、驚きました。どうしてtrueではないですか?equals方法は比較内容ですか?
正しいです。新しいクラスでequals方法をカバーすれば、内容を比較するために使えます。しかし、上記の例では、クラスValueはObjectのequalsメソッドをカバーしていないので、この方法を継承しています。したがって、アドレスを比較するために使用されています。またv 1とv 2のオブジェクトが同じではないので、(1)のv 1.equals(v 2)の実行結果はfalseと表記されています。
equalsと==の紹介はここまでです。もっといい説明や更新の説明があれば、よろしくお願いします。
締め括りをつける
以上は本論文でjava中==及びequals方法の使い方についての全部の内容を述べました。興味のある友達は引き続き当駅を参照してもいいです。JavaネットワークプログラミングのURL+URLconnectionの使用方法例、Javaスレッドの作成と実行方法紹介、java加復号RSAの使用方法コード例など、友達のサポートに感謝します。