当前位置: 首页 > news >正文

《Java核心技术 卷I》对象包装器与自动装箱

对象包装器与自动装箱

有时需要int这样的基本类型转换为对象,所有的基本类型都有一个与之对应的类。

例如,Integer类对应基本类型int,通常这些类称为包装类(wrapper)。

包装器类名字鲜明,Byte、Short、Integer、Long、Float、Double,这6个派生于公共的超类Number。

还有Character、Void、Boolean。

对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值,同时,对象包装器类还是final,因此不能定义它们的子类。

假设想定义一个整形数组列表,而尖括号中的类型参数不允许是基本类型,也就是说,不允许写成ArrayList,这里就用到了Integer对象包装类。

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

JavaSE5另一个改进之处是便于添加和获得数组元素,例如:

list.add(3)将自动地变换成list.add(Integer.valueOf(3))

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

相反的,将Integer对象赋值给一个int时,会自动地拆箱,int n = list.get(i);翻译成 int n = list.get(i).intValue();

在算术表达式中也能自动装箱和拆箱,Integer n = 3; n++;

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

由于Integer对象是不可变的,包含在包装器中的内容不会改变,不能使用这些包装器类创建修改数值参数的方法。

想要编写一个修改数值参数值的方法,就需要使用在org.omg.CORBA包中定义的持有者(holder)类型,包括IntHolder、BooleanHolder等。

API java.lang.Integer 1.0

  • int intValue(),以int的形式返回Integer对象的值
  • static String toString(int i),以一个新的String对象的形式返回给定数值i的十进制表示。
  • static String toString(int i, int radix),返回数值i的基于给定radix参数进制的表示。
  • static int parseInt(String s,int radix),返回字符串s表示的整形数值,给定字符串表示的十进制整数或者radix参数进制的整数。
  • static Integer valueOf(String s)
  • static Integer valueOf(String s,int radix),返回用s表示的整形数值进行初始化后的一个新Integer对象,给定字符串表示的是十进制的整数(第一种方法),或者radix参数进制的整数(第二种方法)。

API java.text.NumberFormat

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

参数数量可变的方法

调用打印方法。。。

    public PrintStream printf(String format, Object ... args) {return format(format, args);}

这里的省略号..是Java代码的一部分,表明这个方法可以接收任意数量的对象(除fmt参数之外)。

实际上,printf方法接收两个参数,一个是格式字符串,另一个是Object[]数组,其中保存着所有的参数(如果是基础类型,会自动装箱称为对象),然后扫描fmt字符串,并将第i个格式说明符与args[i]的值匹配起来,换句话说Object...参数类型和Object[]完全一样。

用户可以自己定义可变参数的方法,并将参数指定为任意类型,甚至是基本类型。下面是一个简单的示例:其功能为计算若干个数值的最大值。

package corejava;public class MaxDoubleTest {public static void main(String[] args) {System.out.println(max(3.232132,6.232344,5.823485));System.out.println(max());}public static double max(double... values) {double largest = Double.MIN_VALUE;for (double d : values) {if(d > largest) {largest = d;}}return largest;}}
//结果
//6.232344
//4.9E-324

编译器将new double[]{3.232132,6.232344,5.823485}传递给max方法

注释:允许将一个数组传给可变参数方法的最后一个参数。

System.out.printf("%d %s",new Object[] {new Integer(1), "widgets"}); //1 widgets

因此,可以将已经存在且最后一个参数是数组的方法重新定义为可变参数的方法,而不会破坏任何已经存在的代码。例如,MessageFormat.format在JavaSE5就采用了这种方式,甚至可以将main方法声明为如下形式:

public static void main(String... args) {System.out.println(max(3.232132,6.232344,5.823485));System.out.println(max());System.out.printf("%d %s",new Object[] {new Integer(1), "widgets"});}


http://www.mrgr.cn/news/64014.html

相关文章:

  • “炼心”和“练心”的区别是什么
  • Python 遍历字典
  • .NET Core WebApi第7讲:项目的发布与部署
  • pandas——DataFrame
  • Vue 3 Vite 项目打包优化:自动删除指定文件的方法
  • 论文概览 |《Journal of Transport Geography》2024.10 Vol.120
  • 代码随想录 -- 动态规划 -- 01背包理论基础(滚动数组)
  • 从0开始学统计-什么是中心极限定理
  • 秒杀优化(异步秒杀,基于redis-stream实现消息队列)
  • 使用列表推导式处理列表中符合条件的元素将结果组成新的列表
  • Iceoryx2:高性能进程间通信框架(中间件)
  • Redis到底支不支持事务?半事务
  • 《业务三板斧:定目标、抓过程、拿结果》读书笔记5
  • 基于Spring Boot的信息学科平台系统开发指南
  • 知识蒸馏概念(Knowledge Distillation)的学习
  • Git下载-连接码云-保姆级教学(连接Gitee失败的解决)
  • 在线QP(QuotedPrintable)编码解码工具
  • 从需求到实践:中国少儿编程教育的崛起与家长教育理念的变迁
  • 4款学术型AI神器,文献管理、论文投稿写作!
  • 300元左右的性价比头戴式耳机怎么选?盘点四款性价比爆表机型推荐
  • 【MySQL】 运维篇—故障排除与性能调优:案例分析与故障排除练习
  • SpringBoot中使用多线程ThreadPoolTaskExecutor+CompletableFuture
  • RHCE第五天笔记
  • 【论文源码实战】EdgeYOLO: 边缘设备友好的无锚框检测器
  • Linux高阶——1027—守护进程
  • LeetCode207. 课程表(2024秋季每日一题 55)