博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的自动拆箱装箱(Autoboxing&Unboxing)
阅读量:4519 次
发布时间:2019-06-08

本文共 2020 字,大约阅读时间需要 6 分钟。

一、基本类型打包器

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));	}}/*输出结果:33.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 == bInteger类类型: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 == bInteger类类型: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型的区别。

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

 

转载于:https://www.cnblogs.com/danbing/p/5078217.html

你可能感兴趣的文章
LeetCode--Reverse Integer
查看>>
PHP_APC+Ajax实现的监视进度条的文件上传
查看>>
计算机网络课堂笔记3.29
查看>>
word2vec----CBOW
查看>>
衰减学习率真的有用吗?
查看>>
ORACLE 建库过程总结
查看>>
Ogre1.8.1 Basic Tutorial 6 - The Ogre Startup Sequence
查看>>
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用...
查看>>
c# Winform 开发分屏显示应用程序
查看>>
canvas刮奖
查看>>
qt下拖放(一)
查看>>
Linux后台运行python程序并输出到日志文件
查看>>
HTML的语义化和一些简单优化
查看>>
jQuery基础教程
查看>>
Spring 在xml文件中配置Bean
查看>>
poj1611(简答并查集)
查看>>
基于scap的服务器安全基线核查设计与实现
查看>>
NFS 安装与配置
查看>>
javascript 模拟滚动 隐藏滚动条
查看>>
深度探索C++对象模型读书笔记(2)
查看>>