JAVA 面试题
Posted lanht
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA 面试题相关的知识,希望对你有一定的参考价值。
步骤1:面向对象的特征有哪些方面?
步骤2:String是最基本的数据类型吗?
步骤3:int 和 Integer 有什么区别?
步骤4:String 和StringBuffer的区别?
步骤5:运行时异常与一般异常有何异同?
步骤6:说出ArrayList,Vector, LinkedList的存储性能和特性。
步骤7:Collection 和 Collections的区别。
步骤8:&和&&的区别
步骤9:HashMap和Hashtable的区别
步骤10:final, finally, finalize的区别
步骤11:Overload和Override的区别,即重载和重写的区别。 Overloaded的方法是否可以改变返回值的类型?
步骤12:Error和Exception有什么区别?
步骤13:abstract class和interface有什么区别?
步骤14:heap和stack有什么区别
步骤15:GC是什么? 为什么要有GC?
步骤16:short s1 = 1; s1 = s1 + 1;有什么错?
步骤17:Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
步骤18:String s = new String("xyz");创建了几个String Object?
步骤19:Java有没有goto?
步骤20:接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
步骤21:List, Set, Map是否继承自Collection接口?
步骤22:abstract的method是否可同时是static,是否可同时是synchronized?
步骤23:数组有没有length()这个方法? String有没有length()这个方法?
步骤24:Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
步骤25:构造器Constructor是否可被override?是否可以继承String类?
步骤26:switch 是否能作用在byte上,是否能作用在long上,是否能作用在String上?
步骤27:try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
步骤28:两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
步骤29:垃圾回收的优点和原理。并考虑2种回收机制。
步骤30:你所知道的集合类都有哪些?主要方法?
步骤31:char型变量中能不能存贮一个中文汉字?为什么?
步骤32:解析XML文档有哪几种方式?
步骤33:关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
步骤34:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
步骤35:java中有几种类型的流?
步骤36:java中会存在内存泄漏吗,请简单描述。
步骤37:java中实现多态的机制是什么?
步骤38:静态变量和实例变量的区别?
步骤39:什么是java序列化,如何实现java序列化?
步骤40:是否可以从一个static方法内部发出对非static方法的调用?
步骤41:在JAVA中,如何跳出当前的多重嵌套循环?
步骤42:List、Map、Set三个接口,存取元素时,各有什么特点?
步骤43:Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以 implements(实现)interface(接口)?
步骤44:内部类可以引用外部类的成员吗?有没有什么限制?
步骤45:多线程有几种实现方法,都是什么?
步骤46:sleep() 和 wait() 有什么区别?
步骤47:说出数据连接池的工作机制是什么?
步骤48:简述synchronized和java.util.concurrent.locks.Lock的异同 ?
步骤49:Class.forName的作用?为什么要用?
步骤50:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
步骤51:给我五个你最常见到的runtime exception。
步骤3:int 和 Integer 有什么区别?
步骤4:String 和StringBuffer的区别?
步骤5:运行时异常与一般异常有何异同?
步骤6:说出ArrayList,Vector, LinkedList的存储性能和特性。
步骤7:Collection 和 Collections的区别。
步骤8:&和&&的区别
步骤9:HashMap和Hashtable的区别
步骤10:final, finally, finalize的区别
步骤11:Overload和Override的区别,即重载和重写的区别。 Overloaded的方法是否可以改变返回值的类型?
步骤12:Error和Exception有什么区别?
步骤13:abstract class和interface有什么区别?
步骤14:heap和stack有什么区别
步骤15:GC是什么? 为什么要有GC?
步骤16:short s1 = 1; s1 = s1 + 1;有什么错?
步骤17:Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
步骤18:String s = new String("xyz");创建了几个String Object?
步骤19:Java有没有goto?
步骤20:接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
步骤21:List, Set, Map是否继承自Collection接口?
步骤22:abstract的method是否可同时是static,是否可同时是synchronized?
步骤23:数组有没有length()这个方法? String有没有length()这个方法?
步骤24:Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
步骤25:构造器Constructor是否可被override?是否可以继承String类?
步骤26:switch 是否能作用在byte上,是否能作用在long上,是否能作用在String上?
步骤27:try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
步骤28:两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
步骤29:垃圾回收的优点和原理。并考虑2种回收机制。
步骤30:你所知道的集合类都有哪些?主要方法?
步骤31:char型变量中能不能存贮一个中文汉字?为什么?
步骤32:解析XML文档有哪几种方式?
步骤33:关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
步骤34:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
步骤35:java中有几种类型的流?
步骤36:java中会存在内存泄漏吗,请简单描述。
步骤37:java中实现多态的机制是什么?
步骤38:静态变量和实例变量的区别?
步骤39:什么是java序列化,如何实现java序列化?
步骤40:是否可以从一个static方法内部发出对非static方法的调用?
步骤41:在JAVA中,如何跳出当前的多重嵌套循环?
步骤42:List、Map、Set三个接口,存取元素时,各有什么特点?
步骤43:Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以 implements(实现)interface(接口)?
步骤44:内部类可以引用外部类的成员吗?有没有什么限制?
步骤45:多线程有几种实现方法,都是什么?
步骤46:sleep() 和 wait() 有什么区别?
步骤47:说出数据连接池的工作机制是什么?
步骤48:简述synchronized和java.util.concurrent.locks.Lock的异同 ?
步骤49:Class.forName的作用?为什么要用?
步骤50:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
步骤51:给我五个你最常见到的runtime exception。
示例 1 : 面向对象的特征有哪些方面?
示例 2 : String是最基本的数据类型吗?
示例 3 : int 和 Integer 有什么区别?
示例 4 : String 和StringBuffer的区别?
String是immutable的,其内容一旦创建好之后,就不可以发生改变。
StringBuffer 是可以变长的,内容也可以发生改变
改变的原理是StringBuffer内部采用了字符数组存放数据,在需要增加长度的时候,创建新的数组,并且把原来的数据复制到新的数组这样的办法来实现。
更多细节可以参考 模仿StringBuffer的 MyStringBuffer 类是如何实现的。
StringBuffer 是可以变长的,内容也可以发生改变
改变的原理是StringBuffer内部采用了字符数组存放数据,在需要增加长度的时候,创建新的数组,并且把原来的数据复制到新的数组这样的办法来实现。
更多细节可以参考 模仿StringBuffer的 MyStringBuffer 类是如何实现的。
示例 5 : 运行时异常与一般异常有何异同?
示例 6 : 说出ArrayList,Vector, LinkedList的存储性能和特性。
先说ArrayList和Vector
两者都继承了抽象类AbstractList,但是Vector是线程安全的,而ArrayList是非线程安全的
再说ArrayList和LinkedList的区别
ArrayList 是数组结构,所以定位很快,但是插入和删除很慢
LinkedList 是双向链表结构,所以插入和删除很快,但是定位很慢
两者都继承了抽象类AbstractList,但是Vector是线程安全的,而ArrayList是非线程安全的
再说ArrayList和LinkedList的区别
ArrayList 是数组结构,所以定位很快,但是插入和删除很慢
LinkedList 是双向链表结构,所以插入和删除很快,但是定位很慢
示例 7 : Collection 和 Collections的区别。
示例 8 : &和&&的区别
示例 9 : HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式
区别1:
HashMap可以存放 null
Hashtable不能存放null
区别2:
HashMap不是线程安全的类
Hashtable是线程安全的类
区别1:
HashMap可以存放 null
Hashtable不能存放null
区别2:
HashMap不是线程安全的类
Hashtable是线程安全的类
示例 10 : final, finally, finalize的区别
示例 11 : Overload和Override的区别,即重载和重写的区别。 Overloaded的方法是否可以改变返回值的类型?
示例 12 : Error和Exception有什么区别?
示例 13 : abstract class和interface有什么区别?
示例 14 : heap和stack有什么区别
heap: 堆
stack: 栈 (在一些书籍里,会被翻译为堆栈,实际上指的就是单纯的这个栈)
存放的内容不一样:
heap: 是存放对象的
stack: 是存放基本类型(int, float, boolean 等等)、引用(对象地址)、方法调用
存取方式不一样:
heap: 是自动增加大小的,所以不需要指定大小,但是存取相对较慢
stack: 是固定大小的,并且是FILO 先入后出的顺序,并且存取速度比较快
stack: 栈 (在一些书籍里,会被翻译为堆栈,实际上指的就是单纯的这个栈)
存放的内容不一样:
heap: 是存放对象的
stack: 是存放基本类型(int, float, boolean 等等)、引用(对象地址)、方法调用
存取方式不一样:
heap: 是自动增加大小的,所以不需要指定大小,但是存取相对较慢
stack: 是固定大小的,并且是FILO 先入后出的顺序,并且存取速度比较快
示例 15 : GC是什么? 为什么要有GC?
GC是Garbage Collection的缩写,即垃圾回收
这里所谓的垃圾,指的是那些不再被使用的对象,JVM的垃圾回收机制使得开发人员从无聊、容易犯错的手动释放内存资源的过程中解放出来。
开发人员可以更加专注的进行业务功能的开发,而资源回收的工作交由更加专业的垃圾回收机制自动完成。
这里所谓的垃圾,指的是那些不再被使用的对象,JVM的垃圾回收机制使得开发人员从无聊、容易犯错的手动释放内存资源的过程中解放出来。
开发人员可以更加专注的进行业务功能的开发,而资源回收的工作交由更加专业的垃圾回收机制自动完成。
示例 16 : short s1 = 1; s1 = s1 + 1;有什么错?
short s1 = 1; 这一句没有错误,编译器会自动把1这个整数处理为short.
s1 = s1 + 1; 右侧的表达式会返回一个Int类型的整数,再把这个int类型的整数赋给short类型的s1的时候,就会出现强制转换错误
s1 = s1 + 1; 右侧的表达式会返回一个Int类型的整数,再把这个int类型的整数赋给short类型的s1的时候,就会出现强制转换错误
示例 17 : Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round 的意思是+0.5 取整数
所以 Math.round(11.5) 即 11.5+0.5 = 12
Math.round(-11.5) 即 -11.5+0.5 = -11
所以 Math.round(11.5) 即 11.5+0.5 = 12
Math.round(-11.5) 即 -11.5+0.5 = -11
示例 18 : String s = new String("xyz");创建了几个String Object?
String s = new String("xyz");
首先构造方法 new String("xyz"); 中的"xyz" 这本身就是一个字符串对象
然后 new 关键字一定会创建一个对象
所以总共创建了两个String对象
首先构造方法 new String("xyz"); 中的"xyz" 这本身就是一个字符串对象
然后 new 关键字一定会创建一个对象
所以总共创建了两个String对象
示例 19 : Java有没有goto?
有,goto是关键字,但是是保留字,并不具备功能性
示例 20 : 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口是否可继承接口?
可以,比如List 就继承了接口Collection
抽象类是否可实现(implements)接口?
可以,比如 MouseAdapter鼠标监听适配器 是一个抽象类,并且实现了MouseListener接口
抽象类是否可继承实体类(concrete class)?
可以,所有抽象类,都继承了Object
可以,比如List 就继承了接口Collection
抽象类是否可实现(implements)接口?
可以,比如 MouseAdapter鼠标监听适配器 是一个抽象类,并且实现了MouseListener接口
抽象类是否可继承实体类(concrete class)?
可以,所有抽象类,都继承了Object
示例 21 : List, Set, Map是否继承自Collection接口?
List 和 Set 继承了Collection接口
但是Map和Collection之间没有继承关系,因为一个是键值对容器,一个是单值容器,无法兼容
但是Map和Collection之间没有继承关系,因为一个是键值对容器,一个是单值容器,无法兼容
示例 22 : abstract的method是否可同时是static,是否可同时是synchronized?
abstract的method是否可同时是static,是否可同时是synchronized?
都不可以
都不可以
示例 23 : 数组有没有length()这个方法? String有没有length()这个方法?
数组获取长度的手段是 .length 属性
String获取长度的手段是 length()方法
集合获取长度的手段是 size()方法
文件获取长度的手段是 length()方法
String获取长度的手段是 length()方法
集合获取长度的手段是 size()方法
文件获取长度的手段是 length()方法
示例 24 : Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
以HashSet为例,判断重复的逻辑是:
1. 首先看hashcode是否相同,如果不同,就是不重复的
2. 如果hashcode一样,再比较equals,如果不同,就是不重复的,否则就是重复的。
更多关于hashcode的原理,参考 Java HashCode原理详解
1. 首先看hashcode是否相同,如果不同,就是不重复的
2. 如果hashcode一样,再比较equals,如果不同,就是不重复的,否则就是重复的。
更多关于hashcode的原理,参考 Java HashCode原理详解
示例 25 : 构造器Constructor是否可被override?是否可以继承String类?
子类不能继承父类的构造方法,所以就不存在重写父类的构造方法。
注: super() 表示子类调用父类的构造方法,这不能被叫做继承父类的构造方法
String是final修饰的,所以不能够被继承
注: super() 表示子类调用父类的构造方法,这不能被叫做继承父类的构造方法
String是final修饰的,所以不能够被继承
示例 26 : switch 是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch 可以作用在 byte,short,int String,Enum(枚举) 上,但是不能作用在long上面
注:注:switch 作用在String上从JDK1.7开始支持,实质是编译时将字符串替换为了其对应的hash值
注:注:switch 作用在String上从JDK1.7开始支持,实质是编译时将字符串替换为了其对应的hash值
示例 27 : try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
try里的return 和 finally里的return 都会执行,但是当前方法只会采纳finally中return的值
示例 28 : 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
因为hashCode()方法和equals()方法都可以通过自定义类重写,是可以做到equals相同,但是hashCode不同的
但是,在Object类的equals()方法中有这么一段话
翻译如下:
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
所以这个题的答案应该是否定的,但是得搞清楚里面的原委
但是,在Object类的equals()方法中有这么一段话
* Note that it is generally necessary to override the { @code hashCode} * method whenever this method is overridden, so as to maintain the * general contract for the { @code hashCode} method, which states * that equal objects must have equal hash codes. |
翻译如下:
通常来讲,在重写这个方法的时候,也需要对hashCode方法进行重写, 以此来保证这两个方法的一致性—— 当equals返回 true 的时候,这两个对象一定有相同的hashcode. |
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
所以这个题的答案应该是否定的,但是得搞清楚里面的原委
示例 29 : 垃圾回收的优点和原理。并考虑2种回收机制。
与C语言开发人员需要手动进行内存资源的释放不同,Java提供垃圾回收机制,自动进行GC,将开发人员从容易犯错的内存资源管理中解放出来。
原理:当某个一个对象,没有任何引用指向它的时候,那么它就满足垃圾回收的条件,在适当的时候,JVM虚拟机进行GC将其回收,释放空间,以供后续再利用。
两种常见的回收机制:
1. 定时回收
每隔30分钟进行一次回收,这种机制的弊端是如果垃圾产生的比较快,有可能30分钟之内垃圾已经把内存占用光了,导致性能变慢
2. 当垃圾占到某个百分比的时候,进行回收
比如,当垃圾占到70%的时候,进行回收。 这种机制的弊端是,如果垃圾产生的频率很快,那么JVM就必须高频率的进行垃圾回收。 而在垃圾回收的过程中, JVM会停顿下来,只做垃圾回收,而影响业务功能的正常运行。
一般说来 JVM会采用两种机制结合的方式进行垃圾回收。
原理:当某个一个对象,没有任何引用指向它的时候,那么它就满足垃圾回收的条件,在适当的时候,JVM虚拟机进行GC将其回收,释放空间,以供后续再利用。
两种常见的回收机制:
1. 定时回收
每隔30分钟进行一次回收,这种机制的弊端是如果垃圾产生的比较快,有可能30分钟之内垃圾已经把内存占用光了,导致性能变慢
2. 当垃圾占到某个百分比的时候,进行回收
比如,当垃圾占到70%的时候,进行回收。 这种机制的弊端是,如果垃圾产生的频率很快,那么JVM就必须高频率的进行垃圾回收。 而在垃圾回收的过程中, JVM会停顿下来,只做垃圾回收,而影响业务功能的正常运行。
一般说来 JVM会采用两种机制结合的方式进行垃圾回收。
示例 30 : 你所知道的集合类都有哪些?主要方法?
常见的集合
ArrayList,LinkedList,HashSet,HashMap,TreeSet 等等
常见方法:
size()
add()
remove()
等等
ArrayList,LinkedList,HashSet,HashMap,TreeSet 等等
常见方法:
size()
add()
remove()
等等
示例 31 : char型变量中能不能存贮一个中文汉字?为什么?
char是16位的,占两个字节
汉字通常使用GBK或者UNICODE编码,也是使用两个字节
所以可以存放汉字
汉字通常使用GBK或者UNICODE编码,也是使用两个字节
所以可以存放汉字
示例 32 : 解析XML文档有哪几种方式?
主要是两种,SAX和DOM
SAX 就是逐行读取,直到找到目标数据为止
DOM 是先全文档加载,然后读取
SAX 就是逐行读取,直到找到目标数据为止
DOM 是先全文档加载,然后读取
示例 33 : 关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
示例 34 : 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以包括多个类,但是只能出现一个public修饰的类,但是可以出现多个非public修饰的类。
示例 35 : java中有几种类型的流?
示例 36 : java中会存在内存泄漏吗,请简单描述。
因为Java是自动进行垃圾回收管理的,所以不存在 C语言中同等概念的内存泄漏,但是存在Java特色的内存泄漏
当某些对象不被使用,但是又有非直接引用指向的时候,那么就不满足垃圾回收的条件,而形成内存泄漏。
比如代码中的例子,每个Object创建的时候,有一个引用o指向,接着就被放进了集合al中。 下一个Object创建的时候,上一个Object就没有引用指向了。
这些Object都没有引用指向,但是却放在ArrayList中,而这个Arraylist忘记了回收,那么里面的所有对象,都会一直存活下去,虽然不再被使用了。
当某些对象不被使用,但是又有非直接引用指向的时候,那么就不满足垃圾回收的条件,而形成内存泄漏。
比如代码中的例子,每个Object创建的时候,有一个引用o指向,接着就被放进了集合al中。 下一个Object创建的时候,上一个Object就没有引用指向了。
这些Object都没有引用指向,但是却放在ArrayList中,而这个Arraylist忘记了回收,那么里面的所有对象,都会一直存活下去,虽然不再被使用了。
package j2se; import java.util.ArrayList; public class MemoryLeak { static ArrayList<Object> al = new ArrayList<Object>(); public static void main(String[] args) { for ( int i = 0 ; i < 100 ; i++) { Object o = new Object(); al.add(o); } } } |
示例 37 : java中实现多态的机制是什么?
示例 38 : 静态变量和实例变量的区别?
示例 39 : 什么是java序列化,如何实现java序列化?
序列化指的是把一个Java对象,通过某种介质进行传输,比如Socket输入输出流,或者保存在一个文件里
实现java序列化的手段是让该类实现接口 Serializable,这个接口是一个标识性接口,没有任何方法,仅仅用于表示该类可以序列化。
实现java序列化的手段是让该类实现接口 Serializable,这个接口是一个标识性接口,没有任何方法,仅仅用于表示该类可以序列化。
示例 40 : 是否可以从一个static方法内部发出对非static方法的调用?
不行,因为非static方法需要一个具体的实例才可以调用,而调用 static方法的时候,不一定存在一个实例
示例 41 : 在JAVA中,如何跳出当前的多重嵌套循环?
在外部循环的前一行,加上标签
在break的时候使用该标签
即能达到结束多重嵌套循环的效果
在break的时候使用该标签
即能达到结束多重嵌套循环的效果
public class HelloWorld { public static void main(String[] args) { //打印单数 outloop: //outloop这个标示是可以自定义的比如outloop1,ol2,out5 for ( int i = 0 ; i < 10 ; i++) { for ( int j = 0 ; j < 10 ; j++) { System.out.println(i+ ":" +j); if ( 0 ==j% 2 ) break outloop; //如果是双数,结束外部循环 } } } } |
示例 42 : List、Map、Set三个接口,存取元素时,各有什么特点?
示例 43 : Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以 implements(实现)interface(接口)?
匿名内部类本质上就是在继承其他类,实现其他接口
如例:
匿名类1,就是继承了Thread
匿名类2 ,就是实现了Runnable接口
如例:
匿名类1,就是继承了Thread
匿名类2 ,就是实现了Runnable接口
package j2se; public class HelloWorld { public static void main(String[] args) { // 匿名类1 new Thread() { public void run() { } }; // 匿名类2 new Runnable() { public void run() { } }; } } |
示例 44 : 内部类可以引用外部类的成员吗?有没有什么限制?
可以使用
如果是非静态内部类,可以使用外部类的所有成员
如果是静态内部类,只能使用外部类的静态成员
如果是非静态内部类,可以使用外部类的所有成员
如果是静态内部类,只能使用外部类的静态成员
示例 45 : 多线程有几种实现方法,都是什么?
示例 46 : sleep() 和 wait() 有什么区别?
示例 47 : 说出数据连接池的工作机制是什么?
数据库连接池原理:
因为创建连接和关闭连接的行为是非常耗时的,会显著降低软件的性能表现。解决办法就是先创建n条数据库连接Connection,循环使用,但是不进行关闭,这样再执行SQL语句,就不需要额外创建连接了,直接使用现成的连接就可以了,从而节约了创建连接和关闭连接的时间开销。
参考 自己设计一个数据库连接池类:ConnectionPool
因为创建连接和关闭连接的行为是非常耗时的,会显著降低软件的性能表现。解决办法就是先创建n条数据库连接Connection,循环使用,但是不进行关闭,这样再执行SQL语句,就不需要额外创建连接了,直接使用现成的连接就可以了,从而节约了创建连接和关闭连接的时间开销。
参考 自己设计一个数据库连接池类:ConnectionPool
示例 48 : 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
1. Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,Lock是代码层面的实现。
2. Lock可以选择性的获取锁,如果一段时间获取不到,可以放弃。synchronized不行,会一根筋一直获取下去。 借助Lock的这个特性,就能够规避死锁,synchronized必须通过谨慎和良好的设计,才能减少死锁的发生。
3. synchronized在发生异常和同步块结束的时候,会自动释放锁。而Lock必须手动释放, 所以如果忘记了释放锁,一样会造成死锁。
完整的Lock教程请查看:Lock对象
2. Lock可以选择性的获取锁,如果一段时间获取不到,可以放弃。synchronized不行,会一根筋一直获取下去。 借助Lock的这个特性,就能够规避死锁,synchronized必须通过谨慎和良好的设计,才能减少死锁的发生。
3. synchronized在发生异常和同步块结束的时候,会自动释放锁。而Lock必须手动释放, 所以如果忘记了释放锁,一样会造成死锁。
完整的Lock教程请查看:Lock对象
示例 49 : Class.forName的作用?为什么要用?
Class.forName常见的场景是在数据库驱动初始化的时候调用。
Class.forName本身的意义是加载类到JVM中。 一旦一个类被加载到JVM中,它的静态属性就会被初始化,在初始化的过程中就会执行相关代码,从而达到"加载驱动的效果"
Class.forName本身的意义是加载类到JVM中。 一旦一个类被加载到JVM中,它的静态属性就会被初始化,在初始化的过程中就会执行相关代码,从而达到"加载驱动的效果"
示例 50 : 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
这要看情况而定,如果该对象的其他方法也是有synchronized修饰的,那么其他线程就会被挡在外面。否则其他线程就可以进入其他方法。
示例 51 : 给我五个你最常见到的runtime exception。
NullPointerException 空指针异常
ArithmeticException 算术异常,比如除数为零
ClassCastException 类型转换异常
ConcurrentModificationException 同步修改异常,遍历一个集合的时候,删除集合的元素,就会抛出该异常
IndexOutOfBoundsException 数组下标越界异常
NegativeArraySizeException 为数组分配的空间是负数异常
ArithmeticException 算术异常,比如除数为零
ClassCastException 类型转换异常
ConcurrentModificationException 同步修改异常,遍历一个集合的时候,删除集合的元素,就会抛出该异常
IndexOutOfBoundsException 数组下标越界异常
NegativeArraySizeException 为数组分配的空间是负数异常
更多内容,点击了解:https://how2j.cn?p=61135
以上是关于JAVA 面试题的主要内容,如果未能解决你的问题,请参考以下文章
经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!