テスト1:
まず、文字列型の比較のセットを見てみましょう。これ以上苦労せずに、コードを入力するだけです。
public class test {public static void main(string [] args){string a = "java Book Garden";文字列B = "Java Book Garden";文字列c = new String( "Java Book Garden");文字列d = new String( "Java Book Garden")。インターン(); if(a == b){system.out.println( "a == b"); } else {system.out.println( "a!= b"); } if(a.equals(b)){system.out.println( "a.equals(b)"); } else {system.out.println( "!a.equals(b)"); } if(a == c){system.out.println( "a == c"); } else {system.out.println( "a!= c"); } if(a.equals(c)){system.out.println( "a.equals(c)"); } else {system.out.println( "!a.equals(c)"); } if(a == d){system.out.println( "a == d"); } else {system.out.println( "a!= d"); } if(a.equals(d)){system.out.println( "a.equals(d)"); } else {system.out.println( "a.equals(d)"); }}}出力結果:
a == ba.equals(b)a!= ca.equals(c)a == da.equals(d)
要約:
結果A == B:プログラムが実行されているとき、文字列バッファープールが作成されます。文字列a = "Java Book Garden"、「Java Book Garden」が弦バッファープールに配置されると。文字列b = "Java Book Garden"が文字列を作成すると、プログラムはまずこのストリングバッファープールで同じ値のオブジェクトを探します。したがって、Bが作成されると、プログラムは同じ値を持つAを見つけ、Aで参照されるオブジェクトを参照します。したがって、aとbは同じオブジェクトを参照するため、a == b。
その結果、a!= c:string c = new String( "Java Book Garden")新しいオブジェクトが新しいオブジェクトであるため、文字列バッファープールから検索されず、新しいオブジェクトを直接作成します。 a!= c。
結果A == D:Internメソッドが呼び出されると、プールにこの文字列オブジェクトに等しい文字列が既に含まれている場合(オブジェクトはequals(オブジェクト)メソッドによって決定されます)、プール内の文字列が返されます。それ以外の場合は、この文字列オブジェクトをプールに追加し、この文字列オブジェクトへの参照を返します。すべてのdはaのオブジェクトを呼び出します。
等しい値は値を比較するため、値が同じ場合、それらは等しくなります。
テスト2:
以下は、一連のINTタイプと整数タイプのテストです。
public class test {public static void main(string [] args){int a = 127; int a1 = 127; int b = 128;整数C = 127;整数C1 = 127;整数D = 128;整数D1 = 128; if(a == a1){system.out.println( "a == a1"); } else {system.out.println( "a!= a1"); } if(b == b1){system.out.println( "b == b1"); } else {system.out.println( "b!= b1"); } if(c == c1){system.out.println( "c == c1"); } else {system.out.println( "c!= c1"); } if(d == d1){system.out.println( "d == d1"); } else {system.out.println( "d!= d1"); }}}出力結果:
a == a1b == b1c == c1d!= d1
結果「a == a1」および「b == b1」:intは基本タイプであり、値は直接保存されますが、整数はオブジェクトであり、参照を持つこのオブジェクトを指します。比較のほとんどは、「a == a1」と「b == b1」で作られています。
結果「c == c1」と「d!= d1」には、なぜ「d!= d1」という質問があるかもしれません。整数のソースコードを一緒に見てみましょう。
/** * JLSが要求する * -128と127(包括的)の間の値のオブジェクトIDセマンティクスをサポートするキャッシュ。 * *キャッシュは、最初の使用法で初期化されます。キャッシュ *のサイズは、-xx:autoboxcachemax = <size>オプションによって制御できます。 * VMの初期化中、java.lang.integer.integercache.highプロパティ *は、 * sun.misc.vmクラスのプライベートシステムプロパティで設定および保存できます。 */ private static class integercache {static final int low = -128;静的な最終int high;静的最終整数キャッシュ[]; static {//高い値は、プロパティint h = 127で構成できます。 string integercachehighpropvalue = sun.misc.vm.getSavedProperty( "java.lang.integer.integercache.high"); if(integercachehighpropvalue!= null){int i = parseint(integercachehighpropvalue); i = math.max(i、127); //最大配列サイズはinteger.max_value h = math.min(i、integer.max_value-(-low)-1); } high = h; cache = new Integer [(high -low) + 1]; int j = low; for(int k = 0; k <cache.length; k ++)cache [k] = new Integer(j ++); } private integercache(){}} /** *指定された * {@code int}値を表す{@code integer}インスタンスを返します。新しい{@code integer}インスタンスが必要ない場合、この方法は一般に * @link #integer(int)}を優先して使用する必要があります。 * *この方法は、常に-128〜127、 *包括的で範囲の値をキャッシュし、この範囲外の他の値をキャッシュする場合があります。 * * @param i an {@code int}値。 * @return {@code integer}インスタンス{@code i}を表すインスタンス。 * @since 1.5 */ public static integer valueof(int i){assert integercache.high> = 127; if(i> = integercache.low && i <= integercache.high)return integercache.cache [i +(-integercache.low)];新しい整数(i)を返します。 }結論:ここで、整数は[-128,127]の一定のプールを初期化します。値がこの範囲にある場合、同じオブジェクトが参照されます。この範囲にない場合、返された新しいオブジェクトが次のとおりであることがソースコードから見ることができます。新しい整数(i)を返します。
したがって、結果「c == c1」は同じオブジェクトを指し、結果「d!= d1」は新しいオブジェクトを参照するため、異なります。