Java基础:JDK1.5后的新特性:自动拆装箱,以及注意事项

首先来看一段代码:

1         Integer x = new Integer(4);
2         Integer y = 4;

在JDK1.5版本后,以上两行代码都能编译通过,那是因为JDK1.5后加入新特性,自动装箱。

第一句代码是正常的创建对象方法,创建了一个Integer包装类对象。

而第二句中,当左边的Interger类型变量指向右边的int基本类型数据时,右边的基本数据类型会自动装箱成Integer对象,即隐式执行了new Integer(4)。

再来一段代码:

1         Integer x = new Integer(4);
2         x = x + 2;

这两句同样可以编译通过,这同样是因为JDK1.5后加入了自动拆箱的特性。

在第二句中,右边的Integer对象与int基本数据类型数据进行加法运算时,Integer对象会自动拆箱,隐式执行了x.intValue(),将Integer对象转换成int基本数据类型数据,然后x.intValue()+2得出和,最后把和自动装箱成Integer对象,new Integer(x.intValue()+2)。这样左边的Integer类型变量x就成功指向了一个新的Integer对象。

从以上例子可以看出,自动拆装箱的新特性可以简化代码,让我们编写程序的时候更加方便。

但是使用中也有要注意的地方,看下面代码:

 1          Integer a = new Integer(100);
 2          Integer b = new Integer(100);
 3          System.out.println("a==b:"+(a==b));     //结果为false。
 4
 5          Integer c = 100;
 6          Integer d = 100;
 7          System.out.println("c==d:"+(c==d));    //结果为true。
 8
 9          Integer m = 200;
10          Integer n = 200;
11          System.out.println("m==n:"+(m==n));    //结果为false。

从这段代码可以看出,在自动拆装箱的过程中,int基本数据类型的大小,会影响到Integer变量最终是否指向的同一个对象,这是为什么?

这段代码三个比较有以下的区别:

1,如果按照正常方式,创建对象(new)来建立变量的引用,因为不同的变量指向的对象也不同,不同变量之间比较当然就为false。

2,如果Integer变量使用自动装箱的形式,对对象建立的引用,而装箱前的int数值大小又正好在byte的范围内(-128~127),那么,如果多个Integer变量指向同一个int值相同的数据装箱成的Integer对象时,java只会在内存创建第一个Integer对象,其他的变量全部都指向了这个对象,所以这些变量比较时,因为它们都指向同一个对象,结果就为true。

3,如果Integer变量使用自动装箱的形式,对对象建立的引用,而装箱前的int数值大小不在byte的范围内(-128~127),那么,即使int的值相同,java也会在内存中对应变量创建多个对象,当多个变量比较时,它们指向的对象不同,所以结果为false。从结果看,这种情况是跟用new来创建对象引用是一样的。

以上例子都是一些应用的小细节,把细节研究透了,java的道路才会更加的平坦。

时间: 2024-10-29 19:05:57

Java基础:JDK1.5后的新特性:自动拆装箱,以及注意事项的相关文章

jdk1.5出现的新特性---->增强for循环

package cn.itcast.jdk15; import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.Map;import java.util.Set; /*jdk1.5出现的新特性---->增强for循环 增强for循环的作用: 简化迭代器的书写格式.(注意:增强for循环的底层还是使用了迭代器遍历.) 增强for循环的适用范围: 如果是实现了Iterable接

Java5新特性之静态导入、可变参数、增强for循环、自动拆装箱

JDK1.5已经发布很长时间,之所以还拿出来是因为它增加了很多个重要的特性,使用这些特性有助于我们简化开发,编写的代码更加简洁清晰安全,主要有以下几个特性: ?  静态导入 ?  可变参数 ?  增强for循环 ?  自动拆装箱 ? 泛型 ? 枚举 由于泛型.枚举内容比较多,也最重要,之后单拿出来讲.这里先介绍前面四个简单而又实用的小特性. 1. 静态导入 所谓"静态导入"只不过是在普通的import语句中加入关键字static,例如: ?  非静态导入:import java.lan

11g新特性-自动sql调优(Automatic SQL Tuning)

11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中,通过运行sql tuning advisor加强了自动sql调优功能.默认情况下是每天夜间通过自动任务的方式运行"自动sql调优". 自动sql调优的过程: 1.识别需要调优的sql语句  根据AWR中的CPU和I/O负载来识别 2.调优,生成新的sql profile 在维护窗口(mai

java基础第九天_多线程、自动拆装箱

1.蜜蜂和熊的生产消费关系,熊在蜂蜜满10斤吃掉.蜜蜂一次生产一斤蜂蜜,且蜜蜂生成一斤蜂蜜花费的时间是10s. 十只蜜蜂和两只熊. 2.取出两个字符串中最大的公共子串. 3.StringBuffer是线程安全的,StringBuilder不是线程安全.单线程访问情况下,性能是否一致? 4.完成8中基本数据类包装类的练习,完成自动拆装箱操作. 1.蜜蜂和熊的生产消费关系,熊在蜂蜜满10斤吃掉.蜜蜂一次生产一斤蜂蜜,且蜜蜂生成一斤蜂蜜花费的时间是10s. 十只蜜蜂和两只熊. /** * 蜜蜂.熊的例

浅谈java中的自动拆装箱

Java在jdk1.5之后推出的一个新特性:自动拆装箱. 该特性不是jvm认可的,而是编译允许 public class Integerdemo03 {     public static void main(String[] args) {         /**          * 编译器在编译下列代码时补充了代码          * Integer n= Integer.valueOf(1);          * 自动装箱          */         int a=100;

java自动拆装箱总结

java中有8中基本的数据类型,这八种基本的数据类型都有对应的封装类型,下面是对应关系: int--Integer float--Float double--Double byte--Byte long--Long char--Character boolean--Boolean short--Short 基本数据类型和它对应的封装类型之间可以相互转换,从基本数据类型到封装类型叫做装箱,从封装类型到基本数据类型叫拆箱,自动拆装箱是jdk5.0提供的新特特性,它可以自动实现类型的转换,代码如下:

Java自动拆装箱(Autoboxing and unboxing)学习

在学习并发的过程中,用"Boolean bool = true"的自动装箱方式初始化了两个对象锁去锁两块代码,结果运行的时候出现了竞争等待,调试了一下发现两个锁变量指向的是同一个对象,由此可见我对自动拆装箱的机制想的太简单了,查了一下,发现这个机制还挺细节,那就记录一下: 本文主要有以下几个方面: 什么是自动拆装箱 拆装箱的实现 拆装箱发生的场景 关于String 回首望月 尝试的第一篇博客,不当之处,求轻喷! 一. 什么是自动拆箱与装箱 我们都知道,Java定义了8种基本类型和与之对

静态导入方法即自动拆装箱(java)

package example6;import static java.lang.System.out;import static java.util.Arrays.sort;import java.util.Arrays;class quietWay{    /*1.静态导入(了解)     * 可以在代码里面,直接使用静态导入方法,导入静态方法或常量     * import static 包名;     * 比如实现一个计算器,在math类里面     * */    public sta

一文读懂什么是Java中的自动拆装箱

基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化. Java基本类型共有八种,基本类型可以分为三类: 字符类型char 布尔类型boolean 整数类型byte.short.int.long 浮点数类型float.double. Java中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变.