多线程、并发及线程的基础问题
volatile 能使得一个非原子操作变成原子操作吗?
一个典型的例子是在类中有一个 long 类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为 volatile。为什么?因为 Java 中读取 long 类型变量不是原子的,需要分成两步,如果一个线程正在修改该 long 变量的值,另一个线程可能只能看到该值的一半(前 32 位)。但是对一个 volatile 型的 long 或 double 变量的读写是原子。
Swing 是线程安全的?(答案)
不是,Swing 不是线程安全的。
JVM 底层 与 GC(Garbage Collection) 的面试问题
Serial 与 Parallel GC之间的不同之处?(答案)
它们之间主要不同 serial 收集器是默认的复制收集器,执行 GC 的时候只有一个线程,而 parallel 收集器使用多个 GC 线程来执行。
Java 中 WeakReference 与 SoftReference的区别?(答案)
SoftReference(软引用)和WeakReference的区别在于,假如下次GC的时候,发现内存充足,没有溢出,则不会回收SoftReference关联的对象;但是对于WeakReference,在下一次GC的时候,一定会回收,无论内存是否满。
弱引用相当于
Object obj = new Object();
obj = null;
Java 基本概念面试题
45)a.hashCode() 有什么用?与 a.equals(b) 有什么关系?(答案)
hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具有相同的 hash code。
Java 集合框架的面试题
50)Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么?(答案)
PriorityQueue 保证最高或者最低优先级的的元素总是在队列头部,但是 LinkedHashMap 维持的顺序是元素插入的顺序。当遍历一个 PriorityQueue 时,没有任何顺序保证,但是LinkedHashMap 课保证遍历顺序是元素插入的顺序。
52)用哪两种方式来实现集合的排序?(答案)
你可以使用有序集合,如TreeSet或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort()来排序。
更多的不同之处参见答案。
57)Java 中的 HashSet,内部是如何工作的?(answer答案)
HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的 key,只允许有一个null key,意思就是 HashSet 中只允许存储一个 null 对象。
关于 OOP 和设计模式的面试题
113)适配器模式和装饰器模式有什么区别?(答案)
适配器模式被用于桥接两个接口
装饰模式的目的是在不修改类的情况下给类增加新的功能(比如继承)。
124)什么时候使用享元模式?(答案)
JDK 中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。
Java 面试中其他各式各样的问题
127)Java 中,受检查异常 和 不受检查异常的区别?(答案)
checkedexception(检查异常)要求你必须要在方法里面或者捕获或者继续抛出。
132)说出 5 个 JDK 1.8 引入的新特性?(答案)
Lambda 表达式,允许像对象一样传递匿名函数
Stream API,充分利用现代多核 CPU,可以写出很简洁的代码
Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用
扩展方法,现在,接口中可以有静态、默认方法。
重复注解,现在你可以将相同的注解在同一类型上使用多次。
网友评论