1、Cleaner类
对象清理:主要功能是进行finalize()方法的替代。
在Java中所有的垃圾空间都是通过gc()回收的,所以很多很情况是不会用到的。但是Java依然是提供了给用户收尾的操作
- finalize()回收
public class Member {
public Member() {
System.out.println("诞生!");
}
@Override
protected void finalize() throws Throwable { //可能抛错误,也可能抛异常
System.out.println("回收!");
throw new Exception("我真的还想在活500年");
}
}
public class Demo {
public static void main(String[] args) {
Member mem=new Member(); //实例化对象
mem=null; //垃圾,不被引用
System.gc();//手动进行gc操作
System.out.println("太阳照常升起,一代更比一代强");
}
}
执行结果:
诞生!
太阳照常升起,一代更比一代强
回收
回收对象前要先finalize(),降低了内存回收的效率,而且它不能保证被及时执行,或者可能造成该对象的在次复活。
jdk1.9后出现新的替代者:java.lang.ref.Cleaner类。此种清理方式会启动一个新的清理线程,并且基于AutoCloseable接口实现资源释放。
- Cleaner释放资源
package cn.mldn.demo;
import java.lang.ref.Cleaner;
class Member implements Runnable {
public Member() {
System.out.println("诞生!");
}
@Override
public void run() { // 清除线程
System.out.println("回收!");
}
}
class MemberCleaning implements AutoCloseable { // 实现清除的处理
private static final Cleaner cleaner = Cleaner.create() ; // 创建一个清除处理
private Cleaner.Cleanable cleanable ;
public MemberCleaning(Member member) { // 注册待清除对象
this.cleanable = cleaner.register(this, member) ; // 注册使用的对象
}
@Override
public void close() throws Exception {// 自动关闭并释放
this.cleanable.clean(); // 启动清理线程
}
}
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Member mem = new Member() ;// 实例化对象
System.gc(); // 手工进行GC调用
try (MemberCleaning mc = new MemberCleaning(mem)){/ 中间可以执行一些相关的代码
} catch (Exception e) {}
System.out.println("太阳照常升起,地球照样转动,一代更比一代强!");// 不受影响继续执行
}
}
执行结果
诞生!
太阳照常升起,一代更比一代强
回收
新版本要求启动一个线程单独清除回收,防止延迟处理,保证性能,但是也不能保证垃圾被及时回收。
最好的方式是用完即使用try-with-resource机制显示释放或者放入资源池重用。
2、对象克隆
- 使用Object类中的clone()方法;
- 克隆对象需要实现Clonable接口,此接口没有提供一个方法,他描述的是一种能力。
class GjtxApplicationTests {
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Member implements Cloneable {
private String name;
private int age;
//克隆
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
@Test
void contextLoads() throws CloneNotSupportedException {
Member a = new Member("PIGE", 18); //实例化对象
Member b = (Member) a.clone();
System.out.println(b.toString());
}
3、数字操作类
(1)Math数学计算类
- 不能被继承
- 所有方法是static方法,可以通过类名称直接调用;
- 提供基本的数学公式,计算时需要重新整合;
//绝对值
System.out.println(Math.abs(-1));//1
//最大值
System.out.println(Math.max(-1, 29));//29
//对数
System.out.println(Math.log(11));//2.3978952727983707
//进位取整
System.out.println(Math.round(-1.5));//-1
System.out.println(Math.round(-1.51));//-2
//指定位数四舍五入:5.996535为数字,3为保留位数
double v = Math.round(5.996535 * Math.pow(10, 3)) / Math.pow(10, 3); //5.997
System.out.println(v);
(2)Random随机数生成类()
//随机数
Random random = new Random();
//值介于[0,n)的区间,也就是0到n之间的随机int值
System.out.println(random.nextInt(10));
(3)大数字处理类(BigDecimal 、BigInteger )
//大数据
BigDecimal bigDecimal = new BigDecimal(999999999);
bigDecimal = bigDecimal.add(new BigDecimal(123456.789));
bigDecimal = bigDecimal.subtract(new BigDecimal(999999999));
bigDecimal = bigDecimal.multiply(new BigDecimal(980999997));
BigDecimal result = bigDecimal.divide(new BigDecimal(1)).setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(result);
//四舍五入:2为保留位数
new BigDecimal(987.987).divide(new BigDecimal(1.0),2, RoundingMode.HALF_UP);
BigInteger bigIntegerA = new BigInteger("999999999999");
BigInteger bigIntegerB = new BigInteger("123456789");
//求余:第一位为商,第二位为余数
BigInteger a[] = bigIntegerA.divideAndRemainder(bigIntegerB);
System.out.println("商:" + a[0] + "、余数:" + a[1]);
4、 日期操作类
(1)Date日期处理类
//日期
Date date = new Date();
System.out.println(date); //Wed Mar 02 20:50:12 CST 2022
//日期转long
long a = date.getTime();
//long转日期
Date b = new Date(a);
System.out.println(b); //Wed Mar 02 20:50:12 CST 2022
//为了便于计算机处理,日期时间用long类型保存
(2)SimpleDateFormat日期处理类
格式化String显示,主要大小写
年(yy)、月(MM)、日(dd)、时(HH)、分(mm)、秒(ss)、毫秒(SSS
)
格式化日期:
//日期
Date date = new Date();
System.out.println(date); //Wed Mar 02 20:50:12 CST 2022
//日期转long
long a = date.getTime();
//long转日期
Date b = new Date(a);
System.out.println(b); //Wed Mar 02 20:50:12 CST 2022
//为了便于计算机处理,日期时间用long类型保存
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
String c = simpleDateFormat.format(b);
System.out.println(c);
字符串转日期
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
String c = simpleDateFormat.format(b);
System.out.println(c);
//日期转字符串
//如果日期超过合理范围,自动进位处理
String d = "1999-09-09";
try {
System.out.println(simpleDateFormat.parse(d));
} catch (ParseException e) {
e.printStackTrace();
}
5、正则表达式
开发本质客户输入都是String类型,需要处理转换为其他类型。在需要复杂的验证处理时就使用到正则表达式。
正则表达式描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
(1)单个符号
- 英文句点.符号:匹配单个任意字符。
表达式t.o 可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。
- 中括号[]:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。
表达式:t[abcd]n 只可以匹配:tan,tbn,tcn,tdn。不可以匹配:thn,tabn,tn等。
- | 符号。相当与“或”,可以匹配指定的字符,但是也只能选择其中一项进行匹配。
表达式:t(a|b|c|dd)n 只可以匹配:tan,tbn,tcn,tddn。不可以匹配taan,tn,tabcn等。
- 表示匹配次数的符号
表达式:[0—9]{ 3 } \— [0-9]{ 2 } \— [0-9]{ 3 } 的匹配格式为:999—99—999
因为—符号在正则表达式中有特殊的含义,它表示一个范围,所以在前面加转义字符\。
^符号:表示否,如果用在方括号内,^表示不想匹配的字符。
表达式:[^x] 第一个字符不能是x
- \S符号:非空字符
- \s符号:空字符,只可以匹配一个空格、制表符、回车符、换页符,不可以匹配自己输入的多个空格。
- \r符号:空格符,与\n、\tab相同
(2)快捷符号
- \d表示[0—9]
- \D表示[^0—9]
- \w表示[0—9A—Z_a—z]
- \W表示[^0—9A—Z_a—z]
- \s表示[\t\n\r\f]
- \S表示[^\t\n\r\f]
(4)常用的正则表达式
- Java:(([a-z]|_)(\w*)){6,20}匹配以字母或下划线开头,字母数字下划线结尾的字符串
- JavaScript:/^(-?)(\d+)$/匹配数字
- JavaScript:/^\w+$/匹配字母数字下划线。
(5)Java 中正则表达式的应用
- 判断功能
public boolean matches(String regex)
案例:判断录入的手机号是否为13或者18开头
package Lemon;
import java.util.Scanner;
public class RegexDm {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入手机好:");
String s = sc.nextLine();
String regex = "1[38]\\d{9}";//定义手机好规则
boolean flag = s.matches(regex);//判断功能
System.out.println("flag:"+flag);
}
}
- 分割功能
public String[] split(String regex)
package Lemon;
import java.util.Scanner;
public class RegexDm {
public static void main(String[] args){
String age = "18-24";//定义年龄范围
String regex = "-";
String[] strArr = age.split(regex);//分割成字符串数组
int startAge = Integer.parseInt(strArr[0]);
int endAge = Integer.parseInt(strArr[1]);
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的年龄:");
int a = sc.nextInt();
if (a >= startAge && a <= endAge){
System.out.println("你就是我想找的");
}else{
System.out.println("滚");
}
}
}
- 替换功能
public String replaceAll(String regex,String replacement)
案例:
package Lemon;
public class RegexDm {
public static void main(String[] args){
String s = "12342jasfkgnas234";
//把字符串里面的数字替换成*
String regex = "\\d";
String ss = "*";
String result = s.replaceAll(regex,ss);
System.out.println(result);
}
}