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()的区别
- == 是运算符,equals()是方法
- == 判断引用数据类型是比较内存地址,equals()也是比较内存地址
- 如果重写equals()则比较内容,比如 String 类的 equals()
c、查看String类重写equals()的底层代码
上述代码中,value并没有在上述截图中有定义,因为在源码中,value在其他地方定义了,所以这里并没有放出相关截图,需要的可自行去查看源码,作用在上述截图中已经解释。
解释:
- 先判断内存地址是否相等,如果相等,说明引用的是同一个对象,就没有比较的必要。
- 判断是否是相同类型的对象,如果对象都不同,也就没有比较的必要了。
- 重点:接着如果是相同类型的对象,就需要强转,把 Object 这个父类转换成 String 这个子类,因为后面需要调用到 String 类独有的方法,父类是不能调用到子类独有的方法的。
- 接着就是取出字符串的长度,这个在 String 类中,已经把字符串转换成字符数组。然后比较长度,如果长度不同,也没有比较的必要。
- 一路判断下来,如果都没问题,最后就是循环判断字母是否相等,只要有一个不等,就返回 false,如果都相等,就返回 true。
2、自定义对象,重写equals()方法
自定义 User 对象,然后创建两个对象,进行比较。
然后就是重写 equal()方法:
这样,重写方法就完成了。