String、StringBuffer、StringBuilder的区别?
- 可变性:String 由于底层的字符数组加了 final 关键字,所以是不可变的,不能被修改。对字符串变量的修改实际上是创建了新的字符串对象并将引用指向了它;StringBuffer 和 StringBuilder 是可变的,可以在原字符数组的基础上进行修改。
- 线程安全:String 是不可变的,所以是线程安全的;StringBuffer 由于其方法内部加了 Synchronized 关键字,所以也是线程安全的;而 StringBuilder 是线程不安全的。
- 性能:String 类型在修改字符串时由于需要频繁的创建和销毁对象,性能比较差。而 StringBuffer 和 StringBuilder 都能在原字符串基础上运算,性能比较好。StringBuilder 由于没有加锁,性能要比 StringBuffer 还要好上 10%~15%
- 场景:String 适用于常量或者修改比较少的变量;StringBuffer 适用于多线程下需要频繁进行字符串运算的变量;StringBuilder 适用于单线程下需要频繁进行字符串运算的变量。
接口和抽象类的区别?
- 接口是一种抽象结构,它定义了一组方法,但并没有任何方法实现。它只能有静态常量,不能有成员变量;抽象类是一种类,它可以有成员常量和成员变量,也可以有抽象方法和具体方法。
- 一个类可以实现多个接口,但只能继承一个抽象类。继承一个类是一种“is-a”的关系,实现一个接口是一种“has-a”的关系。一般情况下更建议使用接口而不是抽象类,可以保证类的灵活性和可扩展性。比如在新建线程时建议实现 Runnable 接口而不是继承 Threads 类。在让类可序列化时一般是实现 Serializable 接口而不是继承序列化类。
- 接口没有构造函数,而抽象类可以有构造函数。
总而言之,接口更像是一组规范,强调所有实现它的类都必须要遵循它的规范;抽象类更像是一个框架,保证代码的复用性。
共同点
- 一个类如果实现了一个接口,则必须实现它的所有抽象方法;一个类如果继承了一个抽象类,也必须实现它的所有抽象方法
- 接口和抽象类都不能直接被实例化。
Java常见的异常类有哪些?
Java 所有的异常都派生于 Throwable 类。这个类有两个子类,Error 和 Exception。Error 通常是严重的错误,这类错误是程序无法处理的,如 OutOfMemoryError,表示内存不足;StackOverflowError,表示栈溢出。而 Exception 则表示程序可以处理的异常。它又分为两大类:编译时异常(Checked Exception)和运行时异常(Runtime Exception)。
-
编译时异常也叫受检异常(Checked Exception),必须被显式捕获或声明抛出。它通常是由于外部环境引起的。因为程序可能运行在不同的环境上。如换一个环境文件无法找到,此时就会抛出 FileNotFoundException。Java 编译器要求程序必须捕获或声明所有编译时异常,强制要求程序为可能出现的异常做准备工作。
-
运行时异常也叫非受检异常(Unchecked Exception),这类异常在运行时抛出,不要求捕获也无法编译时提前捕获。它通常是由于程序逻辑错误导致。如 NullPointerException、IndexOutOfBoundsException、ClassCastException 等。需要程序员写代码时尽量去避免这种异常。

被折叠的 条评论
为什么被折叠?



