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

Java中的包装类

目录

为什么要有包装类

包装类的作用

基本数据类型和包装类的对应关系

包装类的核心功能

装箱(Boxing)和拆箱(Unboxing)

装箱:

拆箱:

类型转换

字符串<----->基本类型

进制转换

自动装箱与拆箱(Autoboxing)

128陷阱


为什么要有包装类

Java是面向对象编程的,但是基本类型却没有对象,这就会产生矛盾,于是包装类为了解决这一问题应运而生。

包装类的作用

  1. 让基本类型具备对象的特性

    可以参与面向对象的操作(如存入 List、作为方法参数传递)
  2. 提供丰富的工具方法

    类型转换、进制转换、最大值/最小值常量等
  3. 支持泛型

    泛型只能使用对象(如 List<Integer>,不能是 List<int>

基本数据类型和包装类的对应关系

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
charCharacter
floatFloat
doubleDouble
booleanBoolean

包装类的核心功能

装箱(Boxing)和拆箱(Unboxing)

装箱:

基本类型----->包装类对象

Integer num = Integer.valueOf(10); // 手动装箱(推荐)
Integer num2 = 10;                // 自动装箱(Java 5+)

拆箱:

包装类对象------>基本类型

int n = num.intValue(); // 手动拆箱
int n2 = num;          // 自动拆箱

类型转换

字符串<----->基本类型

int num = Integer.parseInt("123");      // 字符串 → int
String s = Integer.toString(123);       // int → 字符串
double d = Double.parseDouble("3.14");  // 字符串 → double

进制转换

String binary = Integer.toBinaryString(10); // 10 → "1010"(二进制)
String hex = Integer.toHexString(255);      // 255 → "ff"(十六进制)

自动装箱与拆箱(Autoboxing)

// 自动装箱(编译后实际调用 Integer.valueOf(10))
Integer num = 10; // 自动拆箱(编译后实际调用 num.intValue())
int n = num; 

128陷阱

Integer num1=100;
Integer num2=100;
System.out.println(num1 == num2);   Integer num3=200;
Integer num4=200;
System.out.println(num3 == num4);	

大家到文章底部猜一下两个输出分别是什么


答案:

truefalse

原因:因为Integer在编译时,会变为 Integer.valueof(),我们看该方法的原码,会发现其是用一个cache数组来存储数据的,如下:

而对于cache数组,我们查看其源码:

发现其大小是-128~127,也就是说,当Integer的值是出于-128~127之间时,会直接使用cache数组中已经存储好的值,再看valueof的原码,当数据是在这个范围外时,就会在堆内存中新开辟一个Integer的空间所以此时num3==num4的值为false


小练习

接下来我们可以继续通过练习来掌握

public static void main(String[] args) {int a = 10;int b = 10;Integer a1 = 10;Integer b1 = 10;Integer a2 = new Integer(10);Integer b2 = new Integer( 10);System.out.println(a == b);		//trueSystem.out.println(a1==b1);		//true,Integer的值在-128~127之间,所以此时用的是cache数组中的值,所以trueSystem.out.println(a2== b2);	//false,a2和b2都是新开辟的Integer对象,所以地址不同,所以falseSystem.out.println(a1 == a);	//true,当包装类用==与基本数据类型比较时,会自动拆箱	System.out.println(a1.equals(a));	//true,此时会自动装箱,与上一个情况类似System.out.println(a1 == a2);	//false,地址不同,a2是新开辟的,a1是cache数组中的System.out.println(a == a2);	//自动拆箱}

总结

特性说明
基本类型转对象使用 valueOf() 或自动装箱
对象转基本类型使用 xxxValue() 或自动拆箱
类型转换parseXxx() 将字符串转为基本类型,toString() 反之
128陷阱== 比较范围受限(-128~127)
http://www.xdnf.cn/news/361981.html

相关文章:

  • 量化学习DAY2-开始批量提交alpha!
  • 架构师在技术公司中的角色与价值创造
  • Linux ifconfig命令详解
  • Git回顾
  • 服务器不备案有影响吗
  • 依赖关系-根据依赖关系求候选码
  • 智慧校园安全可视化指挥调度系统解决方案
  • 【源码+论文】基于Vue3的企业后台管理系统设计与实现
  • Excel提取单元格特定符号左右两边内容
  • 损失函数(平方损失MSE、绝对值损失MAE、负对数似然损失NLL、交叉熵损失CEL和二元交叉熵损失BCE)原理、公式调库实现与手动实现
  • ISP流程介绍(Raw格式阶段)
  • 模板引用、组件基础
  • 打破虚拟与现实边界,赵伟辰Holo HK项目引领全球用户体验设计革新
  • 跟我学C++中级篇——STL容器的查找对比
  • [AI Tools] Dify 工具插件上传指南:如何将插件发布到官方市场
  • 软件测试的概念
  • 使用Kotlin Flow实现Android应用的响应式编程
  • MTB图像配准算法实现
  • Swagger 3.0 中注解详细示例
  • Linux云计算训练营笔记day05(Rocky Linux中的命令:管道操作 |、wc、find、vim)
  • linux mcelog inject注入
  • 21.第二阶段x64游戏实战-分析采集物偏移
  • C语言printf使用错误导致程序崩溃
  • 39-算法打卡-二叉树-基础知识-第三十九天
  • C#里创建一个MaterialDesign3的导航条
  • uni-app使用web-view组件APP实现返回上一页
  • 机器人手臂的坐标变换:一步步计算齐次矩阵过程 [特殊字符]
  • 商业 |阿里云又丢出了核弹
  • Webug4.0靶场通关笔记24- 第29关Webshell爆破
  • 华为OceanStor 5500 V3存储证书过期问题处理