1.String/StringBuilder/StringBuffer的区别
三者的区别主要集中在不可变性、线程安全和性能、使用场景方面。
1.不可变性
- String内部字符数组使用final修饰,是不可变的字符串类,string对象进行改变是,都会创建一个新的string对象,旧的对象被JVM回收。
- StringBuilder和StringBuffer是可变的,都允许修改字符串,不会创建新对象。
2.线程安全
- String:由于是不可变的,所以线程安全
- StringBuffer:里面方法均使用synchronized关键字修饰,线程安全,效率略低
- StringBuilder线程不安全,效率最高
3.性能
- 对于复杂字符串操作,频繁插入删除拼接,StringBuilder和StringBuffer效率高于String,因为他们是可变的,不需要创建新的对象
4.使用场景
- String:字符串不经常变化的场景可以使用String类,例如常量的声明,少量的变量运算。
- StringBuilder:频繁的字符串运算,并运行在单线程环境可以使用,因为不需要同步,如SQL语句拼装,JSON封装
- StringBuffer:频繁的字符串运算,并运行在多线程环境可以使用,方法是同步的,如XML解析,HTTP参数解析和封装。
总体来看,String适用于不经常修改的场景,其余适用于需要频繁修改字符串情况,具体选择取决于线程安全及性能考虑。
2.final关键字
final即不可变的意思,可以修饰变量、方法和类。
1.修饰类:final修饰的类不可以被继承,是最终类。
2.修饰方法:明确禁止该方法在子类中被覆盖的情况才将方法设置为final。
3.修饰变量:
- final 修饰基本数据类型的变量,其数值一旦在初始化之后不能更改,成为常量
- final 修饰引用类型的变量,则在对其初始化之后不能再让其指向另一个对象。虽然不能再指向其他对象,但是指向对象的内容是可变的。
3.Exception和Error有什么区别
都派生自Throwable的子类
1.Exception类及其子类主要用于表示程序可以处理的异常情况,异常分为两种类型:可检查异常(Check Exception)、不可检查异常(Unchecked Exception),可选择捕获并处理异常,也可以通过在方法签名中使用throw关键字声明方法可能抛出的异常。
2.Error
- 表示比较严重的问题,一般是JVM运行时出现了错误,如没有内存可分配抛出OOM错误,栈资源耗尽抛出Stack OverflowError错误、JAVA虚拟机运行错误Virtual machineError、类定义错误NoClassDefFoundError
- 描述了JAVA运行时系统的内部错误和资源耗尽错误
- 错误不应该是程序捕获和处理,这些错误的发生通常意味着程序无法继续正常执行。如果出现这样的错误,是通告给用户,并尽力使程序安全地终止。