2024.2.14 Java基础
1 常见API
1.1 Math类
概述
查看API文档,我们可以看到API文档中关于Math类的定义如下:
Math类所在包为java.lang包,因此在使用的时候不需要进行导包。并且Math类被final修饰了,因此该类是不能被继承的。
Math类包含执行基本数字运算的方法,我们可以使用Math类完成基本的数学运算。
要想使用Math类我们就需要先创建该类的对象,那么创建对象就需要借助于构造方法。因此我们就需要首先查看一下API文档,看看API文档中针对Math类有没有提供对应的构造方法。通过API文档来查看
一下Math类的成员,如下所示:
在API文档中没有体现可用的构造方法,因此我们就不能直接通过new关键字去创建Math类的对象。同时我们发现Math类中的方法都是静态的,因此在使用的时候我们可以直接通过类名去调用。在Math类中
常见方法介绍
我们要学习的Math的常见方法如下所示:
1 |
|
1.2 System类
概述
查看API文档,我们可以看到API文档中关于System类的定义如下:
System类所在包为java.lang包,因此在使用的时候不需要进行导包。并且System类被final修饰了,因此该类是不能被继承的。
System包含了系统操作的一些常用的方法。比如获取当前时间所对应的毫秒值,再比如终止当前JVM等等。
要想使用System类我们就需要先创建该类的对象,那么创建对象就需要借助于构造方法。因此我们就需要首先查看一下API文档,看看API文档中针对System类有没有提供对应的构造方法。通过API文档来
查看一下System类的成员,如下所示:
在API文档中没有体现可用的构造方法,因此我们就不能直接通过new关键字去创建System类的对象。同时我们发现System类中的方法都是静态的,因此在使用的时候我们可以直接通过类名去调用。
常见方法介绍
我们要学习的System类中的常见方法如下所示:
1 |
|
案例演示
接下来我们就来通过一些案例演示一下这些方法的特点。
案例1:演示currentTimeMillis方法
1 |
|
运行程序进行测试,控制台的输出结果如下:
1 |
|
获取到当前时间的毫秒值的意义:我们常常来需要统计某一段代码的执行时间。此时我们就可以在执行这段代码之前获取一次时间,在执行完毕以后再次获取一次系统时间,然后计算两个时间的差值,
这个差值就是这段代码执行完毕以后所需要的时间。如下代码所示:
1 |
|
案例3:演示arraycopy方法
方法参数说明:
1 |
|
arraycopy方法底层细节:
1.如果数据源数组和目的地数组都是基本数据类型,那么两者的类型必须保持一致,否则会报错
2.在拷贝的时候需要考虑数组的长度,如果超出范围也会报错
3.如果数据源数组和目的地数组都是引用数据类型,那么子类类型可以赋值给父类类型
*1.3 Runtime类
Runtime表示Java中运行时对象,可以获取到程序运行时设计到的一些信息。
常见方法介绍
我们要学习的Object类中的常见方法如下所示:
1 |
|
*1.4 Object类
查看API文档,我们可以看到API文档中关于Object类的定义如下:
Object类所在包是java.lang包。Object 是类层次结构的根,每个类都可以将 Object 作为超类。所有类都直接或者间接的继承自该类;换句话说,该类所具备的方法,其他所有类都继承了。
查看API文档我们可以看到,在Object类中提供了一个无参构造方法,如下所示:
但是一般情况下我们很少去主动的创建Object类的对象,调用其对应的方法。更多的是创建Object类的某个子类对象,然后通过子类对象调用Object类中的方法。
常见方法介绍
我们要学习的Object类中的常见方法如下所示:
1 |
|
toString小结:
- 在通过输出语句输出一个对象时,默认调用的就是toString()方法
- 输出地址值一般没有意义,我们可以通过重写toString方法去输出对应的成员变量信息(快捷键:atl + insert , 空白处 右键 -> Generate -> 选择toString)
- toString方法的作用:以良好的格式,更方便的展示对象中的属性值
- 一般情况下Jdk所提供的类都会重写Object类中的toString方法
equals小结:
- 默认情况下equals方法比较的是对象的地址值
- 比较对象的地址值是没有意义的,因此一般情况下我们都会重写Object类中的equals方法
对象克隆
把A对象的属性值完全拷贝给B对象,也叫对象拷贝,对象复制
对象克隆的分类:
深克隆和浅克隆
浅克隆:
不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来。基本数据类型拷贝过来的是具体的数据,引用数据类型拷贝过来的是地址值。
Object类默认的是浅克隆。
深克隆:
基本数据类型拷贝过来,字符串复用,引用数据类型会重新创建新的
1.5 Objects类
查看API文档,我们可以看到API文档中关于Objects类的定义如下:
Objects类所在包是在java.util包下,因此在使用的时候需要进行导包。并且Objects类是被final修饰的,因此该类不能被继承。
Objects类提供了一些对象常见操作的方法。比如判断对象是否相等,判断对象是否为null等等。
接下来我们来查看一下API文档,看一下Objects类中的成员,如下所示:
我们可以发现Objects类中无无参构造方法,因此我们不能使用new关键字去创建Objects的对象。同时我们可以发现Objects类中所提供的方法都是静态的。因此我们可以通过类名直接去调用这些方法。
常见方法介绍
我们要重点学习的Objects类中的常见方法如下所示:
1 |
|
我们要了解的Objects类中的常见方法如下所示:
1 |
|
*1.6 BigInteger类
平时在存储整数的时候,Java中默认是int类型,int类型有取值范围:-2147483648 ~ 2147483647。如果数字过大,我们可以使用long类型,但是如果long类型也表示不下怎么办呢?就需要用到BigInteger,可以理解为:大的整数。
有多大呢?理论上最大到42亿的21亿次方。
查看API文档,我们可以看到API文档中关于BigInteger类的定义如下:
BigInteger所在包是在java.math包下,因此在使用的时候就需要进行导包。我们可以使用BigInteger类进行大整数的计算
构造方法
1 |
|
构造方法小结:
- 如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取。
- 如果BigInteger表示的超出long的范围,可以用构造方法获取。
- 对象一旦创建,BigInteger内部记录的值不能发生改变。
- 只要进行计算都会产生一个新的BigInteger对象
常见成员方法
BigDecimal类中使用最多的还是提供的进行四则运算的方法,如下:
1 |
|
底层存储方式
对于计算机而言,其实是没有数据类型的概念的,都是0101010101,数据类型是编程语言自己规定的,所以在实际存储的时候,先把具体的数字变成二进制,每32个bit为一组,存储在数组中。
数组中最多能存储元素个数:21亿多
数组中每一位能表示的数字:42亿多
理论上,BigInteger能表示的最大数字为:42亿的21亿次方。
但是还没到这个数字,电脑的内存就会撑爆,所以一般认为BigInteger是无限的。
存储方式如图所示:
*1.7 BigDecimal类
在使用float或者double类型的数据在进行数学运算的时候,很有可能会产生精度丢失问题。我们都知道计算机底层在进行运算的时候,使用的都是二进制数据。当我们在程序中写了一个十进制数据 ,在进行运算的时候,计算机会将这个十进制数据转换成二进制数据,然后再进行运算,计算完毕以后计算机会把运算的结果再转换成十进制数据给我们展示。
如果我们使用的是整数类型的数据进行计算,那么在把十进制数据转换成二进制数据的时候不会存在精度问题;
如果我们的数据是一个浮点类型的数据,有的时候计算机并不会将这个数据完全转换成一个二进制数据,而是将这个将其转换成一个无限的趋近于这个十进数的二进制数据;
这样使用一个不太准确的数据进行运算的时候, 最终就会造成精度丢失。为了提高精度,Java就给我们提供了BigDecimal供我们进行数据运算。
查看API文档,我们可以看到API文档中关于BigDecimal类的定义如下:
BigDecimal所在包是在java.math包下,因此在使用的时候就需要进行导包。我们可以使用BigDecimal类进行更加精准的数据计算。
构造方法
要用BigDecimal类,那么就需要首先学习一下如何去创建BigDecimal的对象。通过查看API文档,我们可以发现Jdk中针对BigDecimal类提供了很多的构造方法,但是最常用的构造方法是:
了解完常见的构造方法以后,我们接下来就重点介绍一下常见的成员方法。
常见成员方法
BigDecimal类中使用最多的还是提供的进行四则运算的方法,如下:
1 |
|
如果使用BigDecimal类型的数据进行除法运算的时候,得到的结果是一个无限循环小数,那么就会报错:ArithmeticException。
针对这个问题怎么解决,此时我们就需要使用到BigDecimal类中另外一个divide方法,如下所示:
1 |
|
上述divide方法参数说明:
1 |
|
接下来我们就来演示一下这些取舍模式,代码如下所示:
1 |
|
小结:后期在进行两个数的除法运算的时候,我们常常使用的是可以设置取舍模式的divide方法。
底层存储方式
把数据看成字符串,遍历得到里面的每一个字符,把这些字符在ASCII码表上的值,都存储到数组中。
2 正则表达式
2.1 正则表达式-字符类
- 语法示例:
- [abc]:代表a或者b,或者c字符中的一个。
- [^abc]:代表除a,b,c以外的任何字符。
- [a-z]:代表a-z的所有小写字符中的一个。
- [A-Z]:代表A-Z的所有大写字符中的一个。
- [0-9]:代表0-9之间的某一个数字字符。
- [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
- [a-dm-p]:a 到 d 或 m 到 p之间的任意一个字符。
2.2 正则表达式-逻辑运算符
- 语法示例:
- &&:并且
- | :或者
- \ :转义字符
2.3 正则表达式-预定义字符
- 语法示例:
- “.” : 匹配任何字符。
- “\d”:任何数字[0-9]的简写;
- “\D”:任何非数字[^0-9]的简写;
- “\s”: 空白字符:[ \t\n\x0B\f\r] 的简写
- “\S”: 非空白字符:[^\s] 的简写
- “\w”:单词字符:[a-zA-Z_0-9]的简写
- “\W”:非单词字符:[^\w]
2.4 正则表达式-数量词
语法示例:
- X? : 0次或1次
- X* : 0次到多次
- X+ : 1次或多次
- X{n} : 恰好n次
- X{n,} : 至少n次
- X{n,m}: n到m次(n和m都是包含的)
其中,X代表字符。
正则表达式可以应用的场景:
字符串搜索:检查一个字符串是否包含某种模式的子串。
1
boolean contains = pattern.matcher(text).find();
字符串替换:将匹配到的字符串替换为另一个字符串。
1
2
3
4String result = pattern.matcher(text).replaceAll(replacement);
public String replaceAll(String regex,String newStr)
//参数regex表示一个正则表达式。可以将当前字符串中匹配regex正则表达式的字符串替换为newStr。数据验证:验证输入数据的格式,如邮箱、电话号码、日期、密码强度等。
1
boolean isValid = pattern.matcher(text).matches();
分割字符串:根据模式将一个字符串分割成多个子字符串。
1 |
|