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自动装箱、自动拆箱相关推荐

  1. C#装箱(Boxing)和拆箱(Unboxing)

    知识点 值类型. 值类型是在栈中分配内存,在声明时初始化才能使用,不能为null. 值类型超出作用范围系统自动释放内存. 主要由两类组成:结构,枚举(enum),结构分为以下几类: 整型(Sbyte. ...

  2. 《Effective C#》Item 17:减少装箱(Boxing)和拆箱(Unboxing)操作

    为了便于文章的开展,首先介绍装箱(Boxing)和拆箱(Unboxing)这两个名词..Net的类型分为两种,一种是值类型,另一种是引用类型.这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数 ...

  3. 装箱(Boxing)和拆箱(Unboxing)

    首先介绍装箱(Boxing)和拆箱(Unboxing)这两个名词..Net的类型分为两种,一种是值类型,另一种是引用类型.这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数据分配在堆上.那么如 ...

  4. 包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)

    在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型. 文章目录 一.基本数据类型和对应的包装类 二.装箱和拆箱 三.Inte ...

  5. C#“装箱”(boxing)与“拆箱”(unboxing)

    装箱和拆箱:任何值类型.引用类型可以和object(对象)类型之间进行转换.装箱转换是指将一个值类型隐式或显式地转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型(inte ...

  6. ai自动写JAVA代码,人工智能自动写作软件2.0时代(示例代码)

    大家好,人工智能人工智能(ai)的定义是计算机科学的一个分支,自20世纪70年代以来被称为世界三大最先进技术之一(空间技术.能源技术和人工智能).它有许多定义,它们都是有意义的,没有对错之分.人工智能 ...

  7. 【转】java 自动装箱与拆箱

    java 自动装箱与拆箱 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的 ...

  8. java装箱和拆箱_java自动装箱和拆箱

    这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱 ...

  9. Java包装类与基本数据类型的自动 手动装箱与自动 手动拆箱

    Java包装类与基本数据类型的自动 手动装箱与自动 手动拆箱 **自动装箱与拆箱**,实现代码如下: /*** 装箱 : 基本数据类型-----> 包装类* 拆箱: 包装类-------> ...

  10. java装箱和拆箱的意义_java的自动拆箱和装箱是每个程序员都要知道的

    自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西. 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动 ...

最新文章

  1. tensorflow实现基于LSTM的文本分类方法
  2. mysql租车管理系统_基于java实现租车管理系统
  3. Cloudflare推出域名注册服务:不赚利润只收取成本费
  4. 怎么看电脑有没有蓝牙_怎么选购电脑音响?挑选到性价比高的电脑桌面音箱,看完这篇推荐指南就懂了!...
  5. TensorFlow函数(四)tf.trainable_variable() 和 tf.all_variable()
  6. 已支持macOS Big Sur 的apple App更新列表
  7. hwd分别是长宽高_丰田重磅新RAV4荣放!不仅颜值高了 配置还再升级,仅18万
  8. C语言学习心得 Caiwentao
  9. RFID天线接头分类
  10. CMOS Image Sensor的DVP接口硬件设计
  11. 永久域名存在吗?永久域名注册流程是什么样的?
  12. html5 blockquote,HTML blockquote 标签 | w3cschool菜鸟教程
  13. 【Git】fatal: Unable to create ‘.git/index.lock’: File exists.
  14. Excel 模拟form表单提交
  15. 三维实现广州的行政区划
  16. HTML+CSS+JS制作【俄罗斯方块】小游戏
  17. Access2013 Mssql2012 数据库连接字符串
  18. 不同派生方式下基类成员在派生类中的可访问范围属性
  19. 计算机网络习题:第七单元
  20. YouTube被引入有线电视机顶盒

热门文章

  1. 利用plsql工具恢复误删表和恢复误删数据
  2. PHP的isset函数使用的坑
  3. 马桶座便挑选A---I
  4. docker 进入mysql
  5. Windows命令--schtasks
  6. 【Java进阶营】10道经典java面试题_实习生必问
  7. 【微软漏洞分析】Windows-Research-Kernel-WRK 代码分析 安全例程(2) 令牌和安全描述符
  8. Live555 直播性能优化
  9. 包职院计算机专业代号,高职专业代码查询2017
  10. SAR ADC系列13:单调开关切换策略