当前位置 : 首页> 求职攻略 > 扒扒能打动Java面试官有深度的java面试题

扒扒能打动Java面试官有深度的java面试题

时间:2017-10-19 17:10:47   已访问:1312次
热门专业

Java程序员技术不成熟,很难在面试过程中打动java面试官,现在就将一些java面试过程遇到的疑难杂症外焦里嫩的扒个干净,让你在面试过程中顺利过关。

扒扒能打动Java面试官有深度的java面试题_www.cnitedu.cn

Java面试题疑难题汇总

1:Java 中能创建 Volatile 数组吗?

能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。我的意思是,如果改变引用指向的数组,将会受到 volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 标示符就不能起到之前的保护作用了。

2:volatile 修饰符的有过什么实践?

一种实践是用 volatile 修饰 long 和 double 变量,使其能按原子类型来读写。double 和 long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。volatile 修复符的另一个作用是提供内存屏障(memory barrier),例如在分布式框架中的应用。简单的说,就是当你写一个 volatile 变量之前,Java 内存模型会插入一个写屏障(write barrier),读一个 volatile 变量之前,会插入一个读屏障(read barrier)。意思就是说,在你写一个 volatile 域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。

3:在Java工作中,volatile 能使得一个非原子操作变成原子操作吗?

答:一个典型的例子是在类中有一个 long 类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为 volatile。为什么?因为 Java 中读取 long 类型变量不是原子的,需要分成两步,如果一个线程正在修改该 long 变量的值,另一个线程可能只能看到该值的一半(前 32 位)。但是对一个 volatile 型的 long 或 double 变量的读写是原子。

4:volatile 类型变量提供什么保证?

volatile 变量提供顺序和可见性保证,例如,JVM 或者 JIT为了获得更好的性能会对语句重排序,但是 volatile 类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。 volatile 提供 happens-before 的保证,确保一个线程的修改能对其他线程是可见的。某些情况下,volatile 还能提供原子性,如读 64 位数据类型,像 long 和 double 都不是原子的,但 volatile 类型的 double 和 long 就是原子的。

5:在Java工作中10 个线程和 2 个线程的同步代码,哪个更容易写?

从写代码的角度来说,两者的复杂度是相同的,因为同步代码与线程数量是相互独立的。但是同步策略的选择依赖于线程的数量,因为越多的线程意味着更大的竞争,所以你需要利用同步技术,如锁分离,这要求更复杂的代码和专业知识。

6:在Java工作中你是如何调用 wait()方法的?使用 if 块还是循环?

在循环调用,当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好(如果有电脑,可以附带一段标准的使用 wait 和 notify 方法的代码来获得更好的证实)。

7 :List、Set、Map 和 Queue 之间的区别是?

List 是一个有序集合,允许元素重复。它的某些实现可以提供基于下标值的常量访问时间,但是这不是 List 接口保证的。Set 是一个无序集合。

8:poll() 方法和 remove() 方法的区别?

poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

9:Java 中 LinkedHashMap 和 PriorityQueue 区别在哪?

PriorityQueue 保证最高或者最低优先级的的元素总是在队列头部,但是 LinkedHashMap 维持的顺序是元素插入的顺序。当遍历一个 PriorityQueue 时,没有任何顺序保证,但是 LinkedHashMap 课保证遍历顺序是元素插入的顺序。

10:ArrayList 与 LinkedList 区别在哪?

最明显的区别是 ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。更多细节到上海达内Java培训机构咨询。

11:用哪两种方式来实现集合的排序?

你可以使用有序集合,如 TreeSet 或 TreeMap,也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。

12:Java 中怎么打印数组?

使用 Arrays.toString() 和 Arrays.deepToString() 方法。由于数组没有实现 toString() 方法,所以如果将数组传递给 System.out.println() 方法,将无法打印出数组的内容,但是 Arrays.toString() 可以打印每个元素。

13:Java 中的 LinkedList 是单向链表还是双向链表?(答案)

是双向链表,你可以检查 JDK 的源码。在 Eclipse,你可以使用快捷键 Ctrl + T,直接在编辑器中打开该类。

14:Java 中的 TreeMap 是采用什么树实现的?

使用红黑树实现的。

15:Hashtable 与 HashMap 有什么不同之处?

举个例子,下面列出了一部分:Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的;Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快;Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。

16:Java 中的 HashSet,内部是如何工作的?

采用 HashMap来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的 key,只允许有一个null key,意思就是 HashSet 中只允许存储一个 null 对象。

17:写一段代码在遍历 ArrayList 时移除一个元素?

关键在于面试者使用的是 ArrayList 的 remove() 还是 Iterator 的 remove()方法。使用正确的方式来实现在遍历的过程中移除元素,才不会出现 ConcurrentModificationException 异常的示例代码。

18:我们能自己写一个容器类,然后使用 for-each 循环码?

可以。如果你想使用 Java 中增强的循环来遍历,你只需要实现 Iterable 接口。如果你实现 Collection 接口,默认就具有该属性。

19:ArrayList 和 HashMap 的默认大小是多数?

在 Java 7 中ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。

20:有没有可能两个不相等的对象有相同的 hashcode?

有可能,两个不相等的对象可能会有相同的 hashcode 值,在 hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的hashcode 值,但是没有关于不相等对象的任何规定。

21:两个相同的对象会有不同的的 hash code 吗?我们可以在 hashcode() 中使用随机数字吗?

根据 hash code 的规定,这是不可能的。在 hashcode() 中使用随机数字是不行的,因为对象的 hashcode 值必须是相同的。

22:Java 中,Comparator 与 Comparable 有什么不同?

Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户定制的顺序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。

23:为什么在重写 equals 方法的时候需要重写 hashCode 方法?

有强制的规范指定需要同时重写 hashcode 与 equal 是方法,许多容器类,如 HashMap、HashSet 都依赖于 hashcode 与 equals 的规定。

有了这些java面试题,不通关都难。看到的同学有福了,那就赶快收藏起来吧!


推荐内容