一、基本类型打包器

1、基本类型:long、int、double、float、boolean

2、类类型:Long、Integer、Double、Float、Boolean

区别:基本类型效率更高,类类型的对象却可以携带更多的信息。

public class TestInteger01 {

	public static void main(String[] args) {

		int a = 10;
int b = 20;
Integer A = new Integer(a);
Integer B = new Integer(b);
System.out.println(a / 3);
System.out.println(A.doubleValue()/ 3);
System.out.println(A.compareTo(B));
}
}
/*
输出结果:
3
3.3333333333333335
-1
*/

doubleValue()可以将打包值以double类型返回

compareTo()可以与另一个Integer对象比较,相同为0,小于为-1,大于为1

二、自动拆箱和装箱

Integer A = 10;  //自动装箱

int a = A;   //自动拆箱

自动拆箱和装箱的内幕

看第一个例子,这个例子声明了int和Integer两个类型,“==”为比较是否参考于同一个对象

public class TestInteger02 {

	public static void main(String[] args) {

		int a = 100;
int b = 100;
if (a == b){
System.out.println("int基本类型:a == b");
}
else{
System.out.println("int基本类型:a != b");
} Integer c = 100;
Integer d = 100;
if (c == d){
System.out.println("Integer类类型:c == d");
}
else{
System.out.println("Integer类类型:c != d");
}
} }
/*
输出结果:
int基本类型:a == b
Integer类类型:c == d
*/

由结果可知,a和b,c和d都是同一个对象。

再来看第二个例子,我们将abcd的值全部改为200,输出却出现了意想不到的结果。 

public class TestInteger03 {

	public static void main(String[] args) {

		int a = 200;
int b = 200;
if (a == b){
System.out.println("int基本类型:a == b");
}
else{
System.out.println("int基本类型:a != b");
} Integer c = 200;
Integer d = 200;
if (c == d){
System.out.println("Integer类类型:c == d");
}
else{
System.out.println("Integer类类型:c != d");
}
} }
/*
输出结果:
int基本类型:a == b
Integer类类型:c != d
*/

我们发现,此时a和b还是同一个对象,c和d却已经不是同一个对象了! 

这是什么原因呢?我们可以查看java/lang/Integer.java

public static Integer valueOf(int i) {
return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}

这段代码的意思是,在Integer类中,当传进来的值在(-128—127)之间时,便会查看缓存中有没有打包过相同的值,如果有就直接返回,如果没有就new创建。

当传进来的值不在(-128—127)这个区间时,就直接new创建。所以c和d为200,已经超出区间,所以各自开辟一块内存空间存储数据,所以也不会引用自同一个对象。

而基本类型int,就不会有这个烦恼,每次传值,都会查看缓存中是否已经存在。

理解了这个,我们也就理解了基本类型与String型的区别。

我在这篇随笔中(Java中关键字super与this的区别),初步介绍了基本类型与String型的用法区别,但并没有深入认识到这点,而今天看到了林信良先生的java学习笔记,终于有一种醍醐灌顶的感觉。

Java中的自动拆箱装箱(Autoboxing&Unboxing)的更多相关文章

  1. 如何理解Java中的自动拆箱和自动装箱?

    小伟刚毕业时面的第一家公司就被面试官给问住了... 如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这...这..知识盲区... 回到家后小伟赶紧查资料,我透,这不 ...

  2. JAVA高级特性--自动拆箱-装箱,枚举类型

    基本数据类型转换为引用类型对象 一个自动装箱的例子 Integer i=10; 相当于 Integer i=new Integer(10); 一个自动拆箱的例子 Integer m=10; int n ...

  3. Java中的自动拆装箱(转)

    出处: 一文读懂什么是Java中的自动拆装箱 本文主要介绍Java中的自动拆箱与自动装箱的有关知识.  基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我 ...

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

    基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为 ...

  5. 什么是Java中的自动拆装箱

    1.基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值 ...

  6. Java 从Character和char的区别来学习自动拆箱装箱

    本文结构 1.Character和char 的区别: 2.自动拆箱装箱 1.Character和char 的区别: Character是类,char基本数据类型. 在java中有三个类负责对字符的操作 ...

  7. WPF中多线程统计拆箱装箱和泛型的运行效率

    WPF中多线程统计拆箱装箱和泛型的执行效率.使用的知识点有泛型.多线程.托付.从样例中能够看到使用泛型的效率至少提升2倍 MainWindow.xaml <Window x:Class=&quo ...

  8. 关于Java自动拆箱装箱中的缓存问题

    package cn.zhang.test; /** * 测试自动装箱拆箱 * 自动装箱:基本类型自动转为包装类对象 * 自动拆箱:包装类对象自动转化为基本数据类型 * * * /*缓存问题*/ /* ...

  9. Java进阶之自动拆箱与自动装箱

    序. java基本类型介绍 java中,基本数据类型一共有8种,详细信息如下表: 类型 大小 范围 默认值 byte 8 -128 - 127 0 short 16 -32768 - 32768 0 ...

随机推荐

  1. javascript之文档碎片,文档碎片在理论上可以提高DOM操作的执行效率

    刚来到这里,趁着还没有忘记,来记录一下,昨晚学习的一个知识点——JavaScript中的文档碎片. 一.对文档碎片的基本认识 文档碎片可以提高DOM操作性能(理论上,注意!!理论上的) 文档碎片原理 ...

  2. 谈一下怎样设计Oracle 分区表

    在谈设计Oracle分区表之间先区分一下分区表和表空间的个概念: 表空间:表空间是一个或多个数据文件的集合,全部数据对象都存放在指定的表空间中,但主要存放表,故称表空间. 分区表:分区致力于解决支持极 ...

  3. [React] Linting React JSX with ESLint (in ES6)

    ESLint is a JavaScript linter (static analysis tool) that offers full support for ES6, JSX, and othe ...

  4. nginx代理人server结合tomcat采用

    相信非常多人都听过nginx,这个小巧的东西慢慢地在吞食apache和IIS的份额.那到底它有什么作用呢?可能非常多人未必了解. 说到反向代理,可能非常多人都听说,但详细什么是反向代理,非常多人预计就 ...

  5. SVNclient安装与使用

    Technorati 标签: SVN SVNclient安装与使用 1 下载最新版本号1.5.2 最新版本号:TortoiseSVN-1.5.2.13595-win32-svn-1.5.1.msi 下 ...

  6. HDU-4041-Eliminate Witches! (11年北京网络赛!!)

    Eliminate Witches! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  7. C开发之----#if、#ifdef、#if defined之间的区别

    #if的使用说明 #if的后面接的是表达式 #if (MAX==10)||(MAX==20) code... #endif 它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会 ...

  8. Qt 学习之路 :视图代理

    与 Qt model/view 架构类似,在自定义用户界面中,代理扮演着重要的角色.模型中的每一个数据项都要通过一个代理向用户展示,事实上,用户看到的可视部分就是代理. 每一个代理都可以访问一系列属性 ...

  9. WCF - 地址

    WCF顾名思义 即解决在windows平台下与各种平台中的程序之间通信的问题 而终结点则是WCF通信的唯一手段 终结点承载了所有通信的功能 一个WCF服务是通过对应的终结点发布出来的 发布出来的数据称 ...

  10. Linux编译安装MySQL5.6

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/4311061.html ...