Java中的自动拆箱装箱(Autoboxing&Unboxing)
一、基本类型打包器
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)的更多相关文章
- 如何理解Java中的自动拆箱和自动装箱?
小伟刚毕业时面的第一家公司就被面试官给问住了... 如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这...这..知识盲区... 回到家后小伟赶紧查资料,我透,这不 ...
- JAVA高级特性--自动拆箱-装箱,枚举类型
基本数据类型转换为引用类型对象 一个自动装箱的例子 Integer i=10; 相当于 Integer i=new Integer(10); 一个自动拆箱的例子 Integer m=10; int n ...
- Java中的自动拆装箱(转)
出处: 一文读懂什么是Java中的自动拆装箱 本文主要介绍Java中的自动拆箱与自动装箱的有关知识. 基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我 ...
- 一文读懂什么是Java中的自动拆装箱
基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为 ...
- 什么是Java中的自动拆装箱
1.基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值 ...
- Java 从Character和char的区别来学习自动拆箱装箱
本文结构 1.Character和char 的区别: 2.自动拆箱装箱 1.Character和char 的区别: Character是类,char基本数据类型. 在java中有三个类负责对字符的操作 ...
- WPF中多线程统计拆箱装箱和泛型的运行效率
WPF中多线程统计拆箱装箱和泛型的执行效率.使用的知识点有泛型.多线程.托付.从样例中能够看到使用泛型的效率至少提升2倍 MainWindow.xaml <Window x:Class=&quo ...
- 关于Java自动拆箱装箱中的缓存问题
package cn.zhang.test; /** * 测试自动装箱拆箱 * 自动装箱:基本类型自动转为包装类对象 * 自动拆箱:包装类对象自动转化为基本数据类型 * * * /*缓存问题*/ /* ...
- Java进阶之自动拆箱与自动装箱
序. java基本类型介绍 java中,基本数据类型一共有8种,详细信息如下表: 类型 大小 范围 默认值 byte 8 -128 - 127 0 short 16 -32768 - 32768 0 ...
随机推荐
- java实现链表结构
1. 定义节点node public class Node<T> { private Node<T> pre; private Node<T> next; priv ...
- thymeleaf 和其它标签组合 获取数据
thymeleaf 有很多的内置标签, 但是我们在开发中会引入其它很多标签, 这个时候, 后台数据过来了,前端 页面要怎么显示呢? 网上资料真的很少. 不过还是找到了答案: th:attr 这个标签 ...
- 关于java里小数点的保留
关于java里小数点的保留 1.先给大家看一个代码. import java.util.*;import java.text.*; public class A { public static voi ...
- HDU5047Sawtooth(java大数)
HDU5047Sawtooth(java大数) 题目链接 题目大意:在一个矩形内画n个"M".问如何画可以把这个矩形分成最多的区域. 给出这个区域的数目. 解题思路:最好的方式就是 ...
- Qss
*{ font-size:13px; color:white; font-family:"宋体"; } CallWidget QLineEdit#telEdt { font-siz ...
- iOS-iPad开发之popoverController使用介绍
iOS-iPad开发之popoverController使用介绍 iOS开发UI篇-popoverController使用注意 iOS SDK:自定义Popover(弹出窗口) 实现的简单例子: // ...
- 我是一块cpu 《转载》
我是一块cpu,原装intel,在一台普通的台式计算机里供职.我有个小弟是内存,我要靠他时时刻刻陪伴我工作,其实有时候我并不是没有某某地址的资料,而是懒得翻--麻烦. 还有一个老大哥叫bios,每次那 ...
- The performance between the 'normal' operation and the 'shift' operation.
First, I gonna post my test result with some code: //test the peformance of the <normal operation ...
- 监听指定端口数据交互(HttpListenerContext )
很怀念以前做机票的日子,,,,可惜回不去 以前的项目中的,拿来贴贴 场景:同步第三方数据,监听指定地址(指定时间间隔,否则不满足,因为需要处理粘包问题,改篇未实现) 主要内容四个文件:下面分别说下每个 ...
- Web Service属性介绍
每个 Web Service都需要唯一的命名空间,它可使客户端应用程序区分出可能使用相同方法名称的 Web Service.在 Visual Studio.NET中创建的Web Service的默认命 ...