包装类

包装类

概念

  • 基本数据类型所对应的引用数据类型
  • 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

补充方法
  1. equals()比较是否相等,equalsIgnoreCase()是忽略大小写的比较
  2. 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。注意:不能使用普通运算符

概述


注意点

  • 计算顺序问题,如下图
  • 除法除不尽的问题

加减乘除运算

posted @ 2022-04-02 18:35  无关风月7707  阅读(29)  评论(0编辑  收藏  举报