2021年Java面试题抢先看,够全!中篇(持续更新中)

前两天收集了许多的面试问题,上篇提到了Java面试中的重要话题归纳 点这里!,正在持续更新中,点击下“关注”不迷路哦~

七、关于内存的的面试问题和答案

Java 基本概念面试题

(文章中有超级福利)

37)“a==b”和”a.equals(b)”有什么区别?

如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。

38)a.hashCode() 有什么用?与 a.equals(b) 有什么关系?

hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具有相同的 hash code。

39)final、finalize 和 finally 的不同之处?

final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,但是什么时候调用 finalize 没有保证。finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。

40)Java 中的编译期常量是什么?使用它又什么风险?

公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖 JAR 文件时,确保重新编译你的程序。

八、Java 集合框架的面试题

这部分也包含数据结构、算法及数组的面试问题

41) List、Set、Map 和 Queue 之间的区别(答案)

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

42)poll() 方法和 remove() 方法的区别?

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

43)Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么?(答案)

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

44)ArrayList 与 LinkedList 的不区别?(答案)

最明显的区别是 ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。更多细节的讨论参见答案。

45)用哪两种方式来实现集合的排序?(答案)

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

46)Java 中怎么打印数组?(answer答案)

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

需要更多大厂面试资料的话也可以点击直接进入,免费获取!暗号:CSDN

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

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

48)Java 中的 TreeMap 是采用什么树实现的?(答案)

Java 中的 TreeMap 是使用红黑树实现的。

49) Hashtable 与 HashMap 有什么不同之处?(答案)

这两个类有许多不同的地方,下面列出了一部分:a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。更多的不同之处参见答案。

50)ArrayList 和 HashMap 的默认大小是多数?(答案)

在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。这就是 Java 7 中 ArrayList 和 HashMap 类的代码片段:

// from ArrayList.java JDK 1.7
private static final int DEFAULT_CAPACITY = 10;

//from HashMap.java JDK 7
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

51)有没有可能两个不相等的对象有有相同的 hashcode?

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

52)两个相同的对象会有不同的的 hash code 吗?

不能,根据 hash code 的规定,这是不可能的。

九、Java IO 和 NIO 的面试题

IO 是 Java 面试中一个非常重要的点。你应该很好掌握 Java IO,NIO,NIO2 以及与操作系统,磁盘 IO 相关的基础知识。下面是 Java IO 中经常问的问题。

53)在我 Java 程序中,我有三个 socket,我需要多少个线程来处理?

54)Java 中怎么创建 ByteBuffer?

55)Java 中,怎么读写 ByteBuffer ?

56)Java 采用的是大端还是小端?

57)ByteBuffer 中的字节序是什么?

58)Java 中,直接缓冲区与非直接缓冲器有什么区别?(答案)

59)Java 中的内存映射缓存区是什么?(answer答案)

60)socket 选项 TCP NO DELAY 是指什么?

61)TCP 协议与 UDP 协议有什么区别?(answer答案)

62)Java 中,ByteBuffer 与 StringBuffer有什么区别?(答案)

十、Java 最佳实践的面试问题

包含 Java 中各个部分的最佳实践,如集合,字符串,IO,多线程,错误和异常处理,设计模式等等。

63)Java 中,编写多线程程序的时候你会遵循哪些最佳实践?(答案)

这是我在写Java 并发程序的时候遵循的一些最佳实践:
a)给线程命名,这样可以帮助调试。
b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步。
c)如果可以,更偏向于使用 volatile 而不是 synchronized。
d)使用更高层次的并发工具,而不是使用 wait() 和 notify() 来实现线程间通信,如 BlockingQueue,CountDownLatch 及 Semeaphore。
e)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。

64)说出几点 Java 中使用 Collections 的最佳实践(答案)

这是我在使用 Java 中 Collectionc 类的一些最佳实践:a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector。b)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。c)使用接口代表和访问集合,如使用List存储 ArrayList,使用 Map 存储 HashMap 等等。d)使用迭代器来循环集合。e)使用集合的时候使用泛型。

65)说出至少 5 点在 Java 中使用线程的最佳实践。(答案)

这个问题与之前的问题类似,你可以使用上面的答案。对线程来说,你应该:
a)对线程命名
b)将线程和任务分离,使用线程池执行器来执行 Runnable 或 Callable。
c)使用线程池

66)说出几条 Java 中方法重载的最佳实践?(答案)

下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱。
a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参数。
b)不要重载参数数量一致,而只是参数顺序不同的方法。
c)如果重载的方法参数个数多于 5 个,采用可变参数。

读者福利

感谢你看到了这里!
我这边整理很多2020最新Java面试题(含答案)和Java学习笔记,如下图
在这里插入图片描述

上述的面试题答案小编都整理成文档笔记。 同时也还整理了一些面试资料&最新2020收集的一些大厂的面试真题(都整理成文档,小部分截图)免费分享给大家,有需要的可以 点击进入暗号:CSDN!免费分享~

如果喜欢本篇文章,欢迎转发、点赞。

记得关注我!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_49527334/article/details/109642538