Integerクラス
これは、パッケージのint型のクラスの基本的なデータ型であるクラスです。
基本的なAPI
Integerクラスと差int型
- ラッパークラスの整数intで、int型は、データの8つの基本タイプ(バイト、ショート、int型、長い、char型、float型、ダブル、ブール値)のうちの1つです
- 整数はint型は、基本データ型、デフォルト値は0である、このクラスは、デフォルト値がnullです。
- 整数は、オブジェクトへの参照点を持つオブジェクトを表し、INT値が直接格納されている、基本的なデータ・タイプです。
整数自動開梱と梱包
JDK1.5後に開梱自動および自動包装は多くのJavaシンタックスシュガーの中の1つである唯一の機能である、それが決定、コードの構文に基づいて、コンパイル時に実行され、生成されたクラスファイルされます操作を開梱して梱包するかどうか。
オートボクシング
一般的に、我々は、次のようなキーワードによる時間の新しいクラスを作成します。
Object obj = new Object();
しかし、Integerクラスのために、私たちが行うことができます。
Integer a = 128;
なぜ、このようにして、逆コンパイルツールによって、我々は、生成されたクラスファイルがあることがわかりますすることができます:
Integer a = Integer.valueOf(128);
この128は、整数クラスに解析され、基本的なデータ・タイプである、自動包装の基本データ・タイプです。
オートアンボクシング
整数データは、クラスに割り当てられる自動開梱の実装に、基本的なデータ型intを表します。
Integer a = new Integer(128);
int m = a;
生成されたクラスファイルを逆コンパイル:
Integer a = new Integer(128);
int m = a.intValue();
簡単に言えば:;自動アンパックがi.intValue()であるオートボクシングはInteger.valueOf(int型i)があります。
以下の質問を検討してください。
public static void main(String[] args) {
Integer i = 10;
Integer j = 10;
System.out.println(i == j);//true
Integer a = 128;
Integer b = 128;
System.out.println(a == b);//false
int k = 10;
System.out.println(k == i);//true
int kk = 128;
System.out.println(kk == a);//true
Integer m = new Integer(10);
Integer n = new Integer(10);
System.out.println(m == n);//false
}
私たちは、次のようにJADファイル、結果のコードは逆コンパイラを使用します。
public static void main(String args[])
{
Integer i = Integer.valueOf(10);
Integer j = Integer.valueOf(10);
System.out.println(i == j);
Integer a = Integer.valueOf(128);
Integer b = Integer.valueOf(128);
System.out.println(a == b);
int k = 10;
System.out.println(k == i.intValue());
int kk = 128;
System.out.println(kk == a.intValue());
Integer m = new Integer(10);
Integer n = new Integer(10);
System.out.println(m == n);
}
まず、私は10を=直接ステートメント整数、自動的に梱包は整数I = Integer.valueOf(10)となり、整数、私は自動的に(i.intValueを開梱されます)。
最初の印刷は真であります
私はjは==ために、我々はこれら2つのIntegerクラスであることを知っている、彼らはより多く使用されているイコールである必要があり、ここで==アドレスとの比較があり、その結果は間違いなく偽であるが、実際には、結果が真である、これはなぜですか?
私たちは、IntegerクラスのvalueOf()メソッドに次のコマンドを入力します。
分析源码我们可以知道在 i >= -128 并且 i <= 127 的时候,第一次声明会将 i 的值放入缓存中,第二次直接取缓存里面的数据,而不是重新创建一个Ingeter 对象。那么第一个打印结果因为 i = 10 在缓存表示范围内,所以为 true。
第二个打印结果为 false
从上面的分析我们知道,128是不在-128到127之间的,所以第一次创建对象的时候没有缓存,第二次创建了一个新的Integer对象。故打印结果为false
第三个打印结果为 true
Integer 的自动拆箱功能,也就是比较两个基本数据类型,结果当然为true
第四个打印结果为 true
解释和第三个一样。int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比较。
第五个打印结果为 false
因为这个虽然值为10,但是我们都是通过 new 关键字来创建的两个对象,是不存在缓存的概念的。两个用new关键字创建的对象用 == 进行比较,结果当然为 false。
测试一下:
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c == d);//true
System.out.println(e == f);//false
System.out.println(c == (a + b));//true
System.out.println(c.equals((a+b)));//true
System.out.println(g == (a+b));//true
System.out.println(g.equals(a+b));//false
System.out.println(g.equals(a+h));//true
反编译结果:
分析:
第一个和第二个结果没什么疑问,Integer类在-128到127的缓存问题;
第三个由于a+b包含了算术运算,因此会触发自动拆箱过程(会调用intValue方法),==比较符又将左边的自动拆箱,因此它们比较的是数值是否相等。
第五个对于 g == (a+b),首先计算 a+b,也是先调用各自的intValue方法,得到数值之后,由于前面的g是Long类型的,也会自动拆箱为long,==运算符能将隐含的将小范围的数据类型转换为大范围的数据类型,也就是int会被转换成long类型,两个long类型的数值进行比较。
同様+ bが最初に自動的に自動的に結果を開梱し、梱包します第g.equals(A + B)の場合、それが注目されているオペレータは変換を行わないに等しいです。だから、Long.equals(整数)で、当然の結果が偽であります
第g.equals(+さh)のため、オペレータは+型キャストし、各INT後のA + H +アンボクシングは、結果は長い長いさロング2ため、自動包装長い間、および長いです判決に等しいです。
終了:
追加するには、当分の間は~~~で綿密な研究の後、右を理解すると