请说说throws与throw的区别?
答案:
throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象。
throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。通常throw抛出异常后,如果想在上一级代码中捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法声明中指定要抛出的异常;如果要捕获throw抛出的异常,则必须使用try{}catch{}语句。
请说说final、finally与finalize的区别?
答案:
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提高垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。
请说说异常的注意事项及如何使用异常处理?
答案:
1. 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
2. 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常。
3. 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try...catch,不能throws
请说说文件名称过滤器FilenameFilter的作用?
答案:FilenameFilter是文件名过滤器,用来过滤不符合规则的文件名,并返回合格的文件。
请写出最常见到的5个RuntimeException异常。
答案:
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常
IllegalArgumentException - 传递非法参数异常
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常
SecurityException - 安全异常
请说出转换流OutputStreamWriter与InputStreamReader 的作用?
答案:
OutputStreamWriter:使用编码表对字节流的数据进行编码
InputStreamReader:使用编码表对字节流中的数据进行解码
请解释为何高效流比基本流读写速度快?
答案:
当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,如果缓冲区数据不足,才会再从文件中读取。这里的缓冲区应该是在硬盘中。
使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。这里的缓冲区应该在内存中。
请说明Map接口和Collection接口的区别
答案:Map接口是双列集合顶层接口,每个位置存储一对元素(key, value)
Collection接口是单列集合顶层接口,每个位置存储一个元素
请写出Map集合的遍历方式
答案:Map集合遍历方式有两种:
方式一: 键找值
方式二: 键值对对象,找键,找值
请说明HashMap和Hashtable的区别
答案:HashMap:
线程不同步,效率高;可以存储null键null值
Hashtable:
线程同步,数据安全;不可以存储null键null值
请解释Collection与Collections的区别
答案:
Collection:单列集合的顶层接口,包含集合中常用的方法。
Collections:集合工具类,包含获取集合最大元素值、集合排序等方法。
请简述Set集合的特点?
答案:
Set集合中不能存储重复元素;
Set集合中的元素是按照某种排序规则存储的
请简述HashSet是如何保证元素唯一性的?
答案:
HashSet集合中存储的元素,通过重写hashCode() 与 equals()方法来保证元素唯一性
请简述TreeSet是如何保证元素唯一性与排序的?
答案:
TreeSet集合中保证元素唯一性与排序有两种方式:
方式1:
实现自然排序接口 Comparable,重写 compareTo(T t)方法
方式2:
实现比较器排序接口 Comparator,重写 compare(T t1, T t2)方法
Comparable<T>
public int compareTo(T t) : 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
Comparator<T>
public int compare(T t1, T t2): 比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
请简述程序分层(创建多个包)设计的好处?
答案:
1. 开发人员可以只关注整个结构中的其中某一层
2. 可以很容易的用新的实现来替换原有层次的实现
3. 可以降低层与层之间的依赖
4. 有利于标准化
5. 利于各层逻辑的复用
请简述List<? extends T>和List<? super T>之间有什么区别?
答案:
List<? extends T> :向上限制
List<? super T> :向下限制
? extends T : 代表接收的泛型类型为T类型或T子类类型
? super T :代表接收的泛型类型为T类型或T父类类型
请简述如何编写一个泛型方法,让它能够接受泛型参数并返回泛型类型?并举例
答案:泛型方法,指把泛型定义在方法上,使用泛型类型来替代原始类型
public static <T> T[] sort(T[] t){
Arrays.sort(t);
return t;
}
请简述Java中如何使用泛型编写带有参数的类?并举例
答案:泛型类,指把泛型定义在类上,使用泛型类型来替代原始类型
class GenericClass<T> {
private T t;
public void setT(T t) {
this.t = t;
}
public T getT() {
return t;
}
}
请解释,可以把List<String>传递给一个接收List<Object>参数的方法吗?为什么?
答案:不能把List<String>传递给一个接收List<Object>参数的方法,
要求传递的参数泛型与接收的参数泛型一致。
请解释,Java中支持泛型数组吗?如果能,请举例
答案:不支持泛型数组,如果想要使用泛型,请用List来替代Array,因为List可以提供编译期的类型安全保证,而Array却不能。
请简述Java的泛型是如何工作的?什么是类型擦除?
答案:
Java的泛型是伪泛型。在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理解类型擦除。
Java中的泛型基本上都是在编译器这个层次来实现的。在生产的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。
如在代码中定义的List<Object>和List<String>类型,在编译后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。
类型擦除后保留的原始类型
原始类型就是擦除去了泛型信息,最后在字节码中的类型变量的真正类型。无论何时定义一个泛型类型,相应的原始类型都会被自动地提供。类型变量被擦除,并使用其限定类型(无限定的变量用Object)替代。
请简述泛型是什么?有什么用?在哪里用?
答案:
泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的使用进行。也被称为参数化类型,可以把类型当做参数一样传递过来,在传递过来之前我不明确,但是在使用的时候就就明确了。
泛型的好处:
1.提高了程序的安全性
2.将运行期遇到的问题转移到了编译期
3.省去了类型强转的麻烦
泛型的常见应用:
1.泛型类
2.泛型方法
3.泛型接口