JAVASE(十三)常用类(二)包装类、工具类Arrays类
目录
一、包装类
1.定义
2.使用
3.装箱和拆箱
(1)装箱
(2)拆箱
(3)自动装箱和自动拆箱
(4)自动装箱细节问题
二、Arrays类
1.定义
2.使用
(1)比较方法equals
(2)排序方法sort
(3)输出方法toString
(4)二分查找方法binarySearch
(5)复制扩容方法copyOf
一、包装类
1.定义
之前学过的基本数据类型都是使用关键字进行定义的,这不符合java的面向语言思维方式。所以在设计的时候,每个基本数据类型都设计了一个对应的类。这些类统称为包装类。
其中int对应Integer,char对应Character,其余只是数据类型和类的首字母大小写不同,如long对应Long。
2.使用
每个包装类除了包含对应的基本数据类型的属性之外,还包括最大值,最小值等属性以及相关操作。
以Integer类为例,挑选一些方法作总结:
(1)构造方法
Integer(int a); 直接将a的值赋给Integer类中的属性value。
Integer(String a); 该方法的参数传入的字符串只能包含数字字符(0-9
)或可选的正负符号(+
/-
),不能有空格或其他非法字符。因为该构造方法内部调用 Integer.parseInt(String s)
方法,用来将字符串转换为整数。如:
运行结果:
(2)比较方法
public int compareTo(Integer a); 将当前对象的内容和参数对象的内容进行比较,大于返回1,等于返回0,小于返回-1。如图:
运行结果:
(3)转换方法
int intValue();返回包装类型的原始基本值。
static int parseInt(String s);将传进来一个字符串将其变成int型。
valueof(int a);或valueof(String s);将传进来的参数转换为Integer包装类。
3.装箱和拆箱
(1)装箱
将基本数据类型转换为包装类即为装箱。手动装箱有两种方式:
1.直接使用构造方法 。 Integer a=new Integer(String/int a);
2.通过valueof方法。 Integer s1=Integer.valueOf(String/int a);
(2)拆箱
将包装类转换为基本数据类型即为拆箱。通过intValue方法实现拆箱。
int a = Integer类型的变量.intValue();
(3)自动装箱和自动拆箱
装箱的时候默认调用valueof方法,自动实现装箱。拆箱的时候默认调用intValue方法,自动实现拆箱。如:
等价于
(4)自动装箱细节问题
如图:a和b都赋值127,输出a==b,c和d都赋值128,输出c==d
运行结果:
出现以上结果的原因是:为了节省空间,对-128到127之间的256个对象进行了数组的缓存。参数值在区间内时,valueOf方法就会直接返回数组对应的值。值相同时渠道的对象相同,类似String类型的字符串驻留的特性。当参数的值超过区间直接创建新对象 。上述示例中,a和b在区间内,所以指向的同一对象,但是c和d实际指向的是两个对象。
二、Arrays类
1.定义
java.util包下的Arrays类属于静态工具类,它的内部将构造方法私有化,不能用来创建对象;仅包含静态方法。这是java标准库中工具类的典型设计模式。
2.使用
(1)比较方法equals
对两个数组的元素内容进行比较。类中实现了方法重载。
底层逻辑如图,先后判断是否指向同一个数组,是否有一个数组是空,数组之间的长度是否相等以及数组内容是否相同。
示例:
运行结果:
数组本身也可直接调用equals方法,如上述示例中可以编写a.equals(b); 但是数组类中没有对该方法重写,所以调用的是Object类中的equals方法。只能判断两个数组的引用是否相同。
(2)排序方法sort
当方法中参数只有数组引用时,即对整个数组进行排序。也可以添加参数,实现对指定区间进行排序。如图:
运行结果:
注意在指定区间时,区间的值的范围为索引的范围,且指定区间的包含开始不包含结束。
当自定义类型的对象进行排序时,需要自定义类实现Comparable接口并重写compareTo方法。详细在后面篇章总结。
(3)输出方法toString
把数组对象的内容以字符串形式去输出。如果是由自定义类型的对象组成的数组,没有在类中重写toString方法时,输出的就是这些对象的地址。
例如,定义一个学生的数组,每个元素都是学生类型。如图:
输出结果如下:
首先Arrays类的toString方法的底层逻辑如图,其中for循环中调用了String类的valueOf方法:
String类的valueOf方法逻辑如图,该方法使用了条件运算符,当参数不为空的时候调用参数所属类的toString方法。而如果是自定义的类,没有重写toString方法,就会调用Object类中的该方法。
所以对于上述示例,如果想要输出每个元素对应的内容,就要在Student类中重写toString方法,如图:
此时再去执行上面的示例,运行结果如下:
需要注意的是Arrays类的toString方法并非是重写Object类,而是通过方法重载实现的独立的方法。对于基本类型的数组,调用Arrays类的toString方法逻辑如下(以float数组为例),显然是直接将数组元素值添加到输出的数组里:
(4)二分查找方法binarySearch
注意二分查找要求数组必须是有序的。格式和sort排序类似,既可以在整个数组中寻找,也可以指定区间进行寻找,同样包含开始不包含结束。查找成功返回对应索引,查找失败返回负数。
运行结果为:
(5)复制扩容方法copyOf
因为定义一个数组之后,其长度不能改变,可以利用该方法创建一个指定容量的新数组,并将原有数组内容复制到新数组里。
如:
运行结果如下: