1.说明
API(应用程序接口):
数据接口:获取数据(前后端分离),数据可视化
功能接口:手机短信接口,邮箱发送接口,支付接口
java中的常用API指常用的一些类的方法。
2.API
1-object
是Java中所有类的直接或间接父类。
常用方法:
//是一个本地方法(native),将当前对象进行克隆,被克隆对象所在的类必须实现Cloneable接口。
克隆,相当于复制。基于已经存在的对象克隆出一个属性相同的对象来。
object clone( );
当前类所创建的对象,如果没有引用时,被判定为垃圾对象,但是该对象不是被立即回收。
而是达到了垃圾回收器的条件时触发,在触发对象回收时,会调用该方法,完成资源的清理。
这个概念有点类似于析构(当对象没有引用时,会自动调用方法,完成对象所持有资源的释放,并清理对象)但是java中的finalize,不等同于析构。java没有析构的概念。
System.gc(); 唤醒垃圾回收器,清理垃圾对象。但是垃圾回收器不一定会立即执行。
如果在对象不被使用时,释放对象所占用资源,应该自己编写相应的代码实现。
void finalize( );
class<?> getClass( ); //获取对象的实际类型
可以认为是唯一的—同一个对象的哈希码一致,不同对象的哈希码不同。
—取值大概是43亿个;哈希码的取值是散列的—随机分布在这43亿个取值范围中
hashCode( )
//用于比较两个对象的地址是否相同,通常情况下,equals方法需要重写
实现当两个引用地址不同,但是属性相同时,也可以判定为相等。
boolean equals(object obj);
instanceof 关键字,用于判断某个对象是否为指定的类型:
obj instanceof ClassName
null 关键字:表示当前的引用地址为空,也作为对象中引用类型属性的默认值。
null可以用于比较是否相等,但不能做其他任何操作否则会抛空指针异常
如果将一个对象作为字符串打印输出,则该方法的返回值就作为要打印的内容,一般作为代码调试。
String toString()
其他方法:与线程通信相关方法
notify( ) //唤醒线程池中的任意一个线程
notifyAll( ) //唤醒所有线程
wait (long timeout) //线程等待(挂起),并设置超时时间
wait( )
2-String
定义:
表示字符串,并且是一个最终(final)类。
字符串拼接问题:
在使用“+”对字符串拼接时,实际上使用的是new StringBuilder().append().
如果遇到需要循环拼接字符串的场景,则应该使用StringBuilder(),节约内存空间.
在字符串拼接的应用中有两个类都可以处理:
StringBuilder:(默认),存在多线程并发安全问题,线程不安全类。并发效率高
StringBuffer: 加入了关键字synchronized,保证线程安全。并发效率相比StringBuilder较低。
字符串String实际上是char value[](字符数组)
常用方法:
charAt(int index)—获取指定位置上的字符;如果指定的下标不存在,则会出现StringIndexOutOfBoundsException
String str = " helloworld ";
/**
* char
* 返回指定索引处的char值
* 从0处开始
*/
char ch = str.charAt(11);
System.out.println(ch);
length()—获取字符串的长度
String str = "hello,world";
System.out.println(str.length());
toCharArray()—将字符串转化为一个字符数组
compareTo(String str)—按字典顺序(实际上就是按照从小到大的顺序)来比较两个字符串
concat(String str)—拼接两个字符串,返回一个新字符串
/**
* concat
* 将指定字符串链接到此字符串结尾
* 不会修改原始字符串
* 也可以用于连接字符串和其他基本类型(int、double)
*/
String str = "hello,world";
String str1 = "离开";
String str2 = str.concat(str1);
System.out.println(str2);
getBytes(String charsetName)—将字符串按照指定的编码转化为字节数组
/**
* getBytes
*
*/
String tep = "hello 世界";
//使用UTF-8字符编码方式进行转换
byte[] bytesUTF8 = tep.getBytes();
System.out.println(bytesUTF8);
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-正则表达式
定义:
案列:
常用元字符:
. //表示匹配除换行符以外的任意字符
* //匹配前一个字符出现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]
[^] //排除选择匹配中出现的所有字符, “f[^ao]t”
() //分组捕获,出现在括号中的内容会被添加到一个数组中,并且从1开始编号。
//被分组后的内容可以根据编号进行反向引用 \1(从捕获的数组中提取下标为1的单元)
| //表示或者 “ab|cd” ,匹配ab或者cd
\d //匹配0-9之间任意一个数
\s //匹配特殊的控制符,空格,字符表
\w
方法说明
group([int i]) //从捕获的分组中提取指定下标的单元,但是在调用之前一定要确认是否匹配成功,即先调用matches()为true时再提取
如果group参数为0表示提取数组中第一个元素也就是完全匹配的所有内容。
爬虫案例:
//爬虫
String content = “<a href=“https://www.baidu.com?abc=354sdfsdf”>百度”;
//从a标签上提取url地址 - 正则
Pattern pattern = Pattern.compile(“<a href=”(.*)“>百度”);
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、匹配邮箱地址是否符合规范
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称为纯面向对象语言,因此对基本类型做了相应的包装类型。
基础 byte short char int long float double boolean
包装 Byte Short 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();
String format = 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-在方法上可以抛出异常
throws 异常类型
2-捕获
try{
//可能会存在异常的代码
}catch(异常类型 变量){
//异常处理
}catch(异常类型 变量){
//异常处理
}
…
finally {
//无论是否有异常产生都会被调用
}
3)异常的分类
编译时异常:
在编译阶段抛出的异常,这种异常是必须要解决的。
运行时异常:
在运行时有可能会出现的异常,这种异常可以处理也可以不处理。
如果该异常类型是RuntimeException的子类都属于运行时异常。
4)如何通过抛异常进行问题反馈
可以通过throw 配合异常实现
在方法中:
throw new 异常类(“”);
注意:如果抛出的是编译时异常,则需要在方法参数列表后使用throws 抛出,如果是运行时异常,可以不用在方法上抛。
5)异常捕获处理办法
a、如果捕获的每个异常都有自己的处理办法,就需要分别捕获
b、如果所有异常处理都相同,则可以直接找这些异常的共同父类。
c、如果多个异常需要进行分组处理,那么同一组的异常之间可以用 | 隔开 — JDK1.7
(不能出现有直接继承关系的异常类)
6)自定义异常
类继承Exception–相当于自定义了一个编译时异常类。
类继承RuntimeException–相当于自定义了一个运行时异常类。