默认值
|
存储需求(字节)
|
取值范围
|
示例
| |
byte
|
0
|
1
|
-2^7—2^7-1
|
byte b=10;
|
char
|
‘ \u0000′
|
2
|
0—2^16-1
|
char c=’c’ ;
|
short
|
0
|
2
|
-2^15—2^15-1
|
short s=10;
|
int
|
0
|
4
|
-2^31—2^31-1
|
int i=10;
|
long
|
0
|
8
|
-2^63—2^63-1
|
long o=10L;
|
float
|
0.0f
|
4
|
-2^31—2^31-1
|
float f=10.0F
|
double
|
0.0d
|
8
|
-2^63—2^63-1
|
double d=10.0;
|
boolean
|
false
|
1
|
true\false
|
boolean flag=true;
|
自动装箱与拆箱
Integer a=new Integer(1);
Integer b=1;
Integer c=Integer.valueOf(1);
System.out.println(""+(a == b)+(a == c)+(b == c));
输出结果为 false,false,true。
说明:只要是new出来的对象,不管前后位置,用 == 比都是比较引用,都为false.
下列 java 程序输出结果为______。
1
2
3
4
|
int
i=
0
;
Integer j =
new
Integer(
0
);
System.out.println(i==j);
System.out.println(j.equals(i))
|
i==j ,这个是基本类型与 Integer 的比较,j会自动拆箱成int类型,然后比较的是值。因此返回真。
j.equals(i) ,调用 equals 方法后,这个i会自动装箱成Integer类型,然后再比较值,所以也返回真。
首先看一段代码(使用JDK 5),如下:
输出结果:
The Java Language Specification, 3rd Edition 写道:
查看jdk源码,如下:
这儿的IntegerCache有一个静态的Integer数组,在类加载时就将-128 到 127 的Integer对象创建了,并保存在cache数组中,一旦程序调用valueOf 方法,如果i的值是在-128 到 127 之间就直接在cache缓存数组中去取Integer对象。若为new关键字,则在heap中开辟了一块新内存放置Integer对象,其应用不指向cache数组。
再看其它的包装器:
- Boolean:(全部缓存)
- Byte:(全部缓存)
- Character(<= 127缓存)
- Short(-128 — 127缓存)
- Long(-128 — 127缓存)
- Float(没有缓存)
- Doulbe(没有缓存)
同样对于垃圾回收器来说:
这里的代码不会有对象符合垃圾回收器的条件,这儿的i虽然被赋予null,但它之前指向的是cache中的Integer对象,而cache没有被赋null,所以Integer(100)这个对象还是存在。
而如果i大于127或小于-128则它所指向的对象将符合垃圾回收的条件: