对基本数据类型及自动拆箱、自动装箱的理解

来源:互联网 发布:知乎大学生推荐书单 编辑:程序博客网 时间:2024/06/02 21:35
首先先引入数据类型与其包装类,Java是一个面向对象的语言,可是为了编程方便,依旧引入了数据类型。
- 原始类型:boolean,char,byte,short,int,long,float,double 
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

基础类型和包装类型的区别

基本数据类型里面只是个赋值,其存储在栈内存,存取速度快。
int a =1;
int b=a;
只是把a的值传递给b。并不存在什么地址。
所以基本数据类型不是用new来创建的。new储存的对象会在堆内存中开辟一个地址。

Java是一个面向对象的语言,万物皆为对象
所以尽管引进了基本数据类型,还是对他们进行了包装。
所以引出了其对应的包装类型。Integer a=new Integer("1");

关于String

String不是基本数据类型却可以直接String a="a";来赋值,其原因是String类比较特殊,所以jvm内部会自动实例化。

对String的比较

String a="asd";
String b="asd";
String c=new String("asd");
String d=new String("asd");
a==b;true;
c==d;false;
a==c;false
a==b是因为asd在创建时被储存在常量池或者说字符缓冲区,b创建asd时会先去找是否存在该对象,若存在,则指向它。

而new出来的地址,不管和谁相比较都为false,因为new会在堆内存中开辟一个新的地址,==比较的是对象的地址。


诸如String a="asd"创建了一个对象"asd"被储存在常量池。

又诸如

String a=new String("asd");创建了两个对象

String b=new String("asd");此时只创建了一个对象,因为asd在内存中已经存在了。简单说,常量池里创建的对象只会创建一次,堆内存里开辟的是地址,所以堆内存对象虽然是,但是他们指向可能相同。

关于数据类型与其包装类的比较

这其中最常用的是拿int和Integer进行比较,关注这个问题是在杭州的第一次面试,面试官问到了这方面的问题。

举个例子,比如Integer默认值为null而int默认值为0。

原因就很简单了,Integer是一个Java对象,所以默认值为null,而int是数据类型,它的默认值为0。

引出关于数据类型的默认值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
boolean false

自动装箱和拆箱

装箱就是 自动将基本数据类型转换为包装器类型,

拆箱就是 自动将包装器类型转换为基本数据类型。

比如在Integer和int的比较上,

Integer a=128;

Integer b=new Integer("128");

int c=128;

a==c;true

b==c;true

这是因为拿Integer和int进行比较时,Integer会自动拆箱成int,
所以在与int的任何比较上,比较的只是数据类型,也就是比较大小。
在上述Integer a=128;
这里用到了装箱,128是数据类型被自动装箱成Integer类型。
其中的过程是
Integer a=Integer.valueOf(128);
同理
Integer a=128;
int b=a;
其中的过程是
int b = a.intValue();
而这些过程java会自动帮你处理,就是自动装箱和拆箱了。

我上述拿128举例是想说明一个问题
Integer a=128;
Integer d=128;
a==d;false;

Integer a=127;
Integer d=127;
a==d;true;

这个问题换一方面看就很简单了,如
String a="asd";
String b="asd";
a==b;为true;这是因为第二次引用asd是会从已存在的常量池里取出。
而Integer 也是这样,可是他的范围是【-128,127】才会存在缓存,所以当Integer超过127就不存在缓存。

再通俗的说,int a=100;Integer b=100;
a持有的100是整数的值。而b的100,是指向了常量池中的100。
Integer会在常量池里开辟一个100的对象,而堆数据类型int不会,a=100存在了栈内存。

另:new出来的任何,都会在堆内存里开辟新空间,所以==都为false;

如有错误,感谢指出,写这篇博客之前其实我也不明确其中区别,
单纯的想搞明白这个问题去查资料,然后开了一个测试类测试,越写越明白。
阅读全文
0 0
原创粉丝点击