Java Integerとintタイプ変数の2つの等しい比較

2260 ワード

ここでは、Javaの基本的なタイプと対応するパッケージ間の自動分解と梱包について知っていると仮定します.しかし,ここで強調するのは,自動的な解体と箱詰めは,コンパイラがクラスのバイトコードを生成する際に適切なメソッド呼び出しを挿入して実現することである.つまり、classファイルを逆コンパイルして、コンパイラが自動梱包と解体を実現するためにどのような適切な方法を挿入しているかを見ることができます.例を見てみましょう
public class Test {
	public static void main(String[] args) {
		int i1 = 1;
		int i2 = 1;
		Integer integer1 = new Integer(1);
		Integer integer2 = new Integer(1);
		
		System.out.println(i1 == i2);// true
		// integer1  
		System.out.println(i1 == integer1);// true
		// i  
		System.out.println(integer1.equals(i1));// true
		//          
		System.out.println(integer1 == integer2);// false
		//        
		System.out.println(integer1.equals(integer2));// true
		
		//         boolean、byte、char <= 127,   
		// -128~127   short int         ,   
		//  ,                
		Integer integer3 = 10;
		Integer integer4 = 10;
		System.out.println(integer3 == integer4); // true
		
		Integer integer5 = 1000;
		Integer integer6 = 1000;
		System.out.println(integer5 == integer6); // false
	}
}

実行結果は次のとおりです(クラスにもマークアップがあります).
true true true false true true上記の例でこのような結果が明らかになったら、下を見る必要はありません.疑問がある場合は、このクラスで生成されたclassファイルの逆コンパイルファイルの内容を見ることができます.
import java.io.PrintStream;

public class Test
{
  public static void main(String[] args)
  {
    int i1 = 1;
    int i2 = 1;
    Integer integer1 = new Integer(1);
    Integer integer2 = new Integer(1);
    
    System.out.println(i1 == i2);
    
    System.out.println(i1 == integer1.intValue());
    
    System.out.println(integer1.equals(Integer.valueOf(i1)));
    
    System.out.println(integer1 == integer2);
    
    System.out.println(integer1.equals(integer2));
    



    Integer integer3 = Integer.valueOf(10);
    Integer integer4 = Integer.valueOf(10);
    System.out.println(integer3 == integer4);
    
    Integer integer5 = Integer.valueOf(1000);
    Integer integer6 = Integer.valueOf(1000);
    System.out.println(integer5 == integer6);
  }
}

ついでにIntegerクラスのequalメソッドを示します.
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
           // value              
           return value == ((Integer)obj).intValue();
        }
        return false;
    }

今はすべてがはっきりしているはずだ.