A · Java
一、算法与数据结构
问:已知多个区间范围,区间中的数都不相同,给定一个数,如何快速求出区间所在的下标?
答:排序后,用二分。
二、Java 基础
1 Java17 用过吗?新特性有哪些?
答:用过,忘了。【还不如回答没用过,没用的five!】
正解:
1)
2 常见的集合类用过哪些?
答:Collections 下的类,用的比较多的有 List Set Queue 等。Map 下有用到 HashMap。
正解:
追问:HashMap 的实现原理。
答:【俺背得滚瓜烂熟!】HashMap 的底层实现是一个 Node 数组。初始长度是 16。我们计算 Key 的哈希值,再模 16 来获得 pair 的具体位置。【然后卡壳了,卡卡卡卡壳了......我连背得滚瓜烂熟的东西都忘了TAT】
正解:
追问:如果我自己定义一个 HashMap 的 key,需要做一些什么工作?
答:重写 hashCode() 方法和 equals() 方法。
追问:在什么情况下需要用到这两个方法呢?
答:put 一个 pair 的时候,先计算 key 的哈希值,检查数组中是否有这个哈希值,如果没有哈希冲突,直接存储这个 pair;如果出现了哈希冲突,就比较两个 key 的哈希值是否一致;哈希值不一致说明不是同一个 key,进行插入操作;哈希值一致则用 equals 方法进行比较,如果不一致则进行插入操作;如果一致则进行更新操作。插入操作中,检查数组的该位置是红黑树还是链表,进行插入操作。当链表的长度超过 8 时,就转换为红黑树。
追问:HashMap 并发情况下安全吗?
答:不安全,要用到 ConcurrentHashMap。ConcurrentHashMap 操作的时候会锁住 Node。
3 多线程的实际应用场景?
答:文件处理的时候。
追问:如何汇总操作的结果?
答:每个文件有自己的 id,不会产生冲突。
4 进程和线程有什么区别?
答:1. 定义;2. 隔离程度;3. 资源共享程度;4. 通信方式。
5 刚刚你说到了 JVM 中的一些概念,对 JVM 有什么了解?
答:看过书,但忘了。【你不如说没看过!five!】
正解:JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
or
JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运行,这也是Java能够“一次编译,到处运行的”原因。
追问:JDK、JRE、JVM 有什么区别?
正解:JDK 是 Java 开发者工具,JRE 是 Java 运行时环境,JVM 是 Java 虚拟机。
追问:简单说一下 JVM 里有哪几部分内容?
答:线程共享的区域包括堆、方法区,线程独有的区域包括PC、本地方法栈、虚拟方法栈。【大错特错!】
正解:JVM分为五大模块: 类装载器子系统、运行时数据区、执行引擎、本地方法接口和垃圾收集模块。
追问:对象一般放在什么地方?变量一般放在什么地方?
答:对象放在方法区,变量放哪我真忘了。
正解:
6 垃圾回收算法?
答:标记-清除,标记-复制,标记-整理,分代收集法。
7 变量判活?
答:引用计数法,可达性分析。
8 Transient 关键字作用?
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
9 TCP 为什么有三次握手和四次挥手?
答:【盘了好一会儿】第一次握手是为了验证客户端的发送能力,第二次握手是为了验证服务端的接收能力和发送能力,第三次握手是为了验证客户端的接收能力。
追问:两次握手可以不可以?
答:我现在觉得可以。【……震耳欲聋的沉默】
三、项目
1 介绍一下实习的项目。
答:团队项目背景介绍+业务场景介绍。
2 你在项目中具体参与了哪些部分,使用了哪些技术?
答:具体参与了一些小的需求开发。技术用到了 Redis 和 Kafka。
3 什么是 Redis?为什么要用到 Redis?
答:【心里很慌因为好久之前看的八股不记得了QAQ】Redis 是一个内存数据库。之所以用到它是因为缓存用到它了。
正解:
追问:你了解 Redis 的原理吗?
答:Redis 的高效在于内存读取快,并且是单线程处理;Redis 可以进行横向拓展,当并发量高时,可以使用 Redis 集群来进行扩充;Redis 采用主从复制、读写分离来保障高可用性和高可靠性。
追问:请求量比较大的情况下,一台主的机器用来写会不会不够用?
答:使用哈希的方式对请求进行分散。比如一致性哈希算法。【不知道自己在说什么,全程胡言乱语】
追问:什么时候用 Redis,什么时候用普通数据库如 MySQL?
答:Redis 一般用于缓存,或者并发量特别大的情况下。
正解:什么时候需要用redis?
● 不需要实时更新但是又极其消耗数据库的数据。比如网站上商品销售排行榜,这种数据一天统计一次就可以了,用户不会关注其是否是实时的。
● 需要实时更新,但是更新频率不高的数据。比如一个用户的订单列表,他肯定希望能够实时看到自己下的订单,但是大部分用户不会频繁下单。
● 在某个时刻访问量极大而且更新也很频繁的数据。这种数据有一个很典型的例子就是秒杀,在秒杀那一刻,可能有N倍于平时的流量进来,系统压力会很大。但是这种数据使用的缓存不能和普通缓存一样,这种缓存必须保证不丢失,否则会有大问题。
一般地,Redis可以用来作为MySQL的缓存层。为什么MySQL最好有缓存层呢?想象一下这样的场景:在一个多人在线的游戏里,排行榜、好友关系、队列等直接关系数据的情景下,如果直接和MySQL正面交手,大量的数据请求可能会让MySQL疲惫不堪,甚至过量的请求将会击穿数据库,导致整个数据服务中断,数据库性能的瓶颈将掣肘业务的开发;那么如果通过Redis来做数据缓存,将大大减小查询数据的压力。在这种架子里,当我们在业务层有数据查询需求时,先到Redis缓存中查询,如果查不到,再到MySQL数据库中查询,同时将查到的数据更新到Redis里;当我们在业务层有修改插入数据需求时,直接向MySQL发起请求,同时更新Redis缓存。
追问:用 Redis 做缓存有没有什么需要注意的地方?
提示:比如缓存多久失效?怎么保证缓存与数据库中的数据保持一致?
答:持久化机制,RDB 和 AOF,环状缓冲区。【这里说错了哦!——墓志铭】
正解:https://blog.csdn.net/zhizhengguan/article/details/120616508
4 什么是 Kafka?为什么要用到 Kafka?
答:消息队列的三大功能是解耦、异步、削峰平谷。
追问:消息队列的顺序性?
答:分区内部是有序的。
追问:不同分区之间是无序的,实际应用场景怎么使用?
答:我们的项目中不需要保证有序性。【乖巧.jpg】
评价
对面试官的打分:10 / 10 【面试官人真的挺好的,声音也好听,问的问题也是根据我的回答追问的,也没有为难我。专业水平在线。给满分!!!】
对本人的打分: 2 / 10 【问啥啥不会/(ㄒoㄒ)/~~】
记录 Java 后端面试经验