基本类型与包装(装箱)类型的区别
2017-05-11 22:21
155 查看
Java的类型分为两部分,一个是基本类型(primitive),如int、double等八种基本数据类型;另一个是引用类型(reference type),如String、List等。而每一个基本类型又各自对应了一个引用类型,称为包装类型(或装箱类型,boxed primitive)。装箱基本类型中对应于int 、double、和boolean的是Integer、Double、Boolean。
基本类型与包装类型的主要区别在于以下三个方面:
1、基本类型只有值,而包装类型则具有与它们的值不同的同一性(identity)。这个同一性是指,两个引用是否指向同一个对象,如果指向同一个对象,则说明具有同一性。(与此类似的还有等同性。)
来看一段代码:
[java] view plain copy print?
Integer g = new Integer(0);
Integer h = new Integer(0);
System.out.println(g==h)
以上代码,两个对象虽然具有相同的值,但其引用指向的对象却不相同,因此会输出false。
再来看一段代码:
[java] view plain copy print?
Integer a = 0;
Integer b = 0;
System.out.println(a==b);
这个会输出什么呢?别急,再看一段代码:
[java] view plain copy print?
Integer d = 128;
Integer f = 128;
System.out.println(f==d);
如果你没有运行这两段代码,就知道答案,那么相信你对常量池有一定的了解了。
其实,当我们直接给一个Integer赋予一个int值的时候,它会调用一个valueOf()的方法。所以,如上代码就相当于:
Integer a = Integer.valueOf(0);
Integer的常量池是由-128至127组成。当我们给一个Integer赋的值在这个范围之类时就直接会从缓存返回一个相同的引用,所以a==b会输出true。而超过这个范围时,就会重新new一个对象。因此,f==d就会输出一个false。
现在我们再来看一段代码:
[java] view plain copy print?
int e = 128;
Integer d = 128;
System.out.println(e==d);
这个会输出什么呢?答案是true.
因为当在一项操作中混合使用基本类型与包装类型时,包装类型会自动拆箱。因此,e和d的比较其实就是int值的比较了。
2、基本类型只有功能完备的值,而包装类型除了其对应的基本类型所有的功能之外,还有一个非功能值:null。
现在来看一段简单的代码:
[java] view plain copy print?
static Integer i;
public static void main(String[] args) {
if(i == 128){
System.out.println(”Unbelieveable~”);
}
}
你认为会输出什么呢?不知道?自己运行一下~~~~
其实这段代码并不能正确的运行,因为它会报一个NullPointException异常,为什么?因为在定义i的时候,它是Integer类的一个引用,而i没有初始化,就像所有对象引用一样,如果没有初始化那么就赋一个null值。既然现在i是一个null,那么上面已经提到,当混合使用基本类型与包装类型时,包装类会自动拆箱。现在i都没有指向任何对象,因此拆箱的时候就会报一个NullPointException异常。
3、基本类型通常比包装类型更节省时间与空间。
看如下代码:
[java] view plain copy print?
Long sum = 0L;
for(long i = 0;i<Integer.MAX_VALUE;i++){
sum +=i;
}
System.out.println(sum);
毫无疑问,这段代码能正常运行,但是花费的时间会比较长。因为,在声明sum变量的时候,一不小心声明为Long,而不是long。这样,在这个循环当中就会不断地装箱和拆箱,其性能也会明显的下降。如果把Long改为long,那么经过我的试验,这段代码所花费的时间将只有原来的1/5.
经过这三个比较,貌似感觉基本类型已经完胜了包装类型。但是在如下三个地方,包装类型的使用会更合理:
1、作为集合中的元素、键和值。
2、在参数化类型中。比如:你不能这样写——ArryList<int>,你只能写ArrayList<Integer>.
3、在进行反射方法的调用时。
总之,当可以选择时候,基本类型是要优先于包装类型。基本类型更加简单、更加快速。
源自:http://blog.csdn.net/cynthia9023/article/details/17413375
基本类型与包装类型的主要区别在于以下三个方面:
1、基本类型只有值,而包装类型则具有与它们的值不同的同一性(identity)。这个同一性是指,两个引用是否指向同一个对象,如果指向同一个对象,则说明具有同一性。(与此类似的还有等同性。)
来看一段代码:
[java] view plain copy print?
Integer g = new Integer(0);
Integer h = new Integer(0);
System.out.println(g==h)
Integer g = new Integer(0); Integer h = new Integer(0); System.out.println(g==h)
以上代码,两个对象虽然具有相同的值,但其引用指向的对象却不相同,因此会输出false。
再来看一段代码:
[java] view plain copy print?
Integer a = 0;
Integer b = 0;
System.out.println(a==b);
Integer a = 0; Integer b = 0; System.out.println(a==b);
这个会输出什么呢?别急,再看一段代码:
[java] view plain copy print?
Integer d = 128;
Integer f = 128;
System.out.println(f==d);
Integer d = 128; Integer f = 128; System.out.println(f==d);
如果你没有运行这两段代码,就知道答案,那么相信你对常量池有一定的了解了。
其实,当我们直接给一个Integer赋予一个int值的时候,它会调用一个valueOf()的方法。所以,如上代码就相当于:
Integer a = Integer.valueOf(0);
Integer的常量池是由-128至127组成。当我们给一个Integer赋的值在这个范围之类时就直接会从缓存返回一个相同的引用,所以a==b会输出true。而超过这个范围时,就会重新new一个对象。因此,f==d就会输出一个false。
现在我们再来看一段代码:
[java] view plain copy print?
int e = 128;
Integer d = 128;
System.out.println(e==d);
int e = 128; Integer d = 128; System.out.println(e==d);
这个会输出什么呢?答案是true.
因为当在一项操作中混合使用基本类型与包装类型时,包装类型会自动拆箱。因此,e和d的比较其实就是int值的比较了。
2、基本类型只有功能完备的值,而包装类型除了其对应的基本类型所有的功能之外,还有一个非功能值:null。
现在来看一段简单的代码:
[java] view plain copy print?
static Integer i;
public static void main(String[] args) {
if(i == 128){
System.out.println(”Unbelieveable~”);
}
}
static Integer i; public static void main(String[] args) { if(i == 128){ System.out.println("Unbelieveable~"); } }
你认为会输出什么呢?不知道?自己运行一下~~~~
其实这段代码并不能正确的运行,因为它会报一个NullPointException异常,为什么?因为在定义i的时候,它是Integer类的一个引用,而i没有初始化,就像所有对象引用一样,如果没有初始化那么就赋一个null值。既然现在i是一个null,那么上面已经提到,当混合使用基本类型与包装类型时,包装类会自动拆箱。现在i都没有指向任何对象,因此拆箱的时候就会报一个NullPointException异常。
3、基本类型通常比包装类型更节省时间与空间。
看如下代码:
[java] view plain copy print?
Long sum = 0L;
for(long i = 0;i<Integer.MAX_VALUE;i++){
sum +=i;
}
System.out.println(sum);
Long sum = 0L; for(long i = 0;i<Integer.MAX_VALUE;i++){ sum +=i; } System.out.println(sum);
毫无疑问,这段代码能正常运行,但是花费的时间会比较长。因为,在声明sum变量的时候,一不小心声明为Long,而不是long。这样,在这个循环当中就会不断地装箱和拆箱,其性能也会明显的下降。如果把Long改为long,那么经过我的试验,这段代码所花费的时间将只有原来的1/5.
经过这三个比较,貌似感觉基本类型已经完胜了包装类型。但是在如下三个地方,包装类型的使用会更合理:
1、作为集合中的元素、键和值。
2、在参数化类型中。比如:你不能这样写——ArryList<int>,你只能写ArrayList<Integer>.
3、在进行反射方法的调用时。
总之,当可以选择时候,基本类型是要优先于包装类型。基本类型更加简单、更加快速。
源自:http://blog.csdn.net/cynthia9023/article/details/17413375
相关文章推荐
- 基本类型与包装(装箱)类型的区别
- 基本数据类型与它们的包装器类相互的自动装箱,自动拆箱
- javascript 引用类型 - 基本包装类型(深入理解基本包装类型和基本类型的区别)
- 包装类型、装箱拆箱、基本类型速度比较
- java 自动装箱与拆箱 (基本类型与包装类型)
- Java中基本数据类型和包装类型有什么区别?
- java基本类型与包装类型区别
- javaScript基本包装类型及变量定义的区别
- Java中基本数据类型和包装类型有什么区别?
- day13String获取判断切割替换。最大子串。StringBuffer。基本数据类型对象包装类如Integer。进制转换。自动装箱。
- JavaScript基本包装类型(自动装箱和自动拆箱)(instanceof方法)
- 基本类型 包装类型 堆与栈 的区别
- Java中基本数据类型和包装类型有什么区别?
- java基本类型和包装类型,什么是装箱拆箱
- 基本类型和装箱基本类型的区别
- [疯狂Java]面向对象:基本类型的包装器类型、自动装箱/拆箱、包装器类型大小/相等比较
- java基本类型与包装类型区别
- Java基础学习总结(122)——Java八种基本数据类型的包装类及其装箱拆箱详解
- 关于java基本数据类型的包装类的自动装箱池的大小
- 深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别