【自动装箱】Java自动装箱、自动拆箱
Java中集合只允许存储引用数据类型,那么 int char double等基础数据类型,如何存储在集合里呢?Java在JDK1.5版本以后推出了自动装箱、自动拆箱操作,那么什么是自动装箱呢,下面我们举两个例子看:
【自动装箱】
手动装箱示例: 先声明基础数据类型 int,再声明包装类 Integer 把int包装到Integer 再往list集合中add
int x = 90; //声明基础数据类型变量
Integer integer = new Integer(x); //声明Integer包装类 把int类型的x变量包装到Integer中
ArrayList list = new Arraylist; //创建ArrayList集合
list.add(integer); //将Integer包装类添加到list集合中(这种手动把int装到list里的操作,是比较麻烦的 所以后面推出了 自动装箱)
System.out.print(list); //输出list集合对象(也可以写成 list.toString(),输出的原理是调用了重写的toString方法)
自动装箱示例:
int i = 99; //声明基础数据类型int变量
ArrayList list = new ArrayList();
list.add(i); //触发自动装箱,int类型自动转换成 Integer
System.out.println(list);
如上所示就是集合中的自动装箱,将基础数据类型 装箱成了包装类;
自动装箱:就是将基础数据类型 自动转化为包装类;
各基础数据类型对应的包装类为(注意Java中严格区分大小写):
byte ->Byte
char ->Character
short ->Short
int ->Integer
long ->Long
float ->Float
double ->Double
boolean->Boolean
【自动拆箱】
那么什么叫自动拆箱呢?再接着看两个例子
public class Main{public static void main(String[] args){Integer int1 = 50;Integer int2 = 50;Integer int3 = 500;Integer int4 = 500;System.out.println(int1 == int2); System.out.println(int3 == int4);}
}
以上代码 输出的结果 : 第一行为 true 第二行为 false。
那么同样是 == ,为什么会出现这种情况呢?
首先,“ == ” 与 .equals()方法的区别我们需要知道, 通常情况下"==" 比较的是两个对象的地址值是否相同,.equals()方法则是比较 值本身 是否相同。
我们进入Integer类进行查看,发现编译器最终会调用传int参数的ValueOf方法
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {//.........//其中代码不做描述,如想看详细 可以自行查阅源码}
}
简单描述,IntegerCache把-128到 127之间的数 ,定义成了常量。
那这段代码的意思为,如果值在-128到127之间 则返回这个常量值,如果在-128-127之外,则new Integer 新创建一个Integer类型的对象出来。
因此可以得出 int1 == int2 为true ,因为是常量间的比较(常量是不可变的,在代码运行初即执行,静态方法 常量 都会被初始化到静态方法区,不在堆、栈中体现)
而 int3 == int4 为false ,因为不在-128到127之间,所以是新new的Integer对象,此处 “== ” 为判断地址值是否相等,故结果为 false。
接下来做一段练习
public static void main(String[] args){Integer int1 = 3;Integer int2 = 3;Integer int3 = 6;int int4 = 20;int int5 = 20;Integer integer6 = new Integer(20);Integer integer7 = new Integer(20);Integer integer8 = new Integer(3);System.out.println(int3 == (int1 + int2));//trueSystem.out.println(int3.equals(int1+int2));//trueSystem.out.println(int4 == int5);//trueSystem.out.println(integer6 == int4);//trueSystem.out.println(integer6 == integer7);//falseSystem.out.println(integer8 == int1);//false}
可以看到最后两行输出结果为 false
第4行 Integer6 == int4,编译器自动调用了 自动拆箱,把Integer6 拆成了int 类型去比较,因此比较的是值,返回 true
第5行 integer6 == integer7 为false,是因为== 比较的是 地址值,而 integer6 和integer7 都是新 new的对象,地址值肯定不同,所以为 false
第6行 integer8 == int1 为false,同理 integer8 为new的对象 int1为一个常量 ,地址值也是不同,所以为false。
以上就是自动装箱 与 自动拆箱的简单解析了。
如有错误请留言纠正 ,谢谢!
【自动装箱】Java自动装箱、自动拆箱相关推荐
- C#装箱(Boxing)和拆箱(Unboxing)
知识点 值类型. 值类型是在栈中分配内存,在声明时初始化才能使用,不能为null. 值类型超出作用范围系统自动释放内存. 主要由两类组成:结构,枚举(enum),结构分为以下几类: 整型(Sbyte. ...
- 《Effective C#》Item 17:减少装箱(Boxing)和拆箱(Unboxing)操作
为了便于文章的开展,首先介绍装箱(Boxing)和拆箱(Unboxing)这两个名词..Net的类型分为两种,一种是值类型,另一种是引用类型.这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数 ...
- 装箱(Boxing)和拆箱(Unboxing)
首先介绍装箱(Boxing)和拆箱(Unboxing)这两个名词..Net的类型分为两种,一种是值类型,另一种是引用类型.这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数据分配在堆上.那么如 ...
- 包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)
在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型. 文章目录 一.基本数据类型和对应的包装类 二.装箱和拆箱 三.Inte ...
- C#“装箱”(boxing)与“拆箱”(unboxing)
装箱和拆箱:任何值类型.引用类型可以和object(对象)类型之间进行转换.装箱转换是指将一个值类型隐式或显式地转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型(inte ...
- ai自动写JAVA代码,人工智能自动写作软件2.0时代(示例代码)
大家好,人工智能人工智能(ai)的定义是计算机科学的一个分支,自20世纪70年代以来被称为世界三大最先进技术之一(空间技术.能源技术和人工智能).它有许多定义,它们都是有意义的,没有对错之分.人工智能 ...
- 【转】java 自动装箱与拆箱
java 自动装箱与拆箱 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的 ...
- java装箱和拆箱_java自动装箱和拆箱
这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱 ...
- Java包装类与基本数据类型的自动 手动装箱与自动 手动拆箱
Java包装类与基本数据类型的自动 手动装箱与自动 手动拆箱 **自动装箱与拆箱**,实现代码如下: /*** 装箱 : 基本数据类型-----> 包装类* 拆箱: 包装类-------> ...
- java装箱和拆箱的意义_java的自动拆箱和装箱是每个程序员都要知道的
自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西. 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动 ...
最新文章
- tensorflow实现基于LSTM的文本分类方法
- mysql租车管理系统_基于java实现租车管理系统
- Cloudflare推出域名注册服务:不赚利润只收取成本费
- 怎么看电脑有没有蓝牙_怎么选购电脑音响?挑选到性价比高的电脑桌面音箱,看完这篇推荐指南就懂了!...
- TensorFlow函数(四)tf.trainable_variable() 和 tf.all_variable()
- 已支持macOS Big Sur 的apple App更新列表
- hwd分别是长宽高_丰田重磅新RAV4荣放!不仅颜值高了 配置还再升级,仅18万
- C语言学习心得 Caiwentao
- RFID天线接头分类
- CMOS Image Sensor的DVP接口硬件设计
- 永久域名存在吗?永久域名注册流程是什么样的?
- html5 blockquote,HTML blockquote 标签 | w3cschool菜鸟教程
- 【Git】fatal: Unable to create ‘.git/index.lock’: File exists.
- Excel 模拟form表单提交
- 三维实现广州的行政区划
- HTML+CSS+JS制作【俄罗斯方块】小游戏
- Access2013 Mssql2012 数据库连接字符串
- 不同派生方式下基类成员在派生类中的可访问范围属性
- 计算机网络习题:第七单元
- YouTube被引入有线电视机顶盒