StringBuffer类
String类是在所有项目开发之中一定会使用到的一个功能类,并且这个类拥有如下的特点
1、每一个字符串常量都属于一个String类的匿名对象,并且不可更改(查笔记图片有这三点)
2、String类有两个常量池:静态常量池、运行时常量池;
3、String类对象实例化建议使用直接复制的形式完成,这样可以直接将对象保存在对象池中以方便下次重用
虽然String类很好使用,但是如果认知去思考也会发现其最大的弊端:内容不允许修改(每一次修改都会产生垃圾内存,见基础图记录内容),虽然大部分情况下都不会涉及到字符串内容的频繁修改,但是依然可能存在这样的情况,所以为了解决此问题,专门提供有一个StrignBuffer类可以实现字符串内容的修改处理。
StringBuffer并不像String类那样有两种对象实例化方式,StringBuffer必须像普通类对象那样首先进行实例化而后才可以调用方法执行处理,而这个时候可以考虑使用StringBuffer类中的如下方法:
实际上大部分情况下,很少会出现有字符串内容的改变,这种改变指的并不是针对于静态常量池的改变。
这个时候strB对象的内容并不算是改变,或者更加严格的意义上来讲,对于现在的strB当程序编译后会变为如下形式
所有的“+”在编译之后都变成StringBuffer中的append()方法,并且在程序之中StringBuffer与String类对象之间本来就可以直接互相转换。
String类对象变为StringBuffer可以依靠StringBuffer类的构造方法或者使用append()方法
所有的类对象都可以通过toString()方法将其变成String类型。
在StringBuffer类里面除了可以支持有字符串内容的修改之外,实际上也提供有了一些String类不具备的方法。
实际上与StringBuffer类还有一个类似的功能类:StringBuilder类,这个类是在jdk1.5的时候提供的,该类中提供的方法与StringBuffer功能相同,打开这两个类的api可以看到,它们最大的区别在于StringBuffer类中的方法属于线程安全的,全部使用了synchronized关键字进行标注,而StringBuilder是非线程安全的。
面试题:
CharSequence接口
CharSequence是一个描述字符串结构的接口,在这个接口里面一般发现有三种常用子类:
String类、StringBuffer类、StringBuild类
现在只要有字符串就可以为CharSequence接口实例化。
CharSequence是一个接口(since 1.4),它定义的方法有:
以后看见了CharSequence描述的就是一个字符串。
AutoCloseable接口
AutoCloseable主要适用于日后进行资源开发的处理上,以实现资源的关闭(释放资源),例如:在以后进行文件、网络、数据库开发的过程中由于服务器的资源有限,所以使用之后一定要关闭资源,这样才可以被更多的使用者使用。
下面为了更好的说明资源的问题,将通过一个消息的发送处理来完成。
此时有位设计师说了,既然所有的资源完成处理之后都要进行关闭操作,那么能否实现一种自动关闭的功能呢?在这样的要求下,推出了AutoCloseable接口(子类实现类都很多,只有一个方法),这个接口是在JDK1.7的时候提供的,并且该接口只提供一个方法:
要想实现自动关闭处理,处理要使用AutoCloseable之外,还需要结合有异常处理语句来完成。
以后的章节中会接触到资源的关闭问题,往往都会见到AutoCloseable接口的使用(要与异常捆绑在一起使用)
Runtime类
Runtime描述的是运行时的状态,Runtime类是唯一一个与JVM运行状态有关的类,并且都会默认提供有一个该类的实例化对象。
由于在每一个JVM进程里面只允许提供有一个Runtime类的对象,所以这个类的构造方法被默认私有化了,那么就证明该类使用的是单例设计模式,并且单例设计模式一定会提供有一个static方法获取本类实例。
由于Runtime类属于单例设计模式,如果要想获得实例化对象,那么就可以依靠类中的getRuntime()方法完成
面试题:请问什么是GC?如何处理?
GC(Garbage Collector)垃圾收集器,是可以由系统自动调用的垃圾释放功能,或者使用Runtime类中的gc()手工调用
System类
System类之前使用的系统输出采用的就是System类中的方法,这个类里面也有其它的一些处理方法。
在System类里面会发现也提供有一个gc()方法,但是这个gc()方法并不是重新定义的新方法,而是继续执行调用了Runtime中的gc()操作(Runtime.getRuntime().gc()).<----gc的手工处理在java里面这有这一个(方法)。
Cleaner类
Cleanner类是在JDK1.9之后提供的一个对象清理操作,其主要的功能是进行finialize()方法的替代。在C++语言里面有两种特殊的函数:构造函数(对象初始化)、析构函数(进行对象的手工回收),在Java里面所有的垃圾空间都是通过GC自动回收的,所以很多情况下不需要使用这类析构函数,也正因为如此,所以Java并没有提供这方面的支持。
但是Java本身依然提供了给用户收尾的操作,每一个实例化对象在回收之前至少给它一个喘息的机会,最初实现对象收尾的方法是Object类中所提供的finliaza()方法,这个方法定义如下:
该替换指的是不建议使用这个方法了,而是说子类可以继续使用这个方法名称。但是这个方法最大的特点是抛出了一个Throwable异常类型,而这个异常类型分为两个子类型:Error、Exception,平常时所处理的都是Exception。
但是从JDK1.9开始,这一操作已经不建议使用了,而对于对象的回收释放。从JDK1.9开始建议开发者使用AutoCloseable(自动关闭)或者使用java.lang.ref.Cleanner类进行回收处理(Cleaner也支持有AutoCloseable的处理)。
在新一代的清除回收处理中,更多的情况下考虑的是多线程的使用,即:为了防止有可能造成的延迟处理,所以许多对象回首前的处理都是单独通过一个线程完成的(保证性能的提高)
对象克隆
所谓的对象克隆指的就是对象的复制,而且属于全新的复制。即:使用已有对象内容创建一个新的对象,如果想要进行对象的克隆的话需要使用到Object类中的clone()方法
所有的类都会继承Object父类,所以所有的类都一定会有clone()方法,但并不是所有的类都希望被克隆。所以如果要想实现对象克隆,那么对象所在的类需要实现一个Cloneable接口,此接口并没有一个方法提供,是因为它描述的是一种能力(接口有三大主要作用:标准、能力的定义(基础开发可理解两个))。
如果在开发之中不是非常特别的需求下,很少会出现有对象克隆的需求。
Cloneable是一个没有方法,表示能力的标识接口(重要)