对数据类型的理解及自动装箱拆箱等

   首先先引入数据类型与其包装类,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来创建的,int a=1;

Java是一个面向对象的语言,所有事物全都是对象,
所以尽管引进了基本数据类型,还是对他们进行了包装。
这就是对应的包装类型。Integer a=new Integer("1");

关于String


注意的是String不是基本数据类型却可以直接String a="a";来赋值,jvm会自动帮你实例化。

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是因为不用new创建时b直接指向之前已经存在的"abc",
而new出来的全都是新的地址,所以都不相等。
多说几句,String a="asd"创建了一个对象,"asd"储存在常量池。
此后面如果String b="asd";并不会创建对象,因为"asd"在常量池里已经存在了。所以a,b指向的都是同一个对象,因此相等。
简单说,常量池里创建的对象只会创建一次,堆内存里可以创建多次new String()对象。
容易理解,如
String c=new String("asd");
String d=new String("asd");
创建了两个new String()在堆内存中,而常量池中的"asd"只创建了一个,被两个new String()对象同时指向。

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


这其中最常用的是拿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;

如有错误,感谢指出,写这篇博客之前其实我也不明确其中区别,
单纯的想搞明白这个问题去查资料,然后开了一个测试类测试,越写越明白。
写博客真的可以增长很多知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值