1 、是否可以继承 String 类?
String
类是final
修饰类,所以不可以继承。- 使用final方法的原因有二:
第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
2 、String s = new String(“xyz”); 创建了几个 String Object? 二者之间有什么区别?
- 分两种情况(一个或两个):
- 如果
String
常量池中,已经创建"xyz"
,则不会继续创建,此时只创建了一个对象new String(“xyz”)
,此时为一个Object
对象。 - 如果
String
常量池中,没有创建"xyz"
,则会创建两个对象,一个对象的值是"xyz"
,一个对象new String(“xyz”)
,此时为二个Object
对象。
3 、String 、 StringBuffer和StringBuilder的区别。
String
是字符串常量;StringBuffer
是字符串变量(线程安全);StringBuilder
是字符串变量(非线程安全)。- 速度:大部分情况下,
String < StringBuffer < StringBuilder
。 String
覆盖了equals
方法和hashCode
方法,StringBuffer
没有覆盖equals
方法和hashCode
方法。- 三者底层均采用字符数组实现。
4 、数组有没有 length() 这个方法? String 有没有 length()。
- 数组没有
length()
方法,有length
属性。String
有length()
方法。
5 、下面这条语句一共创建了多少个对象:String s=“a”+“b”+“c”+“d”。
- 对于如下代码:
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为 false
,第二条语句打印的结果为 true
,这说明 javac 编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”
的字符串,所以,上面的代码应该只创建了一个 String
对象。写如下两行代码,
String s = "a" + "b" + "c" + "d";
System.out.println(s == "abcd");
最终打印的结果应该为 true
。
6 、final, finally, finalize 的区别。
final
用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成 final 类型。finally
是异常处理语句结构的一部分,表示总是执行。finalize
是Object
类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被调用。
7 、运行时异常与一般异常有何异同?
- 异常表示程序运行过程中可能出现的非正常状态。
- 运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
8 、error 和 exception 有什么区别?
error
表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception
表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
9 、Java 中的异常处理机制的简单原理和应用。
- 异常是指 java 程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java 使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。
- Java 对异常进行了分类,不同类型的异常分别用不同的 Java 类表示,所有异常的根类为java.lang.Throwable,Throwable 下面又派生了两个子类:Error 和 Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception 表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。
- java 为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须 try…catch 处理或用 throws 声明继续抛给上层调用方法处理,所以普通异常也称为 checked 异常,而系统异常可以处理也可以不处理,所以,编译器不强制用 try…catch 处理或用 throws 声明,所以系统异常也称为 unchecked 异常。
10 、请写出你最常见到的 5 个 RuntimeException 。
ClassCastException
类转换异常,IllegalArgumentException
非法参数异常,IndexOutOfBoundsException
数组越界异常,NullPointerException
空指针异常,ArrayStoreException
数据存储异常。- java运行时异常是可能在java虚拟机正常工作时抛出的异常。java提供了两种异常机制。一种是运行时异常(
RuntimeExepction
),一种是检查式异常(checked execption
)。 - 检查式异常:我们经常遇到的IO异常及sql异常就属于检查式异常。对于这种异常,java编译器要求我们必须对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一堆catch来捕捉这些异常。
- 运行时异常:我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。