一、说明
API(应用程序接口):
数据接口:获取数据(前后端分离),数据可视化
功能接口:手机短信接口,邮箱发送接口,支付接口
Java中的常用API:
指的是常用的一些类的方法。
二、API
(1)Object
Object是Java中所有类的直接或间接父类。
Object上的常用方法:
1--native
是一个本地方法(native),将当前对象进行克隆,被克隆对象所在的类必须实现Cloneable接口。
克隆,相当于复制。基于已经存在的对象克隆出一个属性相同的对象来。
Object clone();
2--处理垃圾对象
当前类所创建的对象,如果没有引用时,被判定为垃圾对象,但是该对象不是被立即回收,而是达到了垃圾回收器的条件时触发,在触发对象回收时,会调用该方法,完成资源的清理。
这个概念有点类似于析构(当对象没有引用时,会自动调用方法,完成对象所持有资源的释放,并清理对象)但是java中的finalize,不等同于析构。java没有析构的概念。 System.gc(); 唤醒垃圾回收器,清理垃圾对象。但是垃圾回收器不一定会立即执行。
如果在对象不被使用时,释放对象所占用资源,应该自己编写相应的代码实现。 void finalize();
3--获取对象的实际类型
Class<?> getClass();
4--哈希码
可以认为是唯一的,同一个对象的哈希码一致,不同对象的哈希码不同。
取值大概是43亿个,哈希码的取值是散列的,随机分布在这43亿个取值范围中 hashCode()
5--比较两个对象地址是否相同
通常情况下,equals方法需要重写 实现当两个引用地址不同,但是属性相同时,也可以判定为相等。
boolean equals(Object obj);
instanceof关键字:用于判断某个对象是否为指定的类型
Ag:obj instanceof ClassName
null关键字:
1、表示当前的引用地址为空,也作为对象中引用类型属性的默认值。
2、null可以用于比较是否相等,但不能做其他任何操作否则会抛空指针异常
6--进行代码调试
如果将一个对象作为字符串打印输出,则该方法的返回值就作为要打印的内容,一般作为代码调试。 String toString()
7--其他方法:
与线程通信相关方法:
notify() //唤醒线程池中的任意一个线程
notifyAll() //唤醒所有线程
wait(long timeout) //线程等待(挂起),并设置超时时间wait()
(2)String
1--定义
表示字符串,并且是一个最终(final)类。
字符串拼接问题:
在使用“+”对字符串拼接时,实际上使用的是new StringBuilder().append().
如果遇到需要循环拼接字符串的场景,则应该使用StringBuilder(),节约内存空间.
在字符串拼接的应用中有两个类都可以处理:
StringBuilder:(默认),存在多线程并发安全问题,线程不安全类。并发效率高
StringBuffer: 加入了关键字synchronized,保证线程安全。并发效率相比StringBuilder较低。
字符串String实际上是char value[](字符数组)
2--常用方法:
charAt(int index)---获取指定位置上的字符;如果指定的下标不存在,则会出现StringIndexOutOfBoundsException
length()---获取字符串的长度
toCharArray()---将字符串转化为一个字符数组
compareTo(String str)---按字典顺序(实际上就是按照从小到大的顺序)来比较两个字符串
concat(String str)---拼接两个字符串,返回一个新字符串
getBytes(String charsetName)---将字符串按照指定的编码转化为字节数组 equals(Object o)---比较两个字符串是否一致。比较的是两个字符串的实际值 endsWith(String suffix)---判断是否是指定的结尾
startsWith(String suffix)---判断是否是指定的开头
contains(String str) ---判断字符串中是否包含str。
hashCode()---获取对象的哈希码---注意,同一个字符串的哈希码在任何条件下都是一样的。
String(char[] cs, int index, int offset)---表示从字符数组cs的第index位开始,将offset个元素转化为字符串
indexOf(int ch, int index)---表示从字符串的第index位开始,向后寻找字符ch第一次出现的位置;如果找不到,则返回-1
(3)正则表达式
1--定义
使用一些具有特殊含义的元字符,编写字符串的匹配规则。 Regex --- Pattern
2--案例
Pattern p = Pattern.compile("a*b"); //基于传入的正则构建正则表达式对象
Matcher m = p.matcher("aaaaab"); //调用匹配器,匹配传入的字符串
boolean b = m.matches(); //判断是否匹配成功
3--常用元字符
一个“.” //表示匹配除换行符以外的任意字符
一个“*” //匹配前一个字符出现0次或多次
一个“+” //匹配前一个字符出现至少一次
{n} //匹配前一个字符出现n次
{n,m} //匹配前一个字符出现>=n 且 <=m次 {8, 16}
{n,} //匹配前一个字符出现至少n次
^ //匹配开始位置,例如:匹配以abc为开始 "^abc"
$ //匹配结束位置,例如:匹配以jpeg为结束 "jpeg$"
[] //匹配其中的任意一个字符, "f[ao]t" fat, fot
[-] //如果连字符“-”在选择匹配中出现,可以表示区间范围 [a-zA-Z_], [0-9]
[^] //排除选择匹配中出现的所有字符
() //分组捕获,出现在括号中的内容会被添加到一个数组中,并且从1开始编号。
//被分组后的内容可以根据编号进行反向引用
\1 (从捕获的数组中提取下标为1的单元)
| //表示或者 “ab|cd” ,匹配ab或者cd
\d //匹配0-9之间任意一个数
\s //匹配特殊的控制符,空格,制表符,换行符
\w //与[a-zA-Z_]相同
4--方法说明
group([int i]) //从捕获的分组中提取指定下标的单元,但是在调用之前一定要先确认 是否匹配成功 ,即先调用matches()为true时再提取 如果group参数为0表示提取数组中第一个元素也就是完全匹配的所有内容。
爬虫案例: //爬虫 //从a标签上提取url地址 - 正则
String content = "<a href=\"https://www.baidu.com?abc=354sdfsdf\">百度</a>";
Pattern pattern = Pattern.compile("<a href=\"(.*)\">百度</a>");
Matcher matcher = pattern.matcher(content);
//System.out.println(matcher.matches());
if(matcher.matches()){
//提取url
String group = matcher.group(1);
System.out.println(group);
}
练习:
1、匹配手机号是否符合规范
2、匹配邮箱地址是否符合规范
package day1031;
import java.util.Scanner;
public class Demo01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num;
do {
System.out.println("请输入要执行的序号:" + "\n" + "\t" + "1:进行手机号判断" + "\n" + "\t" + "2:进行邮箱判断" + "\n" + "\t" + "3:退出");
num = sc.nextInt();
switch (num) {
case 3:
System.out.println("已退出!");
break;
case 1:
/**
* 判断手机号格式是否正确
*/
System.out.println("请输入一个手机号");
Scanner scanner = new Scanner(System.in);
String number = scanner.next();
String pattern = "^1[3-9]\\d{9}$";
String phoneNumber = number;
if (phoneNumber.matches(pattern)) {
System.out.println("手机号码格式正确!");
} else {
System.out.println("手机号码格式不正确!");
}
break;
case 2:
/**
*判断邮箱格式是否正确
*/
System.out.println("请输入一个邮箱地址");
Scanner scan = new Scanner(System.in);
String number4 = scan.next();
String regex = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";
if (number4.matches(regex)){
System.out.println("邮箱地址正确!");
}else {
System.out.println("邮箱地址错误!");
}
break;
default:
System.out.println("选择无效,请重新输入");
break;
}
}while (num!=3);
}
}
(4)数学相关类
1--Math
addExact(5, 19); //加法运算
subtractExact(25, 9); //减法运算
multiplyExact(2, 8); //乘法运算
floorDiv(3, 2); //除法运算
abs(-9); //绝对值
pow(2, 3); //次幂
max(8, 9); //最大值
min(2, 7); //最小值
random(); //返回一个0-1之间的随机数,返回double类型
ceil(double a); //向上取整
floor(double a);//向下取整
注意: 对于浮点数而言,在计算机底层做换算时会被转为无限循环的小数。
1.3 - 1.333333333;因此在处理精度要求更高的场景推荐使用下面的类。
2--BigDecimal
在BigDecimal中,数值会被作为字符串进行处理。
//将数值封装为BigDecimal对象
BigDecimal num1 = new BigDecimal("数字")
BigDecimal num2 = new BigDecimal("数字")
常用方法:
num1.add(num2); //加法运算
num1.subtract(num2); //减法运算
num1.multiply(num2); //乘法运算
num1.divide(num2); //除法运算
num1.abs(); //绝对值
num1.pow(3); //次幂
num1.max(num2); //最大值
num1.min(num2); //最小值
案例:
BigDecimal n1 = new BigDecimal("3");
BigDecimal n2 = new BigDecimal("2");
BigDecimal divide = n1.divide(n2);
System.out.println(divide.doubleValue());
(5)包装类
针对java中的基本数据类型(基本类型变量上没有属性&方法)。而java称为纯面向对象语言,因此对基本类型做了相应的包装类型。
基础 | byteshort | char | int | long | float | double | boolean |
包装 | ByteShort | Character | Integer | Long | Float | Double | Boolean |
注意:自jdk1.5开始,java支持将基础类型的值直接赋值给包装类型,反之也可以。
包装类型 = 基础类型 //封箱
基础类型 = 包装类型 //拆箱
封箱的过程实际上调用的是包装类身上的valueOf()方法实现。
Integer valueOf(int i)
拆箱的过程中实际调用的是包装类身上的*Value()方法。
(6)日期类
在方法身上添加了@Deprecated注解的,表示官方即将在以后的版本不再支持,即将被废弃。
jdk1.8之前:
Date //表示日期类
getTime() //返回从1970-1-1 0:0:0 到当前时间的秒数(时间戳)
Calendar //日历
getInstance() //返回当前日期的Calendar对象
set() //设置时间
SimpleDateFormat 日期格式化
SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format(Date date) //将日期对象根据格式转为对应的字符串
jdk1.8开始:
LocalDateTime 日期时间
LocalDate 日期
LocalTime 时间
Duration 时间
Period 日期
LocalDateTime:
now() //返回当前日期的LocalDateTime对象
of(...) //将指定的日期时间转为LocalDateTime对象
案例:
LocalDateTime now = LocalDateTime.now();
Stringformat=now.format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss"));
System.out.println(format);
(7)异常
1--定义
异常是java中用于问题反馈的机制。(ERROR 错误, Exception异常)
ERROR: 不应该尝试捕获,是程序正常运行过程中出现的不可避免的严重问题。 Exception:异常对于程序员来说是可控的。
错误和异常都是直接继承java.lang.Throwable 。
2--异常处理
1、在方法上可以抛出异常 hrows 异常类型
2、捕获
3--异常的分类
1--编译时异常: 在编译阶段抛出的异常,这种异常是必须要解决的。
2--运行时异常: 在运行时有可能会出现的异常,这种异常可以处理也可以不处理。 如果该异常类型是RuntimeException的子类都属于运行时异常。
4--如何通过抛异常进行问题反馈
可以通过throw 配合异常实现
在方法中:
throw new 异常类("");
注意:如果抛出的是编译时异常,则需要在方法参数列表后使用throws 抛出, 如果是运行时异常,可以不用在方法上抛。
5--异常捕获处理办法
a、如果捕获的每个异常都有自己的处理办法,就需要分别捕获
b、如果所有异常处理都相同,则可以直接找这些异常的共同父类。
c、如果多个异常需要进行分组处理,那么同一组的异常之间可以用 | 隔开 --- JDK1.7 (不能出现有直接继承关系的异常类)
6--自定义异常
类继承Exception--相当于自定义了一个编译时异常类。
类继承RuntimeException--相当于自定义了一个运行时异常类。
练习:
1、输入一个字符串和一个数字,数字表示字节个数,然后按照指定的字节个数来截取这个字符串,要求不准出现半个字符的现象
2、输入一个字符串,提取这个字符串中的数字并求和 -> sdf85dfghd72s6 -> 8 5 7 2 6 -> 28
3、输入一个字符串,提取这个字符串中的数字并排序->sdf85dfghd72s6 -> 8 5 7 2 6 -> 2 5 6 7 8
4、输入一个字符串,利用charAt方法判断这个字符串是否是一个回文字符串
5、输入一个字符串,统计每个字符出现的个数---hsoafngifaoa -> h:1 s:1 o:2 a:3 f:2 n:1 g:2 i:1