final--fianlly-- finallize
final
用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.finally
是异常处理语句结构的一部分,表示总是执行.finalize
是Object
类的一个方法,在垃圾回收机制执行的时候会调用被回收对象的此方法,所有的类都继承了该方法,子类覆盖finalize()
方法以整理系统资源或者执行其他清理工作。finalize()
方法是在垃圾收集器删除对象之前对这个对象调用的。
String--StringBuffer--StringBuilder
都是
final
类,都不允许被继承;String
类型:长度是不可变的,因此每次在对String
类进行改变的时候都会生成一个新的string
对象,然后将指针指向新的string
对象,所以经常要改变字符串长度的话不要使用string
,因为每次生成对象都会对系统性能产生影响,特别是当内存中引用的对象多了以后,JVM的GC就会开始工作,性能就会降低;StringBuffer
类型:StringBuffer
是为解决上面提到拼接产生太多中间对象的问题而提供的一个类,我们可以用append
或者add
方法,把字符串添加到已有序列的末尾或者指定位置。每次都会对StringBuffer
对象本身进行操作,而不是生成新的对象并改变对象引用,所以多数情况下推荐使用StringBuffer
,特别是字符串对象经常要改变的情况;StringBufer
本质是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用它的后继者,也就是StringBuilder
。StringBuilder
是Java 1.5中新增的,在能力上和StringBufer
没有本质区别,但是它去掉了线程安全的部分,有效减小了开销,是绝大部分情况下进行字符串拼接的首选。StringBuffer
和StringBuilder
类长度是可以改变的;StringBuffer
类是线程安全的,StringBuilder
不是线程安全的;
在某些情况下,String
对象的字符串拼接其实是被Java Compiler
编译成了StringBuffer
对象的拼接,所以这些时候String
对象的速度并不会比StringBuffer
对象慢,例如:
String s1 = “This is only a” + “ simple” + “ test”;
// 上边代码实际运行为下访状态
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
而下边是创建了三个String
对象,再进行拼接:
String s2 = “This is only a”;
String s3 = “ simple”;
String s4 = “ test”;
String s1 = s2 + s3 + s4;
总结:
- String:适用于少量的字符串操作的情况
- StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
- StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况