Java 常见面试题 - noonecare/spark GitHub Wiki

  • JDK 和 JRE 有什么区别?
  • JRE 是(执行字节码A的)虚拟机。JDk 是 Java 开发包,包括 jre, 编译器,specification, JavaDoc,调试器等。
  • 是否可以在static环境中访问非static变量?
  • static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
  • 么是自动拆装箱?(这个问题好无聊)
  • 自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。
  • 进程和线程的区别是什么? (我认为 Java 中线程就是进程,但是 别人有不同观点,需要核实一下) 进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。

  • synchronized 关键字

  • 如何确保N个线程可以访问N个资源同时又不导致死锁?

  • 如果不同的线程有不同的优先级,可以避免死锁。
  • Iterator和ListIterator的区别是什么?

下面列出了他们的区别:

Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。 Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。 ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

  • 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
  • Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。
  • 数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

下面列出了Array和ArrayList的不同点:

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。 Array大小是固定的,ArrayList的大小是动态变化的。 ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

  • Comparable和Comparator接口是干什么的?列出它们的区别。

Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。

Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true

  • Java集合类框架的最佳实践有哪些?

根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我们就应该用Array而不是ArrayList。 有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置初始容量来避免重新计算hash值或者是扩容。 为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。 使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。 编程的时候接口优于实现。 底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。

  • Enumeration接口和Iterator接口的区别有哪些?

Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。

  • Java 集合类框架的基本接口有哪些?
  • Collection 代表一组对象
  • Set 不包含重复的Collection.
  • List 有顺序的 Collection.
  • Map 把键映射为值,键不能重复。
  • 为什么集合类没有实现 Cloneable 和 Serializable 接口?

  • Comparable 和 Comparator 接口是干什么的, 列出他们的区别?

  • Enumeration 接口和 Iterator 接口的区别有哪些?

  • HashSet 和 TreeSet 的区别是什么?

  • System.gc() 和 Runtime.gc() 会做什么事情?

  • finallize()方法什么时候会被调用?

  • 如果对象的引用被置为 null, 垃圾收集器是否会自动释放对象所占的内存?

  • 串行收集器 和 吞吐量收集器的区别是什么?

  • JVM 的永久带是否会发生垃圾回收?