【面经分享】滴滴
ArrayList、LinkedList
ArrayList 基于数据实现
- 查找效率高
- 增删效率低
LinkedList 基于链表实现
- 增删效率高
- 查找效率低
HashMap
JDK 1.7:数组 + 链表
JDK 1.8:数组 + (链表 | 红黑树)
- 树化条件:数组长度 >= 64 ,且链表长度 >= 8 (会先扩容)
MySQL 索引
B +树
Hash 索引
倒排索引
Redis 缓存一致性
先更新数据库,再删缓存。
分布式锁底层
Bitmap
0 1 数组
MQ 如何保证不重不漏 ?
不重:
- 主要就是 Consumer 端做 防重设计。
Producer 端会阻塞等待 Broker 返回 ACK,否则重试。
Broker
Consumer
不漏:
Producer 端会重试。
Broker 端刷盘持久化。(同步/异步)
Consumer 端消费完之后,返回 ACK 消息给 Broker。
单例模式
public class Klass {private Klass(){}private static volatile Klass obj;public static Klass getObj(){if(obj == null){synchronized (Klass.class){if(obj == null){obj = new Klass();}}}return obj;}}
算法:字符串转数字/大数相乘
43. 字符串相乘 - 力扣(LeetCode)
大数相乘:(字符串模拟)
class Solution {public String multiply(String num1, String num2) {int n = num1.length(), m = num2.length();int[] str1 = new int[n], str2 = new int[m];// 反转数组for (int i = 0; i < n; i++)str1[i] = num1.charAt(n - i - 1) - '0';for (int i = 0; i < m; i++)str2[i] = num2.charAt(m - i - 1) - '0';// 模拟竖式计算int[] res = new int[n + m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {res[i + j] += str1[i] * str2[j];}}// 进位int carry = 0;for (int i = 0; i < m + n; i++) {res[i] += carry;carry = res[i] / 10;res[i] %= 10;}// 去除前导0int end = m + n - 1;while (end >= 0 && res[end] == 0)end--;// 拼接答案StringBuilder sb = new StringBuilder();while (end >= 0) {sb.append((char) (res[end] + '0'));end--;}return sb.toString().length() != 0 ? sb.toString() : "0";}
}