有时, 需要将 int 这样的基本类型转换为对象。 所有的基本类型都冇一个与之对应的类。例如,Integer 类对应基本类型 int。通常, 这些类称为包装器 ( wrapper ) 这些对象包装器类拥有很明显的名字:Integer、Long、Float、Double、Short、Byte、Character 、Void 和 Boolean (前6 个类派生于公共的超类 Number)。对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时, 对象包装器类还是 final , 因此不能定义它们的子类。
    假设想定义一个整型数组列表。而尖括号中的类型参数不允许是基本类型,也就是说,不允许写成 ArrayList<int>。这里就用到了 Integer 对象包装器类。我们可以声明一个 Integer对象的数组列表。

ArrayList<Integer> list = new ArrayList<>();

警告: 由于每个值分别包装在对象中, 所以 ArrayList<lnteger> 的效率远远低于 int[ ] 数组。 因此, 应该用它构造小型集合,其原因是此时程序员操作的方便性要比执行效率更加重要。

幸运的是, 有一个很有用的特性, 从而更加便于添加 int 类型的元素到 ArrayLisKlntegeP中。下面这个调用

list.add(3);

将自动地变换成

list.add (Integer.value0f(3));

这种变换被称为自动装箱(autoboxing。)

相反地, 当将一个 Integer 对象赋给一个 int 值时, 将会自动地拆箱。也就是说, 编译器将下列语句:

nt n = list.get(i);
// 翻译成
int n = list.get(i).intValue();

甚至在算术表达式中也能够自动地装箱和拆箱。例如,可以将自增操作符应用于一个包装器引用:

Integer n = 3;
n++;

编译器将自动地插人一条对象拆箱的指令, 然后进行自增计算, 最后再将结果装箱。

大多数情况下,容易有一种假象, 即基本类型与它们的对象包装器是一样的,只是它们的相等性不同。大家知道, == 运算符也可以应用于对象包装器对象, 只不过检测的是对象是否指向同一个存储区域, 因此,下面的比较通常不会成立。

Integer a = 1000;
Integer b = 1000;
if (a = b) . . .

然而,Java 实现却有可能( may) 让它成立。如果将经常出现的值包装到同一个对象中,这种比较就有可能成立。这种不确定的结果并不是我们所希望的。解决这个问题的办法是在两个包装器对象比较时调用 equals 方法。

注释: 自动装箱规范要求 boolean、byte、char 127, 介于 -128 ~ 127 之间的 short 和 int 被包装到固定的对象中。例如,如果在前面的例子中将 a 和 b 初始化为 100,对它们进行比较的结果一定成立。

关于自动装箱还有几点需要说明。首先, 由于包装器类引用可以为 null, 所以自动装箱有可能会抛出一个 NullPointerException 异常:

Integer n = null;
System.out.printing * n); // Throws NullPointerException

另外, 如果在一个条件表达式中混合使用 Integer 和 Double 类型, Integer 值就会拆箱,提升为 double, 再装箱为 Double:

Integer n = 1;
Double x = 2.0;
System.out.println(true ? n : x); // Prints 1.0

最后强调一下,装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时, 插人必要的方法调用。虚拟机只是执行这些字节码。

使用数值对象包装器还有另外一个好处。Java 设计者发现,可以将某些基本方法放置在包装器中, 例如, 将一个数字字符串转换成数值。

要想将字符串转换成整型, 可以使用下面这条语句:

int x = Integer.parselnt(s)

这里与 Integer 对象没有任何关系, parselnt 是一个静态方法。但 Integer 类是放置这个方法的一个好地方。

警告: 有些人认为包装器类可以用来实现修改数值参数的方法, 然而这是错误的。由于 Java 方法都是值传递, 所以不可能编写一个下面这样的能够增加整型参数值的 Java 方法。

public static void triple(int x) // won't work
{x = 3 * x; // modifies local variable
}

将 int 替换成 Integer 又会怎样呢?

public static void triple(Integer x) // won't work
{x = 3 * x; // modifies local variable
}

问题是 Integer 对象是不可变的: 包含在包装器中的内容不会改变: 不能使用这些包装器类创建修改数值参数的方法。
如果想编写一个修改数值参数值的方法, 就需要使用在 org.omg.CORBA 包中定义的持有者( holder) 类型, 包括 IntHolder、BooleanHolder 等。每个持有者类型都包含一个公有 (!)域值,通过它可以访问存储在其中的值。

public static void triple(IntHolder x)
{x.value = 3 * x.value;
}

本文方法总结:

java.lang.Integer 1.0

// java.lang.Integer 1.0int intValue( )
// 以 int 的形式返回 Integer 对象的值(在 Number 类中覆盖了 intValue方法)。static String toString(int i )
// 以一个新 String 对象的形式返回给定数值 i 的十进制表示。static String toString(int i ,int radix )
// 返回数值 i 的基于给定 radix 参数进制的表示。static int parselnt(String s)
static int parseInt(String s,int radix)
// 返回字符串 s 表示的整型数值, 给定字符串表示的是十进制的整数(第一种方法,)或者是 radix 参数进制的整数(第二种方法 )。static Integer valueOf(String s)
Static Integer valueOf(String s, int radix)
// 返回用 s 表示的整型数值进行初始化后的一个新 Integer 对象, 给定字符串表示的是十进制的整数(第一种方法,) 或者是 radix 参数进制的整数(第二种方法)。

java.text.NumberFormat 1.1

Number parse(String s)
// 返回数字值,假设给定的 String 表示了一个数值

《Java 核心技术卷1 第10版》学习笔记------ 对象包装器、自动装箱、拆箱相关推荐

  1. Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)

    22.一旦获得了一个 Charset,就可以在 Java 的 Unicode 和指定的编码格式之间进行转化,下面以 GBK 和 Unicode 之间做为例子. 从 Unicode 到 GBK: imp ...

  2. 《Java 核心技术卷1 第10版》学习笔记------异常

    异常处理的任务就是将控制权从错误产生的地方转移给能够处理这种情况的错误处理器 . 7.1.1 异常分类 在 Java 程序设计语言中, 异常对象都是派生于 Throwable 类的一个实例 . 稍后还 ...

  3. 《Java 核心技术卷1 第10版》学习笔记------对象克隆【对象拷贝】

    由于克隆并不太常见,而且有关的细节技术性很强,你可能只是想稍做了解,等真正需要时再深人学习. 先来回忆为一个包含对象引用的变量建立副本时会发生什么 .原变量和副本都是同一个对象的引用: Employe ...

  4. 《Java 核心技术卷1 第10版》学习笔记 ------ 泛型【进阶】

    这部分主要是结合 Java 虚拟机实现泛型的原理进一步研究如何更好的使用泛型. 8.5 泛型代码和虚拟机 虚拟机没有泛型类型对象---所有对象都属于普通类.所以编译器在编译的时候会进行类型擦除操作. ...

  5. 《Java 核心技术卷1 第10版》学习笔记 ------ 泛型【基础】

    泛型从Java SE 5.0 中开始出现,是 Java 程序设计语言从 1.0 版本发布以来,变化最大的部分. 使用泛型机制编写的程序代码要比那些杂乱地使用 Object 变量,然后再进行强制类型转换 ...

  6. 《Java 核心技术卷1 第10版》学习笔记------调试技巧

    调试器是 Eclipse . NetBeans 这类专业集成开发环境的一部分 . 在启动调试器之前, 本节先给出一些有价值的建议 . 1 ) 可以用下面的方法打印或记录任意变量的值 : System. ...

  7. 《Java 核心技术卷1 第10版》学习笔记------日志

    日志 API 的优点: 可以很容易地取消全部日志记录, 或者仅仅取消某个级别的日志, 而且打开和关闭这个操作也很容易 . 可以很简单地禁止日志记录的输出, 因此, 将这些日志代码留在程序中的开销很小 ...

  8. 《Java 核心技术卷1 第10版》学习笔记------ 接口(Interface)

    接口技术作用:主要描述类具有什么功能,而并不给出每个功能的是的实现. Java的继承(inheritance)是不支持的多继承的,但是Java接口是支持多继承的. 一个 Java 类实现一个接口类就必 ...

  9. 《Java 核心技术卷1 第10版》学习笔记------ Object类的 hashCode 方法

    散列码( hash code ) 是由对象导出的一个整型值.散列码是没有规律的.如果 x 和 y 是两个不同的对象, x.hashCode( ) 与 y.hashCode( ) 基本上不会相同. 在表 ...

最新文章

  1. 设计模式_01_单一原则
  2. 数据结构之栈的应用:括号匹配问题
  3. python pillow环境_解决Python图片处理模块pillow使用中出现的问题
  4. Android项目开发—GeoQuiz
  5. python和json转换_python和json之间转化
  6. 命名空间“System.Web”中不存在类型或命名空间名称“HttpUtility”。是否缺少程序集引用?...
  7. 程序员误删,暂时不用离职了…… | 凌云时刻
  8. 记录一下自己简单的想法
  9. 微信小程序-使用ColorUI
  10. Java教学视频下载(全集)
  11. 自适应Simpson
  12. 什么是营销SaaS?
  13. 【嵌入式 C】C语言中格式输出二进制的两种方法
  14. ORA-00904: invalid identifier
  15. ZCMU - 1931: wjw的剪纸
  16. linux 中find命令下的-type f 代表什么意思
  17. grad-cam用于SSD目标检测
  18. css3论坛,css3学习参考手册
  19. JAVA基于坐标点求海拔
  20. 团队Github实战训练

热门文章

  1. 六十六、Leetcode数组系列(中篇)
  2. NeurIPS 2019 | 适用于众多模型的Embedding正则化方法
  3. 边缘和智能,是谁在借谁上位?
  4. 深度学习工具那么多,究竟哪款最适合你?| 线下沙龙 × 报名
  5. 腾讯AI Lab涂兆鹏:如何提升神经网络翻译的忠实度 | PhD Talk #22
  6. 乘法逆元总结 3种基本方法
  7. python画日漫_不能错过的Python漫画
  8. Mysql事务与锁深入剖析
  9. 深入理解Java虚拟机——JVM类加载机制(类加载过程和类加载器)
  10. 前端为什么有的接口明明是成功回调却执行了.catch失败回调_Web前端:ES6是干什么的?(下)...