自动装箱和拆箱
自动装箱是Java编译器在基元类型和相应的对象包装类之间进行的自动转换,例如,将int转换为Integer,将double转换为Double,依此类推,如果转换是另一种方式,则称为拆箱。
以下是自动装箱的最简单示例:
Character ch = "a";
本节中的其余示例使用泛型,如果您还不熟悉泛型的语法,请参阅泛型课程。
考虑以下代码:
Listli = new ArrayList<>(); for (int i = 1; i < 50; i += 2) li.add(i);
虽然你将int值作为基本类型而不是Integer对象添加到li,但代码会进行编译,因为li是Integer对象的列表,而不是int值列表,你可能想知道为什么Java编译器不会发出编译时错误,编译器不会生成错误,因为它从i创建一个Integer对象并将该对象添加到li,因此,编译器在运行时将前面的代码转换为以下代码:
Listli = new ArrayList<>(); for (int i = 1; i < 50; i += 2) li.add(Integer.valueOf(i));
将原始值(例如int)转换为相应包装类(Integer)的对象称为自动装箱,Java编译器应用自动装箱,当原始值是:
作为参数传递给期望相应包装类的对象的方法。
分配给相应包装类的变量。
考虑以下方法:
public static int sumEven(Listli) { int sum = 0; for (Integer i: li) if (i % 2 == 0) sum += i; return sum; }
因为余数(%)和一元加号(+=)运算符不适用于Integer对象,你可能想知道为什么Java编译器编译该方法而不发出任何错误,编译器不会生成错误是因为它在运行时调用intValue方法将Integer转换为int:
public static int sumEven(Listli) { int sum = 0; for (Integer i : li) if (i.intValue() % 2 == 0) sum += i.intValue(); return sum; }
将包装类型(Integer)的对象转换为其对应的原始(int)值称为拆箱,Java编译器应用拆箱,当包装类的对象是:
作为参数传递给期望相应基元类型的值的方法。
分配给相应基元类型的变量。
Unboxing示例显示了其工作原理:
import java.util.ArrayList; import java.util.List; public class Unboxing { public static void main(String[] args) { Integer i = new Integer(-8); // 1. Unboxing through method invocation int absVal = absoluteValue(i); System.out.println("absolute value of " + i + " = " + absVal); Listld = new ArrayList<>(); ld.add(3.1416); // Π is autoboxed through method invocation. // 2. Unboxing through assignment double pi = ld.get(0); System.out.println("pi = " + pi); } public static int absoluteValue(int i) { return (i < 0) ? -i : i; } }
该程序打印以下内容:
absolute value of -8 = 8 pi = 3.1416
自动装箱和拆箱使开发人员可以编写更清晰的代码,使其更易于阅读,下表列出了原始类型及其相应的包装类,Java编译器使用这些类进行自动装箱和拆箱:
原始类型 | 包装类 |
---|---|
boolean | Boolean |
byte | Byte |
char | Character |
float | Float |
int | Integer |
long | Long |
short | Short |
double | Double |
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72903.html
摘要:对象头的另外一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据信息并不一定要经过对象本身,这点将在节讨论。 目录介绍 1.关于int和Integer的问题区别分析 2.Integer的值缓存的原理 2.1 Java 5 中引入缓存特性 2.2 Intege...
字符 大多数情况下,如果使用单个字符值,则将使用原始char类型,例如: char ch = a; // Unicode for uppercase Greek omega character char uniChar = u03A9; // an array of chars char[] charArray = { a, b, c, d, e }; 但是,有时候需要使用字符作为对象 — 例如...
摘要:本章部分内容从源码中解读一些自动装箱与拆箱的原理,以及会出现的一些陷阱已经性能等。例题分析我们通过几个经典的问题,来看看大家到底理解了装箱与拆箱的知识点没。 showImg(https://img-blog.csdnimg.cn/20190426221838971.gif);showImg(https://img-blog.csdnimg.cn/20190426221918208.pn...
摘要:本文主要介绍了中的函数与原语,由国内管理平台编译呈现。原语与对象语言毫无关系。对象函数有个方法叫,返回数字化原语的方法被称为,或。你可以创建函数的特殊形式,使用原语,而不是对象。 【编者按】本文作者为专注于自然语言处理多年的 Pierre-Yves Saumont,Pierre-Yves 著有30多本主讲 Java 软件开发的书籍,自2008开始供职于 Alcatel-Lucent 公...
阅读 2787·2021-10-08 10:04
阅读 3171·2021-09-10 11:20
阅读 499·2019-08-30 10:54
阅读 3289·2019-08-29 17:25
阅读 2290·2019-08-29 16:24
阅读 858·2019-08-29 12:26
阅读 1434·2019-08-23 18:35
阅读 1911·2019-08-23 17:53