一些八股文


问题来自互联网。

springBoot和spring的区别

springBoot自动加载的功能

spring的bean的生命周期

链接

synchronized的关键字的理解讲一下

一个普通方法和一个静态方法都用synchronized修饰,调用这两个方法会发生锁竞争吗?

类锁和对象锁不同,他们之间不会产生互斥。

synchronized和reentrantLock说一下理解和区别

ReentrantLocksynchronized的比较

说一下其他几种基于AQS的锁

讲ReentrantReadWriteLock, Semaphore,CountDownLatch,CyclicBarrier的用法和使用场景

Semaphore

StringBuider和StringBuffer

底层是char数组,StringBuilder:线程不安全。

线程池原理和参数的意义讲一下

线程池

jvm的垃圾回收说几个回收器

哪些对象可以作为GCRoot

引用

软引用可用来实现内存敏感的高速缓存。

如果一个对象是偶尔(很少)的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么你应该用Weak Reference来记住此对象。

虚引用主要用来跟踪对象被垃圾回收器回收的活动。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要进行垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

写题

反转链表第n到m个结点

有序数组A和B,将B合并到A中形成新的有序数组

场景题

实现一个接口,该接口被上游调用,向上游承诺300ms返回结果,但是该接口依赖下游5个接口,下游每个接口平均调用时间在100~200ms,让说出该接口的实现思路

服务器2G内存,对磁盘上10G内存排序。我回答的归并排序,然后让我说出具体的排序过程,越详细越好。

大量数据问题:归并、桶。

有1千万条字符串,请问插入hashmap中会遇到什么问题?(我当时只说了插入太慢,会频繁扩容数组,且不能通过多线程来插入,后来想了一下,还会内存溢出,因为数组长度不可能分配一千万那么长)

说一下在RPC服务中如何去实现限流操作,我讲了一下令牌桶算法,然后问我令牌桶不平滑怎么解决,我说可以再加上滑动窗口算法一起实现限流。

滑窗、队列(固定速率取出执行)、令牌桶。

令牌桶:以固定速率生成令牌,请求来了只有取到令牌才能执行。和漏桶(队列)的区别就是可以短期处理一大波流量。

什么时候jvm会发生fullGC?

Redis淘汰策略

Redis为什么这么快

Redis的IO多路复用

MySQL中的事务隔离级别,解决了什么问题

MySQL中的锁

SQL语句性能优化

MySQL explain中的字段的意思

Spring中的事务传播

一个由事务传播行为修饰的方法被嵌套入另一个方法时事务如何传播。

image-20220722150324794

Spring中bean的生命周期

Spring中bean的单例和多例

SQL注入

垃圾回收

手撕:找无序数组中位数

Redis集群中,数据节点上的分布方式

哈希、一致性哈希

抢锁

打麻将,有一个位置是明星的,剩下很多人抢3个位置,怎么给出去的位置不超过3个

Redis分布式锁

实现方式,主要用到哪个命令

setnx key valueexpire

如果并发量不高,数据全部存储在MySQL上,怎么去加悲观锁乐观锁

版本号,判断是否改变。

Redis的五种基本类型

string、hash、list、set、zset。

zset的实现原理,两种实现原理的好处

ziplist、skiplist。

Redis和MySQL数据库一致性

1点多少分会出现时针和分针重合情况

30°,x/60 * 30 + 30 = x/60 * 360。-> x/2 + 30 = 6x -> 30/5.5。

线程池参数

redis过期键删除策略,具体怎么删除的

定时删除、惰性删除、定期删除。

Linux awk

Select * for update 具体做了什么

5个线程做一件任务

提前完成的先处理,所有线程1s内必须返回一次数据。

jdk1.7和1.8的实现异同

stream、hashmap、永久代变为元空间、lambda表达式。。。

已知random() 是0到max的随机正整数,编程实现m到n之间正整数

如:rand7 -> rand10

public int rand10() {
    // 1,2,3,4,5,6,7
    while(true) {
        int tmp = (rand7()-1)*7+rand7();
        if(tmp<=10) return tmp%10+1;
    }
}

输入一个不含相同整数的整数集合,输出所有子集

输入:[1,2,3],输出:[[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]

有三十瓶水,十个桶,每个桶能放0-10瓶水,有多少种方案

一个整数数组,只有一个数字出现一次,其余都是出现两次,找出只出现一次的数字

HashMap实现,扩容机制

ConcurrentHashMap 如何实现线程安全

B树和B+树区别

B树的优点:对于在内部节点的数据,可直接得到,不必根据叶子节点来定位。

聚簇索引和非聚簇索引的区别

MySQL主从同步如何实现

image-20220722165838933
  • 主库把数据变更写入binlog文件
  • 从库IO线程发起dump请求
  • 主库IO线程推送binlog给从库
  • 从库IO线程写入本地的Relay log
  • 从库线程读取relay log,并重新执行一遍

binlog会记录写操作,三种格式:实际执行的命令、数据变换、mixed。

MVCC有什么作用

Redis string 和 zset的实现

SDS,记录len,free。

单调队列

设计一个FIFO队列的数据结构(数据类型为整数),有三种操作:push(往队列末位插入一个整数),pop(从队列前面获取一个整数),getMax(查询队列里面最大的整数)

class MaxQueue {
    Deque<Integer> deque;
    Deque<Integer> maxDeq;
    public MaxQueue() {
        deque = new ArrayDeque<>();
        maxDeq = new ArrayDeque<>();
    }
    
    public int max_value() {
        if(deque.size()==0) return -1;
        return maxDeq.peekFirst();
    }
    
    public void push_back(int value) {
        deque.addLast(value);
        while(!maxDeq.isEmpty()&&value>maxDeq.peekLast()) {
            maxDeq.pollLast();
        }
        maxDeq.addLast(value);
    }
    
    public int pop_front() {
        if(deque.size()==0) return -1;
        int cur = deque.pollFirst();
        if(cur==maxDeq.peekFirst()) {
            maxDeq.pollFirst();
        }
        return cur;
    }
}

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue obj = new MaxQueue();
 * int param_1 = obj.max_value();
 * obj.push_back(value);
 * int param_3 = obj.pop_front();
 */

设计一个朋友圈点赞功能的数据表(不限于MySQL,Redis等)

每个消息含有点赞的set,每个人有set好友列表,取个交集看见朋友圈共同好友点赞。