Javaの比較問題は、非常に基本的で混乱しやすいです。今日は、すべての人の勉強やインタビューに役立つことを期待して、いくつかのエラーが発生しやすいポイントのより詳細な要約と配置を要約して整理します。
1。==とequals()の違い
まず、== equals()の違いを知る必要があります。 ==記号は常にアドレス値と比較されます。基本的なデータ型の場合、==比較は実際に変数値が等しいかどうかですが、参照データ型の場合、アドレス値が比較されます。ここで特別な注意を払う必要があるのは文字列タイプです。これは、当たり前の==で簡単に取ることができ、間違いを犯すのが簡単です。 equals()メソッドは、オブジェクトクラスのメソッドです。 Javaのすべてのクラスがデフォルトでオブジェクトクラスを継承することを知っているため、クラスオブジェクトにはequals()メソッドがあります。オブジェクトクラスのequals()メソッドを以下の図に示します。
ソースコードからわかるように、オブジェクトクラスのequals()メソッドの基礎となるレイヤーも==を使用するため、実際にはアドレス値です。したがって、他の比較にequals()メソッドを使用する場合は、equals()メソッドをオーバーライドする必要があります。
2。基本的なデータ型とパッケージングタイプ
私たちは皆、バイト、ショート、イント、ロング、ブール、チャー、ダブル、フロートが基本的なデータ型であり、宣言する変数がスタックメモリに保存されることを知っています。対応するパッケージングタイプ(バイト、ショート、整数、長い、ブール、文字、二重)によって定義される変数は、ヒープメモリに存在します。基本的なデータ型の場合、それらの比較は比較的単純です。つまり、==を使用して等しいかどうかを判断し、サイズを比較するために<、>、<=、> =を使用します。しかし、パッケージングタイプの場合、それは少し異なります。
まず、それが等かどうかを判断するために、次のコードの実行結果を参照してください。
パッケージデイリーテスト;インポートorg.junit.test;/*** java* @author yrr*/public class javacomparetest {/***整数型判断は等しい*/@test public void test01(){int n3 = 48; System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- n8); // false system.out.println(n7 == n3); System.out.println("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- system.intvalue()== n2.out.println( "); // true system.out.println(n5)); // println(n6)); /***長いタイプの判断は等しい*/@test public void test02(){//ここでは、長い定義を使用する場合、lまたはlは必要ありませんが、長い使用の場合、エラーが報告されます//構造でそれを追加して、長いn3 = 48l; System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- n1); System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- system.out.out.println(n4.equals(n5)); // long.intvalue()メソッドを使用する場合、nullpointexceptionを防ぐためにnullであるかどうかを確認するために注意する必要があります}}}上記の実行結果については、次の説明が行われます。
まず、新しい方法では、整数または長いオブジェクトを宣言します。新しいオブジェクトはヒープ内のスペースを開くため、2つの値が同じであっても、==の場合、アドレス値が比較されるため、Falseが返されます。基本データ型のラッパークラスの場合、equals()メソッドが書き換えられ、数値サイズが比較されるため、equals()メソッドを使用して数値サイズに基づいて判断できます。整数変数をINT変数と比較する問題に関して、比較値は数値サイズにも基づいていることがわかります。これは、比較すると、整数タイプが自動的にボックス化され、INTタイプに変換されるためです。最初の3つのポイントの説明は、すべてのパッケージングタイプに適用できます。直接割り当て方法の場合、値48の2つの整数変数は==記号によって真であると判断されますが、値が128の場合、それは偽です。これは、整数n1 = 48;の下部にあるため、直接割り当ての方法は実際にinteger.value()メソッドを呼び出すためです。下の図に示すように、integer.value()メソッドのソースコードを簡単に見ることができます。
ここにはIF判断があることがわかります。入力Iが[-128、127]の範囲内にある場合、IntegerCacheアレイから直接返されます。したがって、この範囲の値については、この配列に対応するアドレス値が返されるため、==サインを使用してtrueを審査することが返されます。この範囲内にないのは新品のオブジェクトであるため、Falseが返されます。この結論は、バイト、ショート、整数、および長いタイプに当てはまります(興味がある場合は、対応する値()メソッドのソースコードを確認できます)。バイトタイプの範囲は[-128、127]であるため、バイトタイプの場合、==を使用することはequals()と違いはありません。
サイズの比較のために、>、<、<=、> =を使用して問題はありません。それらは自動的にボックス化されていません。ただし、通常、次の2つの方法を使用してサイズを比較することをお勧めします。
xxxvalue()メソッドを呼び出して、比較のために基本データ型に変換します。ラッパークラスでは、CompareTo()メソッドが書き換えられます。 CompareTo()ソースコードを見ると、実際には、基礎となる使用法が、自動的にボックス化して比較することにより、対応する基本データ型に変換されることがわかります。
2。Javaオブジェクトの比較
上記の紹介では、オブジェクトを比較する方が簡単です。原則は同じです。
1。文字列タイプの比較
文字列タイプは直接>、<=、> =、および<を使用できず、コンパイルの例外を報告することに注意する必要があります。
パッケージDailyTest; Import org.junit.test;/*** java* @author yrr*/public class javacomparetest {@test public void test03(){string s1 = new String( "123");文字列s2 = new String( "123"); System.out.println(s1 == s2); // false system.out.println(s1.equals(s2));文字列S3 = "234";文字列S4 = "234"; System.out.println(s3 == s4); // true System.out.println(s3.equals(s4)); // true //system.out.println(S1 <= s3); //オペレーター<は、引数タイプに定義されていますjava.lang.string、java.lang.string system.out.println(s1.compareto(s3)<0); //真実 }}2。クラスオブジェクトの比較
クラスオブジェクトの結論は同じですが、基本的なデータ型と文字列型と比較すると、もう少し複雑です。
特定のルールによれば、2つのオブジェクトが等しいかどうかを判断するには、equals()メソッドを審査されたクラスで書き換える必要があります。例コードは次のとおりです。
Package DailyTest; Import org.junit.test;/*** java* @author yrr*/public class javacomparetest {@test public void test04(){person p1 = new person( "yrr"、18);人P2 =新しい人( "yrr"、18); System.out.println(p1 == p2); // false system.out.println(p2.equals(p1)); // true}} class person {private string name;民間整数年齢; public Person(){} public Person(string name、integer age){this.name = name; this.age = age; } public string getname(){return name; } public Integer getage(){return age; } @Override public boolean equals(object obj){person person =(person)obj; return name.equals(person.getname())&& age.equals(person.getage()); }}また、2つのオブジェクトのサイズを比較したい場合(これも一般的なインタビューの質問です)、2つの方法があります。
比較可能なクラスは、比較可能なインターフェイスを実装し、比較()メソッドをオーバーライドして比較インターフェイスを実装するクラスを定義するか、内部クラスを使用して比較()メソッドをオーバーライドします。前者は比較可能なクラスで定義され、後者は比較可能なクラスの外側に定義されます。この違いにより、2つの利点と短所も明らかです。前者は単純ですが、比較クラスの変更が必要ですが、後者はより柔軟な元のコードを変更する必要はありません。
最初の方法、サンプルコードは次のとおりです。
Package DailyTest; Import org.junit.test;/*** java* @author yrr*/public class javacomparetest {@test public void test5(){person p1 = new person( "yrr"、18);人P2 =新しい人( "wx"、19); System.out.println(p1.compareto(p2)<0); }}クラスの人は、比較可能な<パーソン> {private string name;民間整数年齢; public Person(){} public Person(string name、integer age){this.name = name; this.age = age; } public Integer getage(){return age; } @Override public int compareto(person o){return this.getage() - o.getage(); }}2番目の方法、サンプルコードは次のとおりです。
パッケージコンパレータ;インポートJava.util.arrays; Import Java.util.comParator; public class myComparator {public static void main(string [] args){user = users = new user( "u1001"、25)、new user( "u1002"、20)、newユーザー( "U1003"、21)}; arrays.sort(users、new Comparator <user>(){@override public int Compare(user o1、user o2){return o1.getage() - o2.getage();}}); for(int i = 0; i <users.length; i ++){user user = users [i]; System.out.println(user.getId() + "" + user.getage()); }}} class user {private string id;プライベートインクエイジ; public user(string id、int age){this.id = id; this.age = age; } public int getage(){return age; } public void Setage(int age){this.age = age; } public string getId(){return id; } public void setid(string id){this.id = id; }}上記は、今回お話ししたJava比較の質問の関連コンテンツです。他の質問がある場合は、以下のコメント領域で説明できます。ご支援ありがとうございます。