面试整理

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 面试整理 年前换工作,进行了面试,准备面试的过程学习到了一些东西,在此整理出来,供大家参考。

面试整理

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

一:算法问题

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/
占小狼 - 简书

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
定位技术
【CCCC】L3-007 天梯地图 (30分),两次Dijkstra+路径打印(数据点2,4错因),90行最短题解
【CCCC】L3-007 天梯地图 (30分),两次Dijkstra+路径打印(数据点2,4错因),90行最短题解
275 0
|
2月前
|
人工智能 供应链 Kubernetes
|
存储 运维 容灾
带你读《企业数字化基石-阿里巴巴云计算基础设施实践》第二章TOC建模2.3TCO最优
《企业数字化基石-阿里巴巴云计算基础设施实践》第二章TOC建模2.3
671 0
带你读《企业数字化基石-阿里巴巴云计算基础设施实践》第二章TOC建模2.3TCO最优
|
5月前
|
开发者 索引
HarmonyOS使用系统图标
HarmonyOS图标符号是系统内置的图标资源库,开发者可通过SymbolGlyph和SymbolSpan组件高效引用图标资源,简化开发流程并确保应用与系统设计风格一致。通过`$r(&#39;sys.symbol.resource_name&#39;)`访问系统图标资源,支持调整大小、颜色、粗细、渲染策略及动效。更多示例和学习资料详见官方文档和教程。
247 2
HarmonyOS使用系统图标
|
SQL 流计算
Flink SQL 功能解密系列 —— 数据去重的技巧和思考
去重逻辑在业务处理中使用广泛,大致可以分两类:DISTINCT去重和FIRST_VALUE主键去重,两者的区别是DISTINCT去重是对整行数据进行去重,比如tt里面数据可能会有重复,我们要去掉重复的数据;FIRST_VALUE是根据主键进行去重,可以看成是一种业务层面的去重,但是真实的业务场景使用也很普遍,比如一个用户有多次点击,业务上只需要取第一条。
阿里云Grafana告警管理
Grafana服务默认集成到ARMS告警管理中,通过在Grafana中配置告警的通知对象可以将Grafana的告警事件上报至ARMS告警管理中。在ARMS告警管理中配置Grafana对应的通知策略后,系统将会通过电话、短信、邮件或钉钉的方式发送告警通知。本文介绍如何通过配置Grafana告警将Grafana告警上报至ARMS告警管理。
856 1
阿里云Grafana告警管理
|
SQL 安全 关系型数据库
配置和启动测试 HIVE|学习笔记
快速学习配置和启动测试 HIVE
配置和启动测试 HIVE|学习笔记
|
Java Android开发
Android日志工具Log的使用
Android日志工具Log的使用
661 0
Android日志工具Log的使用
|
JSON 监控 网络协议
Nginx最常用的七种模块配置
1.Nginx目录索引 Nginx默认是不允许列出整个目录浏览下载 配置目录索引的命令 语法格式:autoindex on | off ; on开启 off关闭 默认配置:autoindex off; 如果默认开启的话所有的文件都会以列表形式累出来,这些文件是不能给用户看到的 配置区域:http(对所有站点生效)、server(对单个站点生效)、location(对单个页面生效,最常用) autoindex常用参数
1114 0
Nginx最常用的七种模块配置
|
存储 SQL 分布式计算
【ClickHouse 技术系列】- ClickHouse 聚合函数和聚合状态
本文翻译自 Altinity 针对 ClickHouse 的系列技术文章。面向联机分析处理(OLAP)的开源分析引擎 ClickHouse,因其优良的查询性能,PB级的数据规模,简单的架构,被国内外公司广泛采用。本系列技术文章,将详细展开介绍 ClickHouse。
【ClickHouse 技术系列】- ClickHouse 聚合函数和聚合状态