首页 > 技术文章 > 15、包装类及常用API

DarkSki 2022-03-08 23:42 原文

一、包装类(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

graph BT String --> charsequence AbstractStringBuilder --> Appendable AbstractStringBuilder --> charsequence StringBuilder --> AbstractStringBuilder StringBuffer --> AbstractStringBuilder

(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类

推荐阅读