美团笔试题:
- 小美的数字卡片
字典序写出每种排列方式:
比如1 2 3的方式是1 2 3;1 3 2;2 1 3;2 3 1;3 1 2;3 2 1六种方式
有重复数组全排列:47. 全排列 II
class Solution {
List<List<Integer>> result = new ArrayList();
int[] arr;
boolean[] used;
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums); // 排序
used = new boolean[nums.length];
List<Integer> list = new ArrayList();
this.arr = nums;
dfs(list,0);
return result;
}
public void dfs(List<Integer> res,int index){
if(index==arr.length){
result.add(new ArrayList<Integer>(res));
return;
}
int pre = -10;
for(int i=0;i<arr.length;i++){
if(!used[i]){
if(i>0&&arr[i]==pre) {
continue;
}else pre = arr[i];
used[i] = true;
res.add(arr[i]);
dfs(res,index+1);
res.remove(res.size()-1);
used[i] = false;
}
}
}
}
美团一面
面试官给人的感觉很好,首先把你能想起来的知识点进行一个索引,
- java python c之间的语言特性的对比总结
- java集合
- java多线程
- 库存管理系统项目
自己需要补充总结的地方:一个是HashSet,LinkedHashMap,ConcurrentHashMap常用的API的使用,还有不常用的集合都要总结一下他们的区别。再补充一下动态代理,反射,泛型,多态
需要学习的地方:一个是秒杀项目,另一个是框架,JVM,数据库,计算机网络,操作系统面经
自己补充一下面试中回答的不好的地方:
java,python,C之间的区别和关系
多线程的创建和使用(薄弱之处)
四种创建方式
继承Thread类和实现Runable接口:省略
实现Callable接口
线程池的四种创建线程的方式:(创建多线程的区别)
集合的底层实现
HashSet和HashMap:为什么选用HashSet,不直接HashMap
TreeMap
HashMap实现原理
构造器
怎么扩容的
put()实现
get()实现
迭代器实现
ConcurrentHashMap实现原理
怎么解决多线程的并发问题的
LinkedHashMap实现原理
怎么实现顺序遍历的
库存管理系统项目介绍
项目背景:
做了什么:
成果什么:
贝壳一面
计算机网络,操作系统部分基础知识(知识盲区)
垃圾回收算法(知识盲区)(JVM)
线程池的使用,以及参数(知识盲区)
hash碰撞后除了链表还有什么解决方式
开放定址法
当关键字key的哈希地址p=Hash(key)出现冲突时,以p为基础,在产生另一个哈希地址,如果仍然冲突,那么以p为基础再产生另一个哈希地址…直到找到一个不冲突的哈希地址。
Hi = (Hash(key)+
d
i
{d_i}
di)% m 其中i=1,2,3,4…n
d
i
d_i
di称为增量序列,根据增量序列的取值不同,相应的再散列方式也会不同。具体可以分为线性探测再散列,二次探测再散列和伪随机探测再散列。
劣势:
容易产生堆积问题;不适于大规模的数据存储;散列函数的设计对冲突会有很大的影响;插入时可能会出现多次冲突的现象,删除的元素是多个冲突元素中的一个,需要对后面的元素作处理,实现较复杂;结点规模很大时会浪费很多空间;
再哈希法
当哈希地址Hi=ReHash(key)发生冲突时,再计算Hi=ReHash2(key),直到冲突不再产生,这种方法不容易产生聚集,但是增加了计算时间。
链地址法
将Hash地址相同的元素构建为一个链表。
拉链法的缺点:需要额外的存储空间。
建立公共溢出区
将哈希表分为基本表和溢出表两个部分,凡是和基本表发生冲突的元素,一律填入溢出表。
缺点: 如未能命中哈希表 需要遍历查找溢出表 查询效率低
CAS是怎么实现的
CAS有三个操作数:内存值V、旧的预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做并返回false
sychronized的实现过程以及用处
https://blog.csdn.net/javazejian/article/details/72828483
算法题不难,二叉树的中序遍历非递归实现,但是写的时候判断条件错误
什么情况下会发生OOM
https://blog.csdn.net/lovedingd/article/details/104650249
sychronized怎么升级的
https://juejin.cn/post/6844903913120874510
java的数据区都有什么,(JVM)
消息队列
项目相关
高并发以及K8s
拼多多一面
OOM,什么时候会发生OOM
Java中的垃圾回收算法
自定义线程池怎么使用
有多个线程请求,怎么解决冲突问题
futureTask使用的什么方法返回的,好像是accept()
消息队列
java中的缓存,redis,kafka,怎么自己设计一个缓存
强引用和弱引用
阻塞队列
数据库索引,如何提高数据库性能
mysql和postgresql的区别。
接口和抽象类的区别
sql怎么优化,可以添加索引
百度一面:
计网相关:
http请求状态码之类
进程和线程区别
事务的四大特性和隔离级别的理解
数据库索引,B+树和B树的优势和区别
扩展:
- 怎么建索引,建立索引的原则
- 给一个sql语句判断是否走索引
- 索引底层数据结构,B+Tree的特点,hash索引和B+Tree索引的区别
索引为什么能提高查询速度 - 操作系统了解吗,大概了解到什么程度?
- 计网TCP、UDP区别,主要是三握四挥(为什么握手是三次,为什么要有TIME_WAIT?)
- 数据库索引数据结构
- 事务四大特性
- MVCC了解
- http状态码
- 进程和线程的区别
- synchronized基于什么实现线程安全?几种用法?
- lock有哪几类?大概有什么特点?底层是什么?(答到AQS,面试官笑着问,具体实现原理了解吗,我说不了解,我们俩都笑了,然后他说好)
- MySQL索引相关,底层数据结构,怎么建索引?
爱奇艺一面
快手一面
tcp协议和udp协议,相关面经问题找找
他们之间的区别
华为一面二面三面
交行二面
阿里测开一面
拼多多客户端一面
泛型的优势:
增加了可扩展功能,使得数据类型可以作为参数传递进来。
提供了类型检测机制
提高了代码的可读性,可以直接看出来容器里面的数据类型。
设计模式:
设计模式六大原则:
- 单一职责原则(一个类不应该承担太多功能,如果一个类承担了太多功能,那么这个类应该被拆分为多个类,否则会不得不将其他不需要的职责全部包含进来,造成代码冗余)将对接进行低耦合,高内聚。
- 开闭原则(抽象约束,封装变化,将相同的可变因素封装在相同的具体实现类中)
- 里氏替换原则,子类可以实现父类的抽象方法,但不能覆盖父类的抽象方法,子类可以增加自己特有的方法。
- 依赖倒置原则,面向接口编程,而不是面向对象编程。
- 接口隔离原则,将庞大的接口分解为多个粒度小的接口。
- 迪米特原则,降低子类之间的耦合度。
主要有哪些设计模式以及区别
-
单例模式
-
工厂模式:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
-
代理模式:与原始对象实现同一个接口,所以行为相同,代理模式直接转发原始对象对应接口的内容。代理模式可以增加一些额外的工作。额外工作主要是一些辅助功能,并非核心功能。
-
装饰器模式:于原始对象实现同一个接口,行为相同,装饰对象在调用原始对象接口前后做一些额外的工作,额外工作会修改原始对象的功能,自身对象主要实现的才是核心功能。
-
适配器模式:跟原始对象实现两套不同的接口,完成新旧两套接口的适配工作,所以适配对象跟原始对象行为不同,但是内容是相似的。
-
职责链模式:使多个对象都有机会处理请求,中二避免请求的发送者和接收者之间的耦合关系,很多对象对其下家的引用而连接起来形成一条链,请求在这个链上传递,直到链上某一个对象决定处理这个请求。主要用于中间件。