包装类
包装类
概念
- 基本数据类型所对应的引用数据类型
- Object可统一所有数据,包装类的默认值是null
方法
1.类型转换与装箱、拆箱
装箱和拆箱
概念
装箱:栈--->堆(基本类型--->引用类型)。反之为拆箱
程序
JDK1.5前
1.5后自动装箱拆箱
运行结果
反编译理解自动装箱拆箱
查看反编译后的代码,发现装箱和拆箱操作IDEA自动帮我们完成了
2.基本类型和字符串转换
基本类型-->字符串
1.加号法
2.Integer.toString()法
toString法可以通过radix来将要转换的基本类型视为几进制
字符串-->基本类型
Integer.parseXXX
Boolean-->基本类型
"true"-->true,非"true"-->false
完整程序
Integer缓冲区
概念
面试题
如上图程序,同样是自动装箱,为何打印结果一个是true一个是false呢?
查看反编译后的代码
发现自动装箱用的是Integer.valueof()
可以推断,结果不同的原因就出在valueof上边
查看valueof源码
-
如果i在-128~127内,返回Integer缓冲区内的对象,原理如下图所示
将Integer缓冲区100的地址赋给integer3和integer4,integer3==integer4当然是true -
如果i不在-128~127内,直接在堆内重新开辟空间
相当于给程序中的integer5和integer6分别重新开辟各自的堆空间并将地址赋给5 6
地址不同,5当然不等于6
3.String(存疑)
概述
不可变性
如上图所示,首先在方法区的字符串池开辟"hello"空间,栈内的name指向"hello"区
把"zhangsan"赋给name,并不是把"hello"区改为"zhangsan",而是重新开辟"zhangsan"区,name改变指向对象改为"zhangsan"区
此时"hello"如果没人用,就变成垃圾了
将"zhangsan"同样赋值给name2,就实现了字符串常量共享,name和name2都指向"zhangsan"区,二者地址当然相同,如下图
- 用new String()方式创建字符串又不一样了
如图所示,此时"java"开辟了两个空间,一个在堆里一个在方法区内
此时栈内被赋值的str指向的是堆内的"java"区(其实是直接指向方法区的)
其实jdk6以前的版本是存在方法区的,之后的版本字符串常量池被移到堆中了
String常用方法
注意点都在以下的程序里边了
常用方法1
常用方法2
常用方法3
别忽略了空格
常用方法4
补充方法
- equals()比较是否相等,equalsIgnoreCase()是忽略大小写的比较
- compareTo()比较大小,比较的一般是两个字符串在编码表(字节表)里边的位置
compareTo是逐个比较,相同就往下比,不同就不比后边的了
上边也说了,一般是比位置,如果是下图这种情况肯定不是比位置了,比长度
String案例演示
3.插入easy
- replace:用easy text替换text
4.每个单词首字母大写
- 用split分开每个单词
- 每个单词首字母大写
- 将首字母大写后的每个单词再拼回一句话:upperfirst + str1[i].substring(1);
程序实现
something+arr[].substring(下标):代表将下标以及之后位置的字符和something拼接起来
如上图,将大写后的字母与第0位及其之后位置的字符拼接了
可变字符串
几个常用方法
注意点都在以下程序注释里了
验证StringBuilder比String速度快
String:
StringBuilder:
比较二者时间发现StringBuilder要比String快很多
BigDecimal的使用
为什么会出现以上情况呢?
因为double存储的是一个近似值,经过运算会出现很小的误差,如何消除这种误差呢?
借助BigDecimal。注意:不能使用普通运算符
概述
注意点
- 计算顺序问题,如下图
- 除法除不尽的问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律