Java梱包と解体

2680 ワード

どうして箱詰めするの?
Javaには基本データ型があり、基本データ型はクラスの範疇に属していないことはよく知られています.しかし、場合によっては、例えば、汎用設計の場合、汎用はObjectタイプのみであり、例えばリストでは、TはObjectとObjectのサブクラスでなければならない.リストにint値を格納したい場合、リストは合法ではありません.このような問題を解決するために、箱詰めの概念があります.この場合、基本データ型に対応するクラスが必要です.Integerを例に挙げます.
class Integer{
    int i;
    
    Integer(int i){
        this.i = i;
    }
    
    int intValue(){
        return i;
    }
}

リストにIntegerオブジェクトを格納すると,リストセットにint数値を格納する目的に間接的にヒットする.
どうして箱を分解するの?
解体と梱包は対応しており,基本データ型を操作するために梱包しているが,実際に使用する際に注目しているのは彼の数値である.たとえば、リスト内のデータをソートする必要がある場合、要素ごとに必ずサイズを比較する必要があります.この場合、各Integerオブジェクトが表す数値を取得する必要があります.この取得数値プロセスは、ボックスを取り外すプロセスです.
梱包と自動梱包
Integer i1 = new Integer(1);//  
Integer i2 = 1;//    

いずれの方法でも箱詰めが可能である.すなわち、int値1に対応するIntegerタイプのオブジェクトが見つかった.自動梱包は実はJavaが自動的に梱包プロセスを完了することを祈っています.自動梱包は私たちのコードを簡略化し、コードをより簡潔で直感的にします.
解体と自動解体
    Integer i = 1;//    
    int n = i;//    
    int m = i.intValue();//  

知識が多い
  • byte、short、int==自動==梱包の場合、数値が[-128127]の値範囲内であれば、梱包によって新しいオブジェクトが作成されず、メモリに予め作成されたオブジェクトが直接多重化されます.手動で梱包すると、毎回新しいオブジェクトが生成されます.
  • Integer l = new Integer(1);
    Integer m = 1;
    Integer n = 1;
    System.out.println(l == m);//false
    System.out.println(m == n);//true
    

    梱包値がこの範囲内でない場合、異なるオブジェクトが作成されます.
    Integer m = 200;
    Integer n = 200;
    System.out.println(m == n);//false
    System.out.println(m.equals(n));//true
    
  • boolean、char自動箱詰め多重メモリ内のオブジェクト.
  • Boolean b1 = true;
    Boolean b2 = true;
    Boolean b3 = true;
    System.out.println(b1 == b2);//true
    System.out.println(b1.equals(b2));//true
    System.out.println(b2 == b3);//false
    System.out.println(b2.equals(b3));//true
    
    Character c1 = 'A';
    Character c2 = 'A';
    System.out.println(c1 == c2);//true
    System.out.println(c1.equals(c2));//true
    
  • float、double、long自動梱包では、毎回異なるオブジェクトが作成されます.
  • Float f1=1.0f;
    Float f2=1.0f;  
    System.out.println(f1 == f2);//false
    System.out.println(f1.equals(f2));//true
    
  • パッケージタイプequals比較コンテンツを行う場合、同じタイプでない場合falseを返します.
  • Float f = 1.0f;
    Double d = 1.0;
    System.out.println(f.equals(d));//false
    

    なぜなら,パッケージタイプのequalsメソッドは,コンテンツを比較する前に同じタイプに属するか否かを先に判断し,Floatのequalsメソッドを例にとるからである.
    public boolean equals(Object obj) {
         return (obj instanceof Float)&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
    }
    
  • 梱包および解体操作は、基本データ型のみに適用され、以下のコードは梱包および解体ではありません.
  • String s1 = new String("a");
    String s2 = "a";
    String s3 = s1;
    String s4 = s2.toString();