Java基础(十一)——装箱、String类库(部分)、Date类和用法、BigInteger类和用法、BigDecimal和用法、Object类( ==和equals()方法 )

Java基础(十一)——常用类

一、 类库

Java提供了八个基本数据类型的包装类。意味着能把一个变量转换成一个对象。
在这里插入图片描述

1、装箱

a、手动装箱

从一个基本数据类型转换成对应包装类称为装箱。
在这里插入图片描述
可以看出数值没有变化,但是这里从变量转变成一个对象了。既然是对象,就可以执行内部的方法

这里内部提供了很多方法供我们使用,由于篇幅有限,只讲一部分:

b、Integer.parseInt(str)——String 转换成 int 类型的属性

在这里插入图片描述

c、手动拆箱

手动拆箱有两种办法。使用静态更好。
在这里插入图片描述

d、自动装箱——jdk1.5以后自动装拆箱

在这里插入图片描述

e、自动拆箱

在这里插入图片描述

之所以能自动装拆箱是编译的时候自动帮我们转换了代码。

查看反编译的文件就可得知,自动帮我们转换代码:
在这里插入图片描述

g、练习例题一

思考:会输出什么?
在这里插入图片描述
答案:会输出三个 false,因为 == 在对象中求的是内存地址,所以这里每一个都是新创建的对象,所以自然不相等。

h、练习例题2

思考:会输出什么?
在这里插入图片描述
答案:true,false,false

原因:因为上述代码中这种赋值用法,调用的是valueOf()这个方法, 点击前往底层查看代码可看到:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所以当大于等于 -128,小于等于127时,没有创建新对象,返回 cache,这个cache是一个数组。

在这里插入图片描述

所以只要在这个缓冲区范围里面的数,返回的都是同一个对象。所以第一个才会是 true.

2、String类库

a、str.toCharArray()——把字符串转化成字符数组

在这里插入图片描述

b、str.charAt(索引)——取出索引对应的字符

在这里插入图片描述

c、str.concat(“xx”)——在末尾追加字符串

这个跟 + 号,字符串拼接一样的效果。
在这里插入图片描述

d、str.contains(“xxx”)——判断是否包含指定的字符串

这里牵涉到字符串匹配算法,这里用的是暴力破解,就是一个个对比。
在这里插入图片描述

e、str.endsWith(“xx”)——判断此字符串是否以指定的字符串结尾

f、str.startsWith(“xx”)——判断此字符串是否以指定的字符串开头

g、str.equalsIgnoreCase(“xx”)——内容判断,不区分大小写

相对的,equals()区分大小写

h、str.getBytes()——转换成字节数组(IO流)

后续学到 IO 流会详细解释。

i、str.indexOf(‘x’)——根据字符找索引,找出字符第一次出现在字符串内的索引

j、str.indexOf(‘这里填字符’,这里填索引)——根据字符找索引,找出字符第一次出现在字符串内的索引,从指定的索引开始往后

k、isEmpty(‘xx’)——判断该字符串是否为空

要注意,就算里面是空(不是null),也返回的是 true。


还有很多相关方法,自行查阅 API 文档或者百度。

3、额外知识——StringBuffer和StringBuilder

StringBuffer:线程安全,可变的字符序列。

StringBuilder:线程不安全,可变字符序列。

4、Date类

a、常用的时间格式

Date类主要负责时间:
在这里插入图片描述
其中,人们习惯的时间格式通过 SimpleDateFormat 这个类来创建,且要自定义格式,格式如图:

yyyy——年份
MM——月
dd——天
HH——小时
mm——分钟
ss——秒钟

b、从1970年算起的时间格式

在这里插入图片描述
这里之所以显示的是9点,而不是1点,是因为此时此刻身处东八区,自动给我们加了八个小时。

5、BigInteger——大长度的int类型

BigInteger:大长度的 int 类型包装类。

众所周知,int 类型是有最大值的,如果超出最大值,会变成负数。

所以,有了BigInteger类:
在这里插入图片描述
注意,这里转换成了 String 类。

6、BigDecimal——精准运算的类

看以下小数代码运算:
在这里插入图片描述
明显知道是错误的,这是因为计算机在计算的时候是转换成二进制去运算的,所以这里出现了偏差。

所以这里使用 BigDecimal 类来精准运算:
在这里插入图片描述
这里跟上面一样,转换成了 String 类。

7、System.exit()——退出虚拟机

提问:会打印几句话?
在这里插入图片描述答案:一句话。就是“准备退出”。
虽然有 finally ,但是虚拟机都停用了,这里也就不再执行了。finally 对于那些非物理破坏的才会执行。

二、Object 类

在查看API文档时,可以看到:
在这里插入图片描述

最顶层有个 Object 类,但是查看代码时:
在这里插入图片描述
可以发现并没有继承到 Object 这个类。

Object 这个类,是比较特殊的类,是所有类直接或间接的父类,相当于所有类的祖宗,是根类,元类等叫法:
在这里插入图片描述

1、== 和 equals()方法

a、初了解 == 和equals()

当查看 Object 类中的方法时,可以看到,平时有用过比较字符串是否相等的一个方法,equals():
在这里插入图片描述

当查看内部的代码时,可以发现:
在这里插入图片描述

可以发现,内部调用的还是 == ,之前说过 String 类型比较不能用==,只能用 equals(),那这里为什么是用 == 呢?

我们试着比较一下:
在这里插入图片描述
右边注释的是正确答案。

b、== 和 equals()的区别

  1. == 是运算符,equals()是方法
  2. == 判断引用数据类型是比较内存地址,equals()也是比较内存地址
  3. 如果重写equals()则比较内容,比如 String 类的 equals()

c、查看String类重写equals()的底层代码

在这里插入图片描述
上述代码中,value并没有在上述截图中有定义,因为在源码中,value在其他地方定义了,所以这里并没有放出相关截图,需要的可自行去查看源码,作用在上述截图中已经解释。

解释:

  1. 先判断内存地址是否相等,如果相等,说明引用的是同一个对象,就没有比较的必要。
  2. 判断是否是相同类型的对象,如果对象都不同,也就没有比较的必要了。
  3. 重点:接着如果是相同类型的对象,就需要强转,把 Object 这个父类转换成 String 这个子类,因为后面需要调用到 String 类独有的方法,父类是不能调用到子类独有的方法的。
  4. 接着就是取出字符串的长度,这个在 String 类中,已经把字符串转换成字符数组。然后比较长度,如果长度不同,也没有比较的必要。
  5. 一路判断下来,如果都没问题,最后就是循环判断字母是否相等,只要有一个不等,就返回 false,如果都相等,就返回 true。

2、自定义对象,重写equals()方法

自定义 User 对象,然后创建两个对象,进行比较。
在这里插入图片描述

在这里插入图片描述
然后就是重写 equal()方法:
在这里插入图片描述
这样,重写方法就完成了。

猜你喜欢

转载自blog.csdn.net/qq_41824825/article/details/121234733
今日推荐