Java中的包装类(wrapper class)
1.介绍
顾名思义,包装类是封装Java原始类型的对象。每个Java原始类型都有一个对应的包装类:
| 基本类型 | 包装类 |
|---|---|
| boolean | Boolean |
| byte | Byte |
| short | Short |
| char | Character |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
这些都是在java.lang包中定义的,因此我们不需要手动导入它们。
2.包装类
那为什么要引入包装类?这个问题也是常见的面试题。
因为泛型类只处理对象,不支持原始类型。因此,如果我们想使用它们,就必须将原始类型值转换为包装类对象。例如,Java集合框架只处理对象。很久以前(在Java5之前,大约15年前)没有自动装箱,我们不能简单地对整数集合调用add(5)。
当时,这些原始类型值需要手动转换为相应的包装类并存储在集合中。
今天,通过自动装箱,我们可以很容易地执行ArrayList.add(101),但是Java在内部将原始类型值转换为整数,然后使用valueOf()方法将其存储在ArrayList中。
总结起来就是:Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。
3.原始类型转换为包装类
现在问题是:我们如何将原始类型值转换成相应的包装类,例如int到Integer或char到Character?
答案是:可以使用构造函数或静态工厂方法将原始类型值转换为包装类的对象。
但是,到了Java9,许多装箱原始类型(如Integer或Long)的构造函数已经被弃用。
所以强烈建议只对新代码使用工厂方法。让我们看一个在Java中将int值转换为Integer对象的示例:
Integer object = new Integer(1);
Integer anotherObject = Integer.valueOf(1);
valueOf()方法返回一个表示指定int值的实例。
它返回缓存的值,所以更高效。其缓存-128到127之间的值,但也可以缓存此范围之外的其他值。
同样的,我们还可以将布尔值转换为布尔值、字节转换为字节、字符转换为字符、长转换为长、浮点数转换为浮点数、双精度转换为双精度。不过,如果必须将字符串转换为整数,则需要使用parseInt()方法,因为String不是包装类。
另一方面,要从包装类对象转换为原始类型值,可以使用相应的方法,如intValue()、doubleValue()等:
int val = object.intValue();
4.自动装箱和拆箱
在上一节中,我们演示了如何手动将原始类型值转换为对象。在Java5之后,这种转换可以通过使用称为自动装箱和取消装箱的特性自动完成。“装箱”是指将原始类型值转换为相应的包装器对象。因为这可以自动发生,所以称为自动装箱。类似地,当包装器对象被展开为一个原始类型值时,这被称为取消装箱。
实际上,这意味着我们可以将原始类型值传递给需要包装对象的方法,或将原始类型赋给需要对象的变量:
List<Integer> list = new ArrayList<>();
list.add(1); // autoboxing
Integer val = 2; // autoboxing
在本例中,Java将自动将原始类型int值转换为包装类对象。在内部,它使用valueOf()方法来转换。例如,以下代码是等效的:
Integer value = 3;
Integer value = Integer.valueOf(3);
虽然这使得转换更容易,代码更易读,但有些情况下我们不应该使用自动装箱,例如在循环中。
与自动装箱类似,给需要原始类型的方法传包装类对象或将其赋给原始类型变量时,会自动执行自动拆箱:
Integer object = new Integer(1);
int val1 = getSquareValue(object); //unboxing
int val2 = object; //unboxing
public static int getSquareValue(int i) {
return i*i;
}
基本上,如果我们编写了一个接受原始类型值或包装类对象的方法,我们仍然可以将这两个值传递给它们。Java将负责类型判断并完成自动装箱和拆箱,具体取决于上下文。
本文代码相对简单,不提供源码。
Java中的包装类(wrapper class)的更多相关文章
- Java 中的包装类
Java 中的包装类 相信各位小伙伴们对基本数据类型都非常熟悉,例如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性的,比如基本类型不能调用方法.功能简 ...
- Java学习--Java 中的包装类
Java 中的包装类 相信各位小伙伴们对基本数据类型都非常熟悉,例如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性的,比如基本类型不能调用方法.功能简 ...
- 别说你不知道java中的包装类,wrapper type,以及容易在自动拆箱中出现的问题
很多时候,会有人问你,你知道什么是包装类吗? 或者高端一点问你你知道,wrapper type,是什么吗? 然后你就懵逼了,学了java很多时候都不知道这是啥. 其实问你的人,可能只是想问你,java ...
- java中的包装类与装箱拆箱定义
JAVA 中int类型转String类型的通常方法,有三种: 1.String.valueOf(int i) 2.Integer.toString(int i) 3.i+"" ...
- 深入浅出 Java 中的包装类
前阵子,我们分享了<Java中的基本数据类型转换>这篇文章,对许多粉丝还是有带来帮助的,今天讲一下 Java 包装类的的由来,及自动装箱.拆箱的概念和原理. 什么是包装类型 Java 设计 ...
- Java 基本类型包装类Wrapper
一.包装类概述 1.为什么需要包装类 Java并不是纯面向对象的语言.Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的.基本数据类型有它的优势:性能(效率高,节省空间). ...
- java中Integer包装类的具体解说(java二进制操作,全部进制转换)
程序猿都非常懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往须要操作Integer,或者各种进制的转换等等.我今天就为大家具体解说一下Integer的使用吧.看代码: ...
- java中的包装类
每一个包装类都对应一种基本数据类型.包装类有:Integer.character.Byte.Short.Long.Floot.Double.Boolean这八种,分别对应的基本数据类型是:int.ch ...
- wsdl 关于nillable和minOccurs 在.NET和java中的不同
术语约定文章中会反复出现[值类型].[包装类型].[普通引用类型].[元素节点]和[元素取值]的表述1> [值类型]指的是java和.NET中的基本数据类型,如:int:2> [包装类型] ...
- java 中的常用类
Java 中的包装类 相信各位小伙伴们对基本数据类型都非常熟悉,例如 int.float.double.boolean.char 等. 基本数据类型是不具备对象的特性的,比如基本类型不能调用方法.功能 ...
随机推荐
- Redis不同版本,内存分配,硬件的性能研究
Redis不同版本,内存分配,硬件的性能研究 前言 Konw more ! Do more ! Gain more ! 骨折之后开始减肥. 前段时间跳绳导致膝盖不舒服,现在改骑车和走路. 在有限的没人 ...
- [转帖]如何在KingbaseES数据库查看数据库和表的大小
关键字 kingbaseES,数据库大小,表大小 1.查看单个数据库的大小 使用ksql连接到数据库,使用sys_database_size函数 kapp=# select sys_database_ ...
- [转帖]针对容器的nginx优化
针对容器的nginx优化 本篇文章介绍了 Nginx 在容器内使用遇到的CPU核数获取问题以及对应的解决方法. 回顾上篇文章:TCP 半连接队列和全连接队列 背景 容器技术越来越普遍,很多公司已经将容 ...
- Python学习之七_input和print
Python学习之七_input和print 摘要 python3 之后 函数必须带 () 了 因为我开始学习的比较晚, 所以准备Python3开始学起 前面主要是模仿别人的代码进行学习 后续慢慢学习 ...
- Linux下面rsync 实现 完全一致的同步方法
1. 在某些特殊的linux机器上面, 比如龙芯后者是飞腾服务器,部分工具不太好用, 需要使用x86弄好之后进行同步过去, 这个时候scp 最简单但是网络流量非常大, 不如使用rsync, rsync ...
- IPMI的简单使用
背景 公司一台十一年前的服务器砸到我手中,要重装CentOS7的操作系统. 本着不想进机房, 不想格式化U盘的想法, 想用BMC进行安装系统. 遇到的第一个问题是不知道密码. 询问之前的机器持有人,也 ...
- log4j-漏洞修复
Log4j漏洞修复 修复参考文档:https://www.cert.org.cn/publish/main/9/2021/20211215154225883558274/202112151542258 ...
- 【验证码逆向专栏】最新某度旋转验证码 v2 逆向分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容.敏感网址.数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许 ...
- 【验证码逆向专栏】某度滑块、点选、旋转验证码 v1、v2 逆向分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容.敏感网址.数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许 ...
- 从零开始配置vim(24)——自动补全
neovim 自带的代码补全的效果并不好,而且它分为好多类,如果需要人为的去判断使用路径补全.使用当前buffer中的单词补全.亦或者使用include 来进行补全,那样使用起来就很不方便了.针对代码 ...