基本概念
字节的单位: byte。位的单位: bit
1byte=8bit
8种基本数据类型
4种整型
2种浮点类型.
1种用于表示Unicode编码的字符单元的字符类型
1种用于表示真值的boolean类型。
数据类型 | 浮点型大小(占字节数,2的几次方) | 范围 | 默认值 | 包装器类型 |
---|---|---|---|---|
byte(字节) | 8 | -128 -127 | 0 | Byte |
shot(短整型) | 16 | -32768 - 32768 | 0 | Short |
int(整型) | 32 | -2147483648-2147483648 | 0 | lnteger |
long(长整型) | 64 | -9233372036854477808-9233372036854477808 | 0 | Long |
float(浮点型) | 32 | -3.40292347E+38-3.40292347E+38 | 0.0f | Float |
double(双精度) | 64 | -1.79769313486231570E+308-1.79769313486231570E+308 | 0.0d | Double |
char(字符型) | 16 | \u0000-\uffff | \u0000 | Character |
boolean(布尔型) | 1 | true/false | false | Boolean |
包装类
包装类即使把基本类型变成对象类型,包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
包装类转换关系
- 基本类型 -> 包装器类
lnteger obj=new lnteger(10); - 包装器类 -> 基本类型
int num=obj.intValue(); - 字符串 -> 包装器类
lnteger obj=new lnteger(“100”); - 字符串 -> 基本类型
int num=lnteger.parselnt(“-45.36”);
自动装包/拆包(Autoboxing/unboxing)
基本类与包装类的转换。则是装包与拆包
自动装包/拆包大大方便了基本类型数据和它们包装类地使用。
自动装包:基本类型自动转为包装类.(int >> Integer)
自动拆包:包装类自动转为基本类型.( Integer >> int)
int是基本类型,直接存储数值
lnteger是对象类, new一个对象时用一个引用指向这个对象Java把内存划分成两种:一种是栈内存、另一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,而实际的对象是在存储堆内存中
比如:
int i= 10
:直接在栈中分配空间
Integer j = new Integr(5)
:对象是在堆内存中,而j(引I用变量)是在栈内存中
在堆中分配的内存、由java虚拟机的白动垃圾回收器来管理。
因为在堆中分配空间所需的时间远大于从栈中分配存储空间。
什么是装箱?什么是拆箱?
在Java SE5之前,如果要生成一个数值为10的Integer对象.必须这样进行:
lnteger i = new Integer(10)
而在从Java SE5开始就提供了自动装箱的特性.如果要生成一个数值为10的Integer对象,只需要这样就可以了:
Integer i = 10
这个过程中会自动根据数值创建对应的Integer对象,这就是装箱。
那什么是拆箱呢?顾名思义,跟装箱对应,就是自动将包装器类型转换为基本数据类型;
Integer i = 10; //装箱
int n = i;//拆箱
简单一点说.装箱就是自动将基本数据类型转换为包装器类型:拆箱就是自动将包装器类型转换为基本数据类型。
相关面试题
1.下面这段代码的输出结果是什么?
@Test
public void test(){
Integer i1=100;
Integer i2=100;
Integer i3=200;
Integer i4=200;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
答案
true
false
在通过valueOI方法创建lnteger对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的integer对象。
上面的代码中i1和2的数值为100,因此会直接从cache中取已经存在的对象,所以1和i2指向的是同一个对象,而i3和4则是分别指向不同的对象。
2.下面这段代码的输出结果是什么?
@Test
public void test2(){
Double i1=100.0;
Double i2=100.0;
Double i3=200.0;
Double i4=200.0;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
答案
false
false
在这里只解释一下为什么Double类的valueO方法会采用与Integer类的valueOf方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,而浮点数却不是。
注意:Integer、Short、Byte、Character、Long这几个类的valueOt方法的实现是类似的。
Double、Float的valueOf方法的实现是类似的。