面试整理

面试整理

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

一:算法问题

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

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

上面表格中,为了便于输入,n2表示n的2次方
有些公司(美团、小米)会让写代码,一般能写出快排就行了。
Big-O Algorithm Complexity Cheat Sheet (Know Thy Complexities!) @ericdrowell

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

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

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

3:动态规划

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

  1. 取子数组的最大和
  2. 01背包问题
    动太规划 – 简书
    其它算法参考
    五大常用算法总结 – changyuanchn的专栏 – CSDN博客

3:树结构(了解即可)

树结构 – 简书

3:Paxos算法(加分项)

本人总结在系统一致性 – 简书中的『 2.3 分布式数据一致性的研究现状 』一章,由于paxos相对较为复杂,可参考论文及其它网上资源
Paxos 算法浅析 – 简书
Raft 为什么是更易理解的分布式一致性算法 – mindwind – 博客园
架构师需要了解的Paxos原理、历程及实战

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

    原文作者:lesline
    原文地址: https://www.jianshu.com/p/a9467e529a9a#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞