A · Java

一、算法与数据结构

问:已知多个区间范围,区间中的数都不相同,给定一个数,如何快速求出区间所在的下标?

答:排序后,用二分。

二、Java 基础

1 Java17 用过吗?新特性有哪些?

答:用过,忘了。【还不如回答没用过,没用的five!】

正解:

1)

2 常见的集合类用过哪些?

答:Collections 下的类,用的比较多的有 List Set Queue 等。Map 下有用到 HashMap。

正解:

追问:HashMap 的实现原理。

答:【俺背得滚瓜烂熟!】HashMap 的底层实现是一个 Node 数组。初始长度是 16。我们计算 Key 的哈希值,再模 16 来获得 pair 的具体位置。【然后卡壳了,卡卡卡卡壳了......我连背得滚瓜烂熟的东西都忘了TAT】

正解:

  • HashMap的总容量一定是2的幂次方,即使通过构造函数传入一个不是2的幂次方的容量,HashMap也会将其扩充至与其最接近的2的幂次方的值;比如传入总容量为10,则HashMap会自动将容量扩充至16
  • 若是调用HashMap的无参构造方法,则将在第一次执行put方法时初始化一个总容量为16,实际可用容量为12的Node数组
  • 当实际容量超过阈值时,HashMap会进行扩容,扩容至原容量的2倍
  • HashMap的put方法执行流程:首先判断当前table是否为空,若为空,则初始化,若不为空,则根据key的hash计算得到插入位置,再判断该位置是否有元素,若无元素,则直接插入,若有元素,则判断原位置数据的hash值与待插入数据的hash值是否相同,若相同,则继续比较值,若值不同,则创建一个新的Node节点,并使用尾插法将其插入到原数据的节点后面形成链表,若值相同,则采用待插入数据的值覆盖原数据的值,并返回原数据的值
  • HashMap采用链地址法解决hash冲突,所以当某个链表的长度大于8,并且table数组的长度大于64,则当前链表会被转换为红黑树,若table数组的长度尚未达到64,则进行扩容;当链表长度小于6,则会将红黑树转回链表
  • 因为HashMap会根据key的hash值计算插入位置,所以key的数据类型一定要重写hashCode方法,否则会出现两个相同的key结果hash值不相同的情况,也需要重写equals方法,否则equals方法将比较的是地址值
  • 追问:如果我自己定义一个 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 后端面经 文章被收录于专栏

    记录 Java 后端面试经验

    全部评论
    给我的感觉是问的好多,楼主是不是简历上都写有?
    点赞 回复 分享
    发布于 2023-08-23 12:29 广西

    相关推荐

    7 18 评论
    分享
    牛客网
    牛客企业服务