Java3-Java常用类库(Cleaner、对象克隆、数字操作、日期操作、正则表达式)

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,toTno,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等。
  • 表示匹配次数的符号
    在这里插入图片描述
表达式:[09]{ 3 } \— [0-9]{ 2 } \— [0-9]{ 3 } 的匹配格式为:99999999
因为—符号在正则表达式中有特殊的含义,它表示一个范围,所以在前面加转义字符\。
  • ^符号:表示否,如果用在方括号内,^表示不想匹配的字符。
表达式:[^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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值