一文带你了解Java其他基础类库 | 带你学《Java语言高级特性》之十九

简介: 了解了几个Java主要的基础类库后,还有如System、Cleaner等类库在Java开发运行过程中起着重要的作用,来随作者一起来看看这些类库为开发者提供了哪些帮助吧。

上一篇:Runtime类:为Java运行保驾护航 | 带你学《Java语言高级特性》之十八
了解了几个Java主要的基础类库后,还有如System、Cleaner等类库在Java开发运行过程中起着重要的作用,来随作者一起来看看这些类库为开发者提供了哪些帮助吧。

【本节目标】
通过阅读本节内容,你将了解到贯穿整个程序的System类及其提供的几个实用方法,了解到与AutoCloseable有相同功能的Cleaner类,学会通过实现Cloneable接口声明对象的可克隆性。

System类

System类是一直陪伴着我们学习的程序类,之前使用的系统输出采用的就是System类中的方法,而后在System类里面也定义有一些其他的处理方法:

  • 数组拷贝:public static void arraycopy​(Object src, int srcPos, Object dest, int destPos, int length);
  • 获取当前的日期时间数值:public static long currentTimeMillis();
  • 进行垃圾回收:public static void gc();

范例:操作耗时的统计

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception{
        long start=System.currentTimeMillis();
        String str="";
        for (int x = 0; x < 30000; x++) {
            str += x;//产生大量的垃圾空间
        }
        long end = System.currentTimeMillis();
        System.out.println("操作耗时:"+(end - start));   //操作耗时:984
    }
}

在System类里面也提供有一个gc()方法。但是这个gc()方法并不是重新定义的新方法,而是继续调用Runtime类中的gc()操作(Runtime.getRuntime().gc();)。

Cleaner类

Cleaner是在JDK1.9之后提供的一个对象清理操作,其主要的功能是进行finalize()方法的替代。在C++语言里面有两种特殊的函数:构造函数、析构函数(对象手工回收),在Java里面所有的垃圾空间都是通过GC自动回收的,所以很多情况下是不需要使用这类析构函数的,也正是因为如此,所以Java并没有提供这方面支持。
但是Java本身依然提供了给用户收尾的操作,每一个实例化对象在回收之前至少给它一个喘息的机会。最初实现对象收尾处理的方法是Object类中所提供的finalize()方法,这个方法的定义如下:

@Deprecated(since="9")
protected void finalize()  throws Throwable

该替换指的是不建议继续使用这个方法了,而是说子类可以继续使用这个方法名称。 但是这个方法上最大的特点就是抛出了一个Throwable异常类型,而这个异常类型分为两个子类型:Error、Exception,平常所处理的都是Exception。

范例:观察传统回收

class Member{
    public Member() {
        System.out.println("【构造】在一个雷电交加的日子里面,林强诞生了。");
    }
    @Override
    protected void finalize() throws Throwable {
        System.out.println("【回收】最终你一定要死的");
        throw new Exception("我还要再活500年...");
    }
}
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception{
        Member mem=new Member();   //诞生
        mem = null;   //成为垃圾
        System.gc();
        System.out.println("太阳照常升起,地球照样转动。");
    }
}

image.png
运行结果一

但是从JDK1.9开始,这一操作已经不建议使用了,而对于对象回收释放,从JDK1.9开始建议开发者使用AutoCloseable或者使用java.lang.ref.Cleaner类进行回收处理(Cleaner也支持有AutoCloseable处理);

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 Member member;
    private Cleaner.Cleanable cleanable;
    public MemberCleaning() {
        this.member = new Member();//创建新对象
        this.cleanable=this.cleaner.register(this,this.member);  //注册使用的对象
    }
    @Override
    public void close() throws Exception {
        this.cleanable.clean();   //启动多线程
    }
}
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception{
        try(MemberCleaning mc=new MemberCleaning()) {
            //中间可以执行一些相关的代码
        }catch (Exception e){}
    }
}

image.png
运行结果二

在新一代的清除回收处理的过程之中,更多的情况下考虑的是多线程的使用,即:为了防止有可能造成的延迟处理,所以许多对象回收前的处理都是单独通过一个线程完成的。

对象克隆

所谓的对象克隆指的就是对象的复制,而且属于全新的复制。即:使用已有对象内容创建一个新的对象,如果要想使用对象克隆需要使用到Object类中提供的clone()方法:

protected Object clone() throws CloneNotSupportedException;

所有的类都会继承Object父类,所以所有的类都一定会有clone()方法,但是并不是所有的类都希望被克隆。所以如果要想实现对象克隆,那么对象所在的类需要实现一个Cloneable接口,此接口并没有任何的方法提供,是因为它描述的是一种能力。

范例:实现对象克隆

class Member implements Cloneable {
    private String name;
    private int age;
    public Member(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "【" + super.toString() + "】name = " + this.name + "、age = " + this.age;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();   //调用父类提供的clone()方法
    }
}
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Member memberA=new Member("林强",30);
        Member memberB=(Member)memberA.clone();
        System.out.println(memberA);
        System.out.println(memberB);
    }
}

image.png
运行结果三

如果在开发之中不是非常特别的需求下,很少会出现有对象克隆的需求。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:Math、Random类为你展现数学之美 | 带你学《Java语言高级特性》之二十
更多Java面向对象编程文章查看此处

相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
92 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
2月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
78 2
|
1月前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
54 4
|
2月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
96 3
|
2月前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
29 2
|
2月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
60 3
|
2月前
|
移动开发 Java 大数据
深入探索Java语言的核心优势与现代应用实践
【10月更文挑战第10天】深入探索Java语言的核心优势与现代应用实践
95 4
|
2月前
|
消息中间件 分布式计算 Java
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
37 2
|
2月前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
56 3
下一篇
DataWorks