Java常见面试题十道
1.throw和throws的区别
throw:
(1)throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
(2)throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。
throws:
(1)throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
(2)throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
(3)throws表示出现异常的一种可能性,并不一定会发生这种异常。
2.String类能被继承吗?
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。
3.Error和Exception的区别
Error 类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测,JAVA 应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复。
Exception 类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行。
4.如何实现数组和List之间的转换?
- List转换成为数组:调用ArrayList的toArray方法。
- 数组转换成为List:调用Arrays的asList方法。
5.什么是反射?
在运行状态中,对于任意一个类都能知道它的所有属性和方法,对于任意一个对象都能调用它的任意方法和属性,这种动态获取信息及调用对象方法的功能称为反射。缺点是破坏了封装性以及泛型约束。
6.什么是自动装箱、自动拆箱?
- 自动装箱:将基本数据类型包装为一个包装类对象,例如向一个泛型为Integer的集合添加int元素。
- 自动拆箱:将一个包装类对象转换为一个基本数据类型,例如将一个包装类对象赋值给一个基本数据类型的变量。
注意:比较两个包装类数值要用equals,而不能用==。
7.程序计数器是什么?
程序计数器是一块较小的内存空间,可以看作当前线程所执行字节码的行号指示器。字节码解释器工作时通过改变计数器的值选取下一条执行指令。分支、循环、跳转、线程恢复等功能都需要依赖计数器完成。是唯一在虚拟机规范中没有规定内存溢出情况的区域。
特点:
1.线程私有;
2.JVM规范中唯一没有规定OutOfMemoryError情况的区域;
3.如果正在执行的是Native 方法,则这个计数器值为空。
8.事务有啥特性?
-
原子性 atomicity
一个事务在逻辑上是必须不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说不可能只执行其中的一部分。 -
一致性 consistency
数据库总是从一个一致性的状态转换到另一个一致性的状态。 -
隔离性 isolation
针对并发事务而言,隔离性就是要隔离并发运行的多个事务之间的相互影响,一般来说一个事务所做的修改在最终提交以前,对其他事务是不可见的。 -
持久性 durability
一旦事务提交或者回滚后,其修改就会永久保存到数据库中,此时即使系统崩溃,修改的数据也不会丢失
9.堆跟栈的区别
- 存储
栈存储:变量、对象的引用,堆存储实例对象(数组也是对象) - 速度
栈:存取速度快
堆:存取速度慢 - 线程访问
栈:每个线程都有一个栈区
堆:所有线程共享一个堆区 - 垃圾回收
栈:比较频繁
堆:不频繁
10.迭代器Iterator 有什么特点?
- Iterator 功能比较简单,并且只能单向移动
- 使用方法 iterator() 要求容器返回一个 Iterator。第一次调用 Iterator 的 next() 方法时,它返回序列的第一个元素。注意:iterator() 方法是 java.lang.Iterable 接口,被 Collection 继承。
- 使用 hasNext() 检查序列中是否还有元素
- 使用 next() 获得序列中的下一个元素
- 使用 remove() 将迭代器新返回的元素删除
- Iterator 是 Java 迭代器最简单的实现,为 List 设计的 ListIterator 具有更多的功能,它可以从两个方向遍历 List,也可以从 List 中插入和删除元素。