BAT大厂面试的100道考题,过60分的不到10%

 ps:资料已整理成文档,需要获取的小伙伴可以直接转发+关注后私信(学习)即可获取哦!

哥,你的100道Java考题,我只考了16分,是不是没救了!给我个答案吧!那么鉴于不少小伙伴已经考完了,那么小傅哥就做一个考题解析,方便读者可以针对自己的问题进行补充学习。

其实这些考题只是相当于在你的技术栈地图中,拎出100个检查站点,进行片段化的提问,来检查你对知识网的覆盖程度。而学习的最终目标远不是来背这些题,那样是没有多大的意义的,否则你在面对面试官时换个方向再问,可能你还是没法回答。所以更有意义的事是慢下来,不贪多,一步一个脚印的用自己的思考和实践验证学会这些内容。

好啦,我就做个这些问题的分析,如果你还没有参与考试也可以先尝试考一下,再看解答会更有感觉。

解析:考题知识点

1. 算法(1~10)

01:常见的数据结构有哪些

  • 选项: A.队列B.栈C.哈希表D.堆E.字典树F.树(二叉查找树、AVL树、红黑树、线段树)G.桥H.图I.并查集J布隆过滤器
  • 答案:A、B、C、D、E、F、H、I、J
  • 解析:基本的数据结构都是基于数组和链表满足不同场景诉求所扩展出来的
  • 详细:https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E6%9C%AF%E8%AF%AD%E5%88%97%E8%A1%A8 —— 数据结构属于列表

02:优先队列是基于什么数据结构实现?

  • 选项: A.链表B.哈希表C.栈D.二叉堆
  • 答案:D
  • 解析:Java 中的优先队列 PriorityQueue 是基于数组结构的二叉堆实现的
  • 详细:https://bugstack.cn/md/algorithm/data-structures/2022-08-06-queue.html

03:HashMap 解决哈希碰撞的数据结构?

  • 选项: A.杜鹃散列B.开放寻址C.拉链寻址D.合并散列
  • 答案:C
  • 解析:HashMap 为了解决元素的碰撞,采用哈希桶 + 链表/红黑树的数据结构,也称为拉链寻址。开放寻址是 ThreadLocal 的数据结构
  • 详细:https://bugstack.cn/md/algorithm/data-structures/2022-08-27-hash-table.html#_2-%E6%8B%89%E9%93%BE%E5%AF%BB%E5%9D%80

04:ArrayDeque 实现堆扩容时需要进行几次元素拷贝?

  • 选项: A.1B.2C.3D.4
  • 答案:B
  • 解析:ArrayDeque 是基于数组实现的堆栈结构,在元素的存放上因为有扩容数组操作,为了保持堆栈的先进后出的特性,所以需要分段拷贝元素。
  • 详细:https://bugstack.cn/md/algorithm/data-structures/2022-08-17-stack.html

05:基于数组实现的二叉堆,元素k如何计算父节点

  • 选项: A.k >> 1B.(k + 1) << 1C.(k - 1) <<< 1D.(k - 1) >>> 1
  • 答案:D
  • 解析:基于数组实现的二叉堆所有子节点与父节点的位置关系,是子节点除以2取整,就是父节点的位置。之所以是这样的一个计算关系,因为它整个二叉堆上每一层元素在数组位置的存放上,就是一个1、2、4、8码的结构,也就是二进制结构。所以可以除以2取整计算父节点位置。那么使用二进制计算就是 (k - 1) >>> 1
  • 详细:https://bugstack.cn/md/algorithm/data-structures/2022-09-03-heap.html

06:链表删除任意元素的时间复杂度

  • 选项: A.O(1)B.O(n)C.O(logn)D.O(n^2)
  • 答案:B
  • 解析:链表的操作只有插入的时间复杂度是O(1),其他操作时间复杂度都O(n)。也因为有这样的情况,所以开始设计出二叉搜索树、AVL平衡树、红黑树等数据结构。让时间复杂度尽可能平衡到O(logn)。
  • 详细:https://bugstack.cn/md/algorithm/data-structures/2022-07-22-linked-list.html

07:HashMap 负载因子的使用

  • 选项: A.负载因子越大,有限空间内存放元素越少B.负载因子越小,有限空间内存放元素越多C.负载因子越大,有限空间内存放元素越多D.负载因子越小,有限空间内存放元素越少
  • 答案:C、D
  • 解析:对于 HashMap 来说,复杂因子的作用就是为了调衡元素的的碰撞情况。负载因子太大,是可以节省空间但碰撞的概率就会增大。反之就是用空间换时间,需要拉倒空间解决碰撞。所以 HashMap 选择 0.75 也就是 3/4 作为默认负载因子。
  • 详细:https://bugstack.cn/md/java/interview/2020-08-07-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E7%AC%AC3%E7%AF%87%E3%80%8AHashMap%E6%A0%B8%E5%BF%83%E7%9F%A5%E8%AF%86%EF%BC%8C%E6%89%B0%E5%8A%A8%E5%87%BD%E6%95%B0%E3%80%81%E8%B4%9F%E8%BD%BD%E5%9B%A0%E5%AD%90%E3%80%81%E6%89%A9%E5%AE%B9%E9%93%BE%E8%A1%A8%E6%8B%86%E5%88%86%EF%BC%8C%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E3%80%8B.html#_3-%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AE%B9%E9%87%8F%E5%92%8C%E8%B4%9F%E8%BD%BD%E5%9B%A0%E5%AD%90

08:ThreadLocal 解决哈希碰撞的散列算法?

  • 选项: A.扰动函数B.斐波那契C.平方散列D.合并散列
  • 答案:B
  • 解析:ThreadLocal 是基于数组的开放寻址数据结构,采用的斐波那契散列,因为它在有限空间内,对线程内的元素计算索引位置更加分散。HashMap 为了降低元素的碰撞采用的是扰动函数
  • 详细:https://bugstack.cn/md/java/interview/2020-09-23-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E7%AC%AC12%E7%AF%87%E3%80%8A%E9%9D%A2%E8%AF%95%E5%AE%98%EF%BC%8CThreadLocal%20%E4%BD%A0%E8%A6%81%E8%BF%99%E4%B9%88%E9%97%AE%EF%BC%8C%E6%88%91%E5%B0%B1%E6%8C%82%E4%BA%86%EF%BC%81%E3%80%8B.html

09:HashMap 链表转红黑树条件

  • 选项: A.空间长度8,元素个数大于8B.空间长度64,元素个数大于7C.空间长度8,元素个数大于7D.空间长度64,元素个数大于8
  • 答案:D
  • 解析:HashMap 不是一上来就在最低的初始化长度内,超过最长链表长度就直接转换红黑树,而是达到64位长度后,元素大于8,还有碰撞的情况下将链表转换为红黑树。HashMap 里的数学知识点含量巨大
  • 详细:https://bugstack.cn/md/java/interview/2020-08-13-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E7%AC%AC4%E7%AF%87%E3%80%8AHashMap%E6%95%B0%E6%8D%AE%E6%8F%92%E5%85%A5%E3%80%81%E6%9F%A5%E6%89%BE%E3%80%81%E5%88%A0%E9%99%A4%E3%80%81%E9%81%8D%E5%8E%86%EF%BC%8C%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E3%80%8B.html

10:关于 ArrayList 和 LinkedList 插入1000万个元素性能对比

  • 选项: A.头插时,ArrayList 性能高于 LinkedListB.头插时,LinkedList 性能高于 ArrayListC.中间插,ArrayList 性能高于 LinkedListD.中间插,LinkedList 性能高于 ArrayListE.尾插时,ArrayList 性能高于 LinkedListF.尾插时,LinkedList 性能高于 ArrayList
  • 答案:B、C、E
  • 解析:ArrayList 耗时在元素拷贝、LinkedList 耗时在节点创建,大批量的新元素创建也是一种比较耗时的行为。具体可以参考压测数据
  • 详细:https://bugstack.cn/md/java/interview/2020-08-30-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E7%AC%AC8%E7%AF%87%E3%80%8ALinkedList%E6%8F%92%E5%85%A5%E9%80%9F%E5%BA%A6%E6%AF%94ArrayList%E5%BF%AB%EF%BC%9F%E4%BD%A0%E7%A1%AE%E5%AE%9A%E5%90%97%EF%BC%9F%E3%80%8B.html

2. 源码-Java(11~20)

01:JDK创建代理的方式

  • 选项: A.new JavassistProxy().defineClass(clazz.getName(), bytes, 0, bytes.length).newInstance()B.dynamicType.load(Thread.currentThread().getContextClassLoader()).getLoaded().newInstance();C.Proxy.newProxyInstanceD.Enhancer.create(object.getClass(), this);
  • 答案:C
  • 解析:JDK 默认提供创建代理的方式是 Proxy.newProxyInstance,而不是如 Javassist、Cglib 等方式创建。
  • 详细:https://bugstack.cn/md/java/interview/2020-10-14-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E7%AC%AC13%E7%AF%87%E3%80%8A%E9%99%A4%E4%BA%86JDK%E3%80%81CGLIB%EF%BC%8C%E8%BF%98%E6%9C%893%E7%A7%8D%E7%B1%BB%E4%BB%A3%E7%90%86%E6%96%B9%E5%BC%8F%EF%BC%9F%E9%9D%A2%E8%AF%95%E5%8F%88%E5%8D%A1%E4%BD%8F%EF%BC%81%E3%80%8B.html

02:volatile 关键字的作用

  • 选项: A.可见性B.有序性C.原子性D.防重排
  • 答案:A、D
  • 解析:在 volatile 的特性描述中主要为可见性和防重排,尽可能保证有序性。所以这里的选择 A、D 或者 A、B、D 都可以。但 volatile 是不具有原子性的,synchronized 既可以保证原子性 ,也可以保证可见性。
  • 详细:https://bugstack.cn/md/java/interview/2020-10-21-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E7%AC%AC14%E7%AF%87%E3%80%8Avolatile%20%E6%80%8E%E4%B9%88%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%86%85%E5%AD%98%E5%8F%AF%E8%A7%81%EF%BC%9F%E6%B2%A1%E6%9C%89%20volatile%20%E4%B8%80%E5%AE%9A%E4%B8%8D%E5%8F%AF%E8%A7%81%E5%90%97%EF%BC%9F%E3%80%8B.html

03:Integer.toHexString("".hashCode()) 输出结果?

  • 选项: A.抛异常B.1C.0D.7fffffff
  • 答案:C
  • 解析:哈希的计算公式;s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 当字符串为空时则不会通过公式计算哈希值,也就是0,那么0的 toHexString 16进制转换仍然是0。
  • 详细:https://bugstack.cn/md/java/interview/2020-08-04-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E7%AC%AC2%E7%AF%87%E3%80%8A%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%EF%BC%8CHashCode%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A831%E4%BD%9C%E4%B8%BA%E4%B9%98%E6%95%B0%EF%BC%9F%E3%80%8B.html

04:哪些是公平锁实现方式?

  • 选项: A.CLHB.MCSLockC.TicketLockD.SpinLock
  • 答案:A、B、C、D
  • 解析:CLH、MCS、Spin、Ticket 四种自旋锁的实现方式都是公平锁。
  • 详细:https://bugstack.cn/md/java/interview/2020-11-04-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E7%AC%AC16%E7%AF%87%E3%80%8A%E7%A0%81%E5%86%9C%E4%BC%9A%E9%94%81%EF%BC%8CReentrantLock%E4%B9%8B%E5%85%AC%E5%B9%B3%E9%94%81%E8%AE%B2%E8%A7%A3%E5%92%8C%E5%AE%9E%E7%8E%B0%E3%80%8B.html

05:Synchronized 和 ReentrantLock 的描述

  • 选项: A.两者都是独占锁,只允许线程互斥的访问临界资源B.两者都是基于AQS提供的共享资源同步框架实现的(独占、可重入、允许中断)C.ReentrantLock是JVM层面的实现,synchronized是Java层面的实现D.ReentrantLock是Java层面的实现,synchronized是JVM层面的实现
  • 答案:A、D
  • 解析:两者都是独占锁,但 Synchronized 是基于 JVM 层面的,ReentrantLock 是基于 Java 层面的,也就是基于 Java API 实现的。
  • 详细:https://bugstack.cn/md/java/interview/2020-11-11-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E7%AC%AC17%E7%AF%87%E3%80%8A%E7%A0%81%E5%86%9C%E4%BC%9A%E9%94%81%EF%BC%8CReentrantLock%E4%B9%8BAQS%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90%E5%92%8C%E5%AE%9E%E8%B7%B5%E4%BD%BF%E7%94%A8%E3%80%8B.html

06:Thread.start()的启动过程包括?

  • 选项: A.Java 创建线程和启动B.调用本地方法 start0()C.JVM 中 JVM_StartThread 的创建和启动D.设置线程状态等待被唤醒E.根据不同的OS启动线程并唤醒F.回调 run() 方法启动 Java 线程
  • 答案:A、B、C、D、E、F
  • 解析:线程的创建包括了很多底层 C 语言的逻辑,体现在;Thread.c、jvm.cpp、thread.cpp、os.cpp、os_linux.cpp、os_windows.cpp、vmSymbols.cpp
  • 详细:https://bugstack.cn/md/java/interview/2020-11-25-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E7%AC%AC19%E7%AF%87%E3%80%8AThread.start()%20%EF%BC%8C%E5%AE%83%E6%98%AF%E6%80%8E%E4%B9%88%E8%AE%A9%E7%BA%BF%E7%A8%8B%E5%90%AF%E5%8A%A8%E7%9A%84%E5%91%A2%EF%BC%9F%E3%80%8B.html

07:Thread 线程状态包括?

  • 选项: A.NEWB.RUNNABLEC.BLOCKEDD.WAITINGE.TIMED_WAITINGF.TERMINATED
  • 答案:A、B、C、D、E、F
  • 解析:java.lang.Thread.State 的枚举状态包括; NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;
  • 详细:https://bugstack.cn/md/java/interview/2020-12-02-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E7%AC%AC20%E7%AF%87%E3%80%8AThread%20%E7%BA%BF%E7%A8%8B%EF%BC%8C%E7%8A%B6%E6%80%81%E8%BD%AC%E6%8D%A2%E3%80%81%E6%96%B9%E6%B3%95%E4%BD%BF%E7%94%A8%E3%80%81%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90%E3%80%8B.html

08:线程池拒绝策略包括?

  • 选项: A.AbortPolicy(抛异常方式拒绝)B.DiscardPolicy(直接丢弃)C.DiscardOldestPolicy(丢弃存活时间最长的任务)D.CallerRunsPolicy(谁提交谁执行)
  • 答案:A、B、C、D
  • 解析:线程池的拒绝策略包括;抛异常拒绝、直接丢弃、丢弃存活时间最长的和谁提交谁执行。
  • 详细
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值