15、常用类
一、包装类(wrapper)
1、为什么需要包装类?
Java是一种面向对象语言,Java中的类把方法和数据连接在一起,构成了总包含式处理单元。在Java中不能定义基本类型对象,为了能将基本类型视为对象进行处理,并能连接相关方法,Java为每个基本类型都提供了包装方法。
Java可以直接处理基本数据类型,但有时也需要将其当作对象进行处理,这时就需要将其转换为包装类。
2、包装类
基本类型 | 对应的包装类 | 父类 |
---|---|---|
int | Integer | java.lang.Number |
long | Long | java.lang.Number |
double | Double | java.lang.Number |
short | Short | java.lang.Number |
float | Float | java.lang.Number |
byte | Byte | java.lang.number |
char | Character | java.lang.Object |
boolean | Boolean | java.lang.Object |
3、包装类和基本数据类型的转换
(1)装箱和拆箱
- 装箱:将基本数据类型转换为包装类对象
- 拆箱:将包装类中包装的基本数据类型取出
(2)语法
-
装箱
- 手动装箱
int i = 10; Integer n = new Integer(i); Integer n = Integer.valueOf(i);
- 自动装箱
Integer n = 10;
-
拆箱
- 手动拆箱
Integer n = new Integer(99); int i = n.intValue();
- 自动拆箱
int i = n;
4、包装类和String类之间的转换
(1)包装类——》String类
Integer i = 100;
//(1)
String str = i + "";
//(2)调用Integer的toString()方法
String str = i.toString();
//(3)调用String的valueOf()方法
String str = String.valueOf(i);
(2)String类——》包装类
String str = "12345";
//(1)调用Integer类parseInt()方法,将str变成int型,自动装箱
Integer i = Integer.parseInt(str);
//(2)构造器
Integer i = new Integer(str);
二、String类
1、String类的理解
(1)String对象用于保存字符串,也就是一组字符序列
(2)字符串常量的对象是用双引号括起来的字符序列
(3)字符串的字符使用Unicode字符编码,一个字符占两个字节
(4)String常用构造器
- String s = new String();
- String s = new String(String original);
- String s = new String(char[] a);
- String s = new String(char[] a, int startIndex , int count);
(5)String类实现了
- Serializable接口:可以串行化,在网络传输,保存文件
- Comparable接口:对象可以比较大小
(6)String是final类,不能被其他类继承
(7)String有属性private final char[] value;
用于存放字符串内容,其本质仍是一个字符数组,是一个引用指向常量池中的字符数组,数组地址不可更改,但所指对象属性可以修改
2、创建String对象
(1)直接赋值:String s = "zyh";
(2)调用构造器:String s = new String("zyh");
(3)二者之间的区别
- 方式一:先查看常量池是否有“zyh”数据空间,若有则直接指向,若没有则创建”zyh“空间,然后指向——s指向常量池的空间地址
- 方式二:先在堆中创建对象空间,里面维护了value属性,是一个引用,指向常量池”zyh“空间,如果常量池无该空间,则新建,若有,则value指向该空间
(4)总的来说
- 对象在堆中,基本数据类型在栈中
- 对象的基本数据类型在堆中,引用类型将地址存在堆中
- 若引用的为对象,则引用指向对空间
- 若引用的为字符串,则引用指向方法区常量池的空间
- 类的属性,行为也在方法区加载
3、字符串的特性
(1)String是一个final类,代表该类不可继承,则不可被修改,避免了因为继承引起的安全隐患,但是其对象的属性可以修改
(2)字符串不可改变,即一个字符串对象一旦被分配,内容不可变
//问以下代码创建了几个对象
String s = "hello";
s = "world";
//答:创建了两个对象,”hello“对象一旦创建便不可更改,s指向了新建的“world”对象
(3)编译器会对String s = "hello" + "world";
优化为String s = "helloworld";
,即仅创建了一个对象
常量相加在常量池,变量相加在堆空间
4、String类的常用方法
方法 | 作用 | 例子 |
---|---|---|
equals() | 区分大小写,判断是否相等 | |
equalsgnoreCass() | 忽略大小写,判断是否相等 | |
length() | 获取字符个数,即字符串长度 | |
indexOf() | 获取字符在字符串中第一次出现的索引,若找不到则返回-1 | |
lastindexOf() | 获取字符在字符串中最后一次出现的索引,也是从0开始,若找不到返回-1 | |
substring() | 截取指定范围的子串 | substring(2, 5):取下表为2到4的元素 |
trim() | 去前后空格 | |
charAt() | 获取某索引处字符 | |
toUpperCase() | 转换成大写 | |
toLowerCase() | 转换成小写 | |
contat() | 拼接字符串 | |
replace() | 替换字符串中字符 | 对象本身不替换,返回结果是替换的 |
split() | 分割字符串 | 某些分割字符需要转义,如| ,\\ ,` |
toCharArray() | String——》字符数组 | |
compare() | 比大小,前大返正,前小返负,等返0 | 长度一致:依次找不同,找到第一个不同字符为止,返回(前-后);长度不一致:同上,若长度小的于长度长的字符依次相同,则返回前者长度-后者长度 |
format() | 格式化字符串 | 见下 |
intern() | 与此字符串相同内容的常量池中的字符串 |
//format()的使用
String info = String.format("我的名字%s,成绩%.2f,性别%c", name, grade, sex);
//-->优化
String formatStr = ("我的名字%s,成绩%.2f,性别%c");
String info = String.format(formatStr, name, grade, sex);
三、StringBuffer类
1、为什么需要StringBuffer类
String类保存字符串常量,每次更新都要重新开辟新空间,效率较低,因此,Java设计者还提供了StringBuilde和StringBuffer类来增强String功能并提高效率
2、什么是StringBuffer
(1)AbstractStringBuilder类中储存字符串的数组为char[] value,不是final,则字符串不是常量,则value指向对空间中的字符数组地址
(2)StringBuffer为final类,不能被继承
(3)StringBuffer为可变的字符序列,可以堆字符串内容进行操作
(4)StringBuffer是一个容器
3、String VS StringBuffer
(1)String保存字符串常量,里面的值不可更改,每次更新,不论是调用构造器还是直接赋值,实际都是更改地址,效率较低
(2)StringBuffer保存字符常量,值可以更改,为内容更新,不用每次更新地址,效率较高
4、构造器
(1)StringBuffer()
:创建一个16字节char[],用于存放字符串
(2)StringBuffer(int)
:指定char[]大小
(3)StringBuffer(String str)
:将其内容初始化为指定内容,长度:str.length + 16
5、String——》StringBuffer
(1)使用构造器
String str = "zyhstu";
StringBuffer stringBuffer = new StringBuffer(str);
//返回了stringBNuffer对象,对str指向的对象无影响
(2)使用append方法
StringBufffer stringBuffer = new StringBuffer();//先声明,不初始化
stringBuffer = StringBuffer.append(str);
6、StringBuffer——》String
(1)toString()方法
StringBuffer stringBuffer = new StringBuffer("zyhstu");
String s = stringBuffer.toString();
(2)使用构造器
String s = new String(stringBuffer);
7、StringBuffer类常用方法
方法 | 作用 | 解释 |
---|---|---|
append() | 增 | |
deleted() | 删 | deleted(11, 14):删除[11,14)即索引为11到13的元素 |
replace() | 改 | replace(9, 11, "周芷若"):使用周芷若替换[9, 11)下标的字符 |
indexOf() | 查 | indexOf("张三丰"):查找指定字符第一次出现的索引,若无则返回-1 |
insert() | 插入 | insert(9,"赵敏"):下标为9,插入赵敏 |
length() | 长度 |
四、StringBuilder类
1、概述
此类提供衣服与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全的)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候,条件允许优先使用,在大多数实现中,StringBuilder类更快
(1)StringBuilder类是final类,不能被继承
(2)String Builder的方法,没做互斥处理,即无synchronized关键字,因此单线程情况下使用
2、String、StringBuffer和StringBuilder
(1)String Buffer和StringBuilder非常类似,均代表可变的字符序列,而且方法也一样
(2)String:不可变字符序列,效率低,但是复用率高
(3)StringBuffer:可变字符序列,效率较高,线程安全
(4)StringBuilder:可变字符序列,效率最高,线程不安全
五、数字处理类
1、Math类
Java中提供了一个执行数学基本运算的Math类,主要包括三角函数方法,指数函数方法,取整函数方法,取最大值、最小值以及平均值函数方法,这些方法都是static静态方法,具体查看API手册
2、随机数
(1)Math.random()方法
意义:Math.random()
:产生一个[0,1)之间的double型数字
(2)Random类
Java还提供了一种方式获取随机数,通过实例化Random类一个对象,可以创建一个随机数生成器
3、大数字运算
(1)BigInteger类
BigInteger类针对大整数的处理类
在对BigInteger进行加减乘除时,要调用相应的方法,且以字符串的形式存储
方法 | 作用 |
---|---|
a.add(b) | 加 |
a.substract(b) | 减 |
a.multiply(b) | 乘 |
a.divide(b) | 除 |
六、Arrays类
Java.util包的Arrays类包含了用来操作数组的各种方法
(1)Arrays.sort(arr)
:对数组排序
(2)借用匿名内部类定制排序:将对换元素位置的条件变换了,从而改变排序方式
Arrays.sort(arr, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
return (i2 - i1);
}
});
(3)二分搜索法进行查找,(必须排好序)
int index = Arrays.binarySearch(arr, 3)
若不存在,返回return -(low + 1);low是应该在的位置
(4)copyOf(arr, arr.lrngth):拷贝:从arr拷贝
- 若长度大于arr.length,在新数组后面加null
- 若长度小于0,则抛出异常
(5)fill(arr, 元素)
:在arr数组中填充元素
(6)Arrays.equals(arr1, arr2)
:比较数组元素是否一致
(7)Arrays.aslist(2, 3, 4)
:将元素转成list集合,返回aslist,编译类型为List(接口),运行类型为java.util.Arrays$ArrayList类