面试整理

简介: 面试整理 年前换工作,进行了面试,准备面试的过程学习到了一些东西,在此整理出来,供大家参考。

面试整理

年前换工作,进行了面试,准备面试的过程学习到了一些东西,在此整理出来,供大家参考。

一:算法问题

1:各排序及时间复杂度(必问)


冒泡排序 合并排序 快速排序
最坏时间复杂度 n2 nlog(n) n2
最好时间复杂度 n2/n nlog(n) nlog(n)
平均时间复杂度 n2 nlog(n) nlog(n)
最坏空间复杂度 1 n log(n)

上面表格中,为了便于输入,n2表示n的2次方
有些公司(美团、小米)会让写代码,一般能写出快排就行了。

Big-O Algorithm Complexity Cheat Sheet (Know Thy Complexities!) @ericdrowell


代码如下:
冒泡排序 - 简书
快速排序 - 简书
归并排序 - 简书

2:链表反转(有些公司会让手写)

单链表反转总结篇 - BYRHuangQiang - 博客园

3:动态规划

动态规划问题有很多,这里只讨论两个问题:

  1. 取子数组的最大和
  2. 01背包问题
    动太规划 - 简书

其它算法参考

五大常用算法总结 - changyuanchn的专栏 - CSDN博客

3:树结构(了解即可)

树结构 - 简书

4:Paxos算法(加分项)

本人总结在系统一致性 - 简书中的『 2.3 分布式数据一致性的研究现状 』一章,由于paxos相对较为复杂,可参考论文及其它网上资源

Paxos 算法浅析 - 简书
Raft 为什么是更易理解的分布式一致性算法 - mindwind - 博客园
架构师需要了解的Paxos原理、历程及实战&version=11020201&pass_ticket=bhstP11nRHvorVXvQ4pt9fzB9Vdzj5sSRBe84783gsg%3D)

二:JAVA基础

1:String 类的intern方法

深入解析String#intern -

2:Hashmap为什么线程不安全,及put过程,扩容过程,死循环产生的过程(必问)

HashMap实现原理 - 简书
参考:
疫苗:Java HashMap的死循环 | | 酷 壳 - CoolShell
HashMap多线程死循环问题 - CSDN博客
注意:HashMap 、ConcurrentHashMap 是看源码最好的入门,有数组、链表、红黑树,最好通读下源码。

3:java自带的的分析问题工具

jmap
jvisualvm
jconsole
Jstack简单使用,定位死循环、线程阻塞、死锁等问题
高手是怎么使用jstack精确找到异常代码的_百度经验
《深入理解Java虚拟机》读书笔记3:虚拟机性能监控与调优实战 | GinoBeFunny

4:如果系统宕机,可以通过分析jvm中的内存对象,查找问题

  1. jvm设置:-XX:+HeapDumpOnOutOfMemoryError —宕机时dump生成的.hprof文件
  2. 用工具分析:内存分析工具MAT(Memory Analyzer Tool)、IBM HeapAnalyzer

5:jdk1.8新特性

Java 8 简明教程 · Java 8简明教程

6.内存结构和垃圾回收算法及垃圾回收器适用场景

jvm总结 - 简书

7:多线程问题

多线程的问题范围比较多,这里列出常面试的两点:

1、线程池原理及怎么设置更合理

线程池的两个参数解释
注意:maximumPoolSize是在队列满时才会以此为最大数创建新线程):
corePoolSize:线程池中的核心线程数,当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行;如果执行了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线程。
maximumPoolSize:线程池中允许的最大线程数。如果当前阻塞队列满了,且继续提交任务,则创建新的线程执行任务,前提是当前线程数小于maximumPoolSize。
设置线程池大小
设置线程池大小要考虑是cpu密集型还是io密集型,精细化设置的话还要考虑:线程等待时间、线程CPU时间。
如何合理设置线程池大小 - CSDN博客

2、关键字及工多线程工具类

ThreadLocal:Java面试必问,ThreadLocal终极篇
volatile:面试必问的volatile,你了解多少? - 简书
CountDownLatch/CyclicBarrier/Semaphore

8:NIO AIO问题

实际工作中很少直接使用NIO,面试时问NIO很多情况下会引入netty,netty除了网上相关资料(推荐「占小狼的博客」),可以看『netty权威指南』和『netty实战』

spring

Ioc aop原理

待整理

拦截器是怎么实现

待整理

Spring事务传播机制

网上很多

Mybatis

Mybatis与$与#区别(容易记反)

浅谈 Mybatis中的 ${ } 和 #{ }的区别 - 大头就是我 - 博客园

中间件应用

1:分库分表

如何分库分表及sharding-jdbc分库分表后如何实现分页:
sharding-jdbc 按时间分库分表 - 简书

2:dubbo原理和热部署

参考dubbo官网
Overview | DUBBO

3:zookeeper选举算法及分布式锁实现

参考在系统一致性 - 简书中的『 2.3.2 Paxos实践应用->ZAB协议->选主阶段(Leader election)』一章
排它锁:建临时节点
同享锁:建临时顺序节点(具体可参考<从paxos到zookeeper>一书)

4:redis数据结构及分布式锁的实现方式

redis分布式锁实现 - 简书
单机实现:
通过set命令加NX/PX参数实现加锁
jedis.set(lockKey, requestId, "NX", "PX", expireTime);
requestId:可为UUID,删除时使用
通过del命令解锁:
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Lua脚本调用保证命令的原子性
通过判断requestId(可为UUID),是否为本线程,防止其它线程误删。
集群实现:
Redlock算法:类似paxos算法,拥有N个Redis master节点的集群,只有超过半数的结点获取锁成功后,认为锁成功。
Distributed locks with Redis – Redis
《Redis官方文档》用Redis构建分布式锁 | 并发编程网 – ifeve.com

5:mq如何保证不丢失消息

mq信息要固化到硬盘或数据库
可参考系统一致性 - 简书中的『 2.2.5事件驱动模式 』一章

6:更新缓存与db同步

缓存与db属于不同的两个系统,我们知道绝对的数据一致性是不可以的,重点是如何保证最终的一致性,而不影响使用
缓存和db的读写先后问题网上有很多讨论,实际应用中各种方式都有,可以确定的原则有两点:
1、为了防止空值信息每次都击穿缓存到数据库,增加NullObject(空对象):如果一个查询在缓存中没有,在数据库中也没有,这样每次都会对击穿数据库进行查询,造成DB负载过大
2、尽量设置过期时间,缓存资源有限,防止无效数据一直占用资源。当然也看到有些特例,有些场景面要让数据一直在缓存中,可能通过定时任务,在缓存失效前重置失效时间。

7:Redis与Memcached区别:

1: Memcached 只支持key/value;Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

redis 哈希(散列): 相当于hashmap
eg:HSET key field value(HSET car price 500)
redis 列表: 相当于 对队queue
eg:LPUSH key value(LPUSH numbers 1)
redis 集合: 相当于set
eg:SADD key member (SADD letters a)
redis 有序集合:相当于sorted set:加入分数,通过散列表和跳跃表实现
eg:zadd key score member(ZADD scordboard 89 tom)

2: 在Redis中,并不是所有的数据都一直存储在内存中的,Memcached是。
3:redis可以定期保存到磁盘(持久化),Memcached不能。
4:Memcached是多线程,非阻塞IO复用的网络模型,Redis使用单线程的IO复用模型。
还有其它区别,具体搜索网上资料

数据库

mysql不同引擎的区别,数据结构,事务隔离级别以及如何实现隔离

数据库隔离级别 - 简书

其它

sql优化、索引、组合索引相关

前端:

一般做后端的前端都较弱,所有在面试官在问前端知识时,你可以回答解题的思路,具体函数名、参数什么的网上搜索相关开发手册就行。

js闭包

这里特别提下闭包,毕竟这点跟java有很大区别
Javascript闭包——懂不懂由你,反正我是懂了_知识库_博客园
Java8闭包 - yanweiqi - 博客园
闭包(Java中的闭包) - CSDN博客

开放性问题:

1、看了哪些书

2、遇到哪些难题,怎么解决的

3、哪方面你最擅长,讲一下/你有什么优势

这些问题较为开放,面试次数多了就有经验了,不过尽量还是提前组织一下语言。

推荐

推荐书籍:

  1. java并发编程实战(重理论)
  2. java并发编程的艺术(重使用)
  3. spring源码深度解析
  4. Spring实战(Spring Boot实战)
  5. 重构
  6. 代码整洁之道
    还有其它书籍,但这几本看时最为舒畅,本人以为好的书满足两个条件:一是问题讲清楚,二是用最简单的方式进行讲述。这几本满足这两个条件。

网站及博客

推荐一个网站、一个博客,特别是占小狼的博客,里面即有技术的总结,还有一些方法的推荐,有空尽量都过一遍:
https://tech.meituan.com/
占小狼 - 简书

相关文章
通过python-docx给word文档中的指定位置添加表格
1.读取一个已有的word文档。docx格式。 2.在该word文档中,通过一个给定的文字。找到该位置。在该位置的下方添加一个表格。例如在图中“BUG情况表”的下方插入一个表格
3410 1
通过python-docx给word文档中的指定位置添加表格
|
2月前
|
人工智能 运维 关系型数据库
云栖大会|AI时代的数据库变革升级与实践:Data+AI驱动企业智能新范式
2025云栖大会“AI时代的数据库变革”专场,阿里云瑶池联合B站、小鹏、NVIDIA等分享Data+AI融合实践,发布PolarDB湖库一体化、ApsaraDB Agent等创新成果,全面展现数据库在多模态、智能体、具身智能等场景的技术演进与落地。
|
数据可视化 API 开发者
通俗易懂:一步步教你 Flask 项目自动生成 API 文档
Flasgger,作为一款强大的 Flask 扩展,自动从 Flask 应用中提取并生成 OpenAPI 规范文档,配备 SwaggerUI,为开发者提供了一条快捷通道,让 API 的文档编制和交互式测试变得简单易行。Flasgger 的设计原则是简化开发流程,通过与 Flask 框架的无缝整合,让开发者可以更专注于应用逻辑的构建。
|
定位技术
【CCCC】L3-007 天梯地图 (30分),两次Dijkstra+路径打印(数据点2,4错因),90行最短题解
【CCCC】L3-007 天梯地图 (30分),两次Dijkstra+路径打印(数据点2,4错因),90行最短题解
347 0
|
7月前
|
人工智能 供应链 Kubernetes
|
11月前
|
消息中间件 Java 数据库
自研Java框架 Sunrays-Framework使用教程「博客之星」
### Sunrays-Framework:助力高效开发的Java微服务框架 **Sunrays-Framework** 是一款基于 Spring Boot 构建的高效微服务开发框架,深度融合了 Spring Cloud 生态中的核心技术组件。它旨在简化数据访问、缓存管理、消息队列、文件存储等常见开发任务,帮助开发者快速构建高质量的企业级应用。 #### 核心功能 - **MyBatis-Plus**:简化数据访问层开发,提供强大的 CRUD 操作和分页功能。 - **Redis**:实现高性能缓存和分布式锁,提升系统响应速度。 - **RabbitMQ**:可靠的消息队列支持,适用于异步
自研Java框架 Sunrays-Framework使用教程「博客之星」
|
人工智能 Cloud Native 大数据
100+PDF开放下载!云栖大会一手资料来啦!(持续更新中)
我们为大家整理了本次云栖大会主分论坛共100多个PDF,欢迎下载学习!
26298 73
|
JSON 安全 搜索推荐
快速生成定制化的Word文档:Python实践指南
1.1. 前言 众所周知, 安服工程师 又叫做 Word工程师 ,在打工或者批量SRC的时候,如果产出很多,又需要一个一个的写报告的情况下会非常的折磨人,因此查了一些相关的资料,发现使用python的 docxtpl 库批量写报告效果很不错,记录一下。 1.2. 介绍 docxtpl 是一个用于生成 Microsoft Word 文档的模板引擎库,它结合了 docx
741 0
阿里云Grafana告警管理
Grafana服务默认集成到ARMS告警管理中,通过在Grafana中配置告警的通知对象可以将Grafana的告警事件上报至ARMS告警管理中。在ARMS告警管理中配置Grafana对应的通知策略后,系统将会通过电话、短信、邮件或钉钉的方式发送告警通知。本文介绍如何通过配置Grafana告警将Grafana告警上报至ARMS告警管理。
1143 1
阿里云Grafana告警管理