Interview

JS去重

  • 排序,遍历顺序比较,不同就push到新数组
1
2
3
4
5
6
7
8
9
10
11
let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
let Arr=arr.sort()
let b=[]
for(let i=0;i<Arr.length;i++){
if(Arr[i]!==Arr[i+1]){
b.push(Arr[i])
}
}
return b
}
  • indexOf遍历
1
2
3
4
5
6
7
8
9
10
let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
let b=[]
for(let i=0;i<arr.length;i++){
if(b.indexOf(arr[i])==-1){
b.push(arr[i])
}
}
return b
}
  • map()/forEach()
  • set
1
2
3
4
5
6
let c=[1,2,3,4,5,6,1,2,3]
function unique(arr){
let b=new Set(arr)
let c=Array.from(b)
return c
}

递归regression

Fibonacci

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//迭代,number=40,time=1ms
int Fibonacci(int number) {
if (number <= 0) {
return 0;
}
if (number == 1 || number == 2) {
return 1;
}
int first = 1, second = 1, third = 0;
for (int i = 3; i <= number; i++) {
third = first + second;
first = second;
second = third;
}
return third;
}
//regression n=40,time=272ms
public int Fibonacci(int n) {
if (n <= 0) {
return 0;
}
if (n == 1||n==2) {
return 1;
}
return Fibonacci(n - 2) + Fibonacci(n - 1);
}

变种:青蛙跳台阶

链表

翻转链表

有序链表合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
if(list1.val <= list2.val){
list1.next = Merge(list1.next, list2);
return list1;
}else{
list2.next = Merge(list1, list2.next);
return list2;
}
}

堆和队列

用队列实现堆栈

用堆栈实现队列

Sorting

性能优化

前端优化

  • 减少HTTP请求

数据库优化及后端优化

  • 主索引,唯一索引,常用字段索引
  • 建立缓存机制
  • 分库分表,读写分离
  • 强一致性,弱一致性,最终一致性

HTTPS的认证过程

Java基础

HashMap实现原理

HashMap是拉链(Hash再散列的一种方式)的一种实现方式(JDK1.7之前,以及1.8以后,阈值小于8),左边一列为数组(位桶数组),右边为链表(Entry链,通过equal判断)

Hashmap在JDK1.8,阈值大于8后,采用红黑树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static final class TreeNode extends LinkedHashMap.Entry {
TreeNode parent; // 父节点
TreeNode left; //左子树
TreeNode right;//右子树
TreeNode prev; // needed to unlink next upon deletion
boolean red; //颜色属性
TreeNode(int hash, K key, V val, Node next) {
super(hash, key, val, next);
}
//返回当前节点的根节点
final TreeNode root() {
for (TreeNode r = this, p;;) {
if ((p = r.parent) == null)
return r;
r = p;
}
}

HashMap,HashTable,ConcurrentHashMap

!!可能有错,还未梳理完成

hashmap hashtable concurrentHashMap
底层 数组+链表 数组+链表 数组+链表
线程安全 × ×
null kv不能为空 kv可以为空
初始大小 11 16
扩容 2*old+1 old*2

Redis

使用场景

  • 缓存
  • 登录session

feature:

  • 基于内存(快的原因)
  • 数据结构简单(set hash list zset)
  • 单线程,避免不必要的上下文切换和竞争条件,没有锁,多路I/O复用,非阻塞(和Nodejs一样)

分布式

Kafka优缺点

  • 高吞吐量的消息队列,基本组件:消费者,生产者,node节点等
  • 副本………………

概念

幂等性

数学上,对于x,有f(x)=f(f(x)),则成为幂等性

在分布式环境下,表示对同样的请求,在一次或者多次请求的情况下,对系统的使用资源是一样的,保证失败重试不会导致提交两次

堆栈内存

堆内存:是线程共享的,new

栈内存:线程私有的,基本类型的变量和对象的引用变量

mysql

ACID特性

原子性:

一致性:

隔离性:

持久性:

如何rollback

写入前会有redo log和undo log,如果失败会逆向还原到事务开始之前

灵魂拷问

Java多线程

  • 线程池的原理,为什么要创建线程池?
  • 线程的生命周期,什么时候会出现僵死进程;
  • 什么实现线程安全,如何实现线程安全;
  • 创建线程池有哪几个核心参数?如何合理配置线程池的大小?
  • synchronized、volatile区别、synchronized锁粒度、模拟死锁场景、原子性与可见性;

JVM相关

  • JVM内存模型,GC机制和原理;GC分哪两种;什么时候会触发Full GC?
  • JVM里的有几种classloader,为什么会有多种?
  • 什么是双亲委派机制?介绍一些运作过程,双亲委派模型的好处;(这个我真的不会…)
  • 什么情况下我们需要破坏双亲委派模型;
  • 常见的JVM调优方法有哪些?可以具体到调整哪个参数,调成什么值?
  • JVM虚拟机内存划分、类加载器、垃圾收集算法、垃圾收集器、class文件结构是如何解析的;

Java扩展

  • 红黑树的实现原理和应用场景;
  • NIO是什么?适用于何种场景?
  • Java9比Java8改进了什么;
  • HashMap内部的数据结构是什么?底层是怎么实现的?
  • 说说反射的用途及实现,反射是不是很慢,我们在项目中是否要避免使用反射;
  • 说说自定义注解的场景及实现;
  • List和Map区别,Arraylist与LinkedList区别,ArrayList与Vector 区别;

Spring

  • Spring AOP的实现原理和场景;(应用场景很重要)
  • Spring bean的作用域和生命周期;
  • Spring Boot比Spring做了哪些改进?Spring 5比Spring4做了哪些改进;(惭愧呀,我们还在用Spring4,高版本的没关心过)
  • Spring IOC是什么?优点是什么?
  • SpringMVC、动态代理、反射、AOP原理、事务隔离级别;

中间件

  • Dubbo完整的一次调用链路介绍;
  • Dubbo支持几种负载均衡策略?
  • Dubbo Provider服务提供者要控制执行并发请求上限,具体怎么做?
  • Dubbo启动的时候支持几种配置方式?
  • 了解几种消息中间件产品?各产品的优缺点介绍;
  • 消息中间件如何保证消息的一致性和如何进行消息的重试机制?
  • Spring Cloud熔断机制介绍;
  • Spring Cloud对比下Dubbo,什么场景下该使用Spring Cloud?

数据库

  • 锁机制介绍:行锁、表锁、排他锁、共享锁;
  • 乐观锁的业务场景及实现方式;
  • 事务介绍,分布式事物的理解,常见的解决方案有哪些,什么事两阶段提交、三阶段提交;
  • MySQL记录binlog的方式主要包括三种模式?每种模式的优缺点是什么?
  • MySQL锁,悲观锁、乐观锁、排它锁、共享锁、表级锁、行级锁;
  • 分布式事务的原理2阶段提交,同步异步阻塞非阻塞;
  • 数据库事务隔离级别,MySQL默认的隔离级别、Spring如何实现事务、
  • JDBC如何实现事务、嵌套事务实现、分布式事务实现;
  • SQL的整个解析、执行过程原理、SQL行转列;

Redis

  • Redis为什么这么快?redis采用多线程会有哪些问题?
  • Redis支持哪几种数据结构;
  • Redis跳跃表的问题;
  • Redis单进程单线程的Redis如何能够高并发?
  • Redis如何使用Redis实现分布式锁?
  • Redis分布式锁操作的原子性,Redis内部是如何实现的?