对基本数据类型及自动拆箱、自动装箱的理解
来源:互联网 发布:知乎大学生推荐书单 编辑:程序博客网 时间: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 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时会先去找是否存在该对象,若存在,则指向它。
引出关于数据类型的默认值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
boolean false
所以在与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;
如有错误,感谢指出,写这篇博客之前其实我也不明确其中区别,
单纯的想搞明白这个问题去查资料,然后开了一个测试类测试,越写越明白。
- 原始类型: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;trueb==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
- 对基本数据类型及自动拆箱、自动装箱的理解
- 对数据类型的理解及自动装箱拆箱等
- 基本数据类型的自动装箱
- 基本数据类型 自动装箱拆箱
- Java中基本数据类型的自动拆箱和装箱
- Java中基本数据类型的自动拆箱和装箱
- 基本数据类型的自动拆箱与装箱
- Java中基本数据类型的自动拆箱和装箱
- 11 jdk5基本数据类型的自动拆箱与装箱
- Java支持的基本数据类型及自动装箱、拆箱
- java基本数据类型与字符串之间的转换(基本数据类型、对象封装类、自动装箱、自动拆箱)
- Java基础加强:静态导入及可变参数和增强for循环 ,基本数据类型的自动拆箱和装箱
- Java基本类型的自动装箱与自动拆箱
- 黑马程序员--基本数据类型的自动装箱与拆箱(享元模式的初步认识)
- Java基本数据类型的大小,他们的封装类以及自动拆箱和装箱
- 静态导入-可变参数-增强for循环-基本数据类型的自动拆箱与装箱
- 黑马程序员-jdk1.5新特性--基本数据类型的自动拆箱与装箱
- JAVA1.5新特性----基本数据类型的自动拆箱与装箱
- 删除所有cookie或者清空所有cookie值
- JS点击图片放大预览
- 实际问题:水印平铺,以二维规则小图形对大图形进行填充问题解决
- Vuejs全家桶系列(二)--- Ajax请求
- Nexus3的使用
- 对基本数据类型及自动拆箱、自动装箱的理解
- 应用间共享sharedpreference
- 关于数据中心机房的专业名词
- ls-l
- Binder进程间通信机制(图文解析)
- String length must be a multiple of four.
- ArcGIS Server路径分析结果汉化
- pycharm远程调试配置
- Perl