头条
一面
- 算法题:二分搜索相关
二分搜索:又叫二分查找,即折半查找
关键代码:
方法一:递归调用
public int search1(int num[],int target,int left,int right){
int mid = (left+right)/2;
if(num[mid]==target){
return mid;
} else if(num[mid]>target){
search(num,target,left,mid-1);
}else{
search(num,target,mid+1,right);
}
return -1;
}
方法二:while循环
public int search2(int num[],int target){
int left=0;
int right=num.length-1;
while(left <= right){
int mid = (left + right)/2;
if(num[mid] == target){
return mid;
}else if(num[mid]<target){
left = mid+1;
}else{
right = mid-1;
}
}
return -1;
}
- 概念题:解释 分布式、微服务、负载均衡、高可用
分布式:就是将一个系统的各个组件分布在网络上的各台主机,并且各组件之间仅通过消息传递通信并协调工作。
分布式与集群的区别:分布式是指将不同的子业务分布在不同的地方,集群是指将几台服务器完成同一个业务。分布式的每一个节点都可以做集群,可是集群不一定是分布式。若分布式的某一节点垮了,则该节点的业务无法访问,因为分布式不同的节点完成不同的业务。若集群的某一节点垮了,则其他服务器顶上,该业务继续正常被访问。
微服务:单个服务的设计,所以参与人从设计、开发、测试、运维所有人加起来只需要两个人。服务一个或者一组相对较小且独立的功能单元。
负载均衡:就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
链接:https://www.cnblogs.com/xzwblog/p/7255364.html
高可用:描述一个系统经过专门的设计,,从而减少停工时间,而保持其服务的高度可用性。百度百科解释 - http是有状态还是无状态? TCP是有状态还是无状态?
http是无状态的,tcp是有状态的。
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送HTTP请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
http无状态带来的问题:用户登录后,切换到其他界面,进行操作,服务器端是无法判断是哪个用户登录的。 每次进行页面跳转的时候,得重新登录。
怎样让http变成有状态的?Cookie 和 Session 两种保持http状态的技术。
详细解析https://blog.csdn.net/H_Expect/article/details/99967490 - 客户端禁用cookie怎么办? 你说的实现方式安全吗?
还有URL重写技术和Session。 - SSL,http和https,https是有状态还是无状态?
https是有状态的,用为https=http+ssl,而ssl是面向连接的。 - String为什么设计成final不可变? 是怎么实现不可变的?
- 自己能实现一个不可变的类吗?
package cn.lsy.test;
public class FINAL_CLASS {
private final String name;
private final int id;
public FINAL_CLASS(String name,int id){
this.name=name;
this.id=id;
}
public final String getName() {
return name;
}
public final int getId() {
return id;
}
}
- equals 和 hashcode 为什么要一起重写?如果不重写hashcode会出现什么问题?
现有两个对象
Student s1 = new Student(“小明”,18);
Student s2 = new Student(“小明”,18);
假如只重写了equals 没有重写hashcode,那么student类的hashcode方法就是Object里默认的hashcode方法,由于默认的hashcode方法是根据对象的内存地址经过哈希算法得来的,显然此时s1!=s2,故两者的hashcode不一定相等。
然而重写了equals,且s1.equals(s2)返回true,根据hashcode的规则,两个对象相等则hashcode则一定相等。于是矛盾产生了,所以重写equals一定要重写hashcode。 - hashmap插入的时候,哈希冲突解决? 查找的时候,哈希冲突怎么解决?
源码
static final int MAXIMUM_CAPACITY = 1 << 30;
//为什么是2的30次方,因为Integer.MAX_VALUE == 1 << 30;
static final float DEFAULT_LOAD_FACTOR = 0.75f;//负载因子。当前容量大于整个容量的75%,开始扩容。
void resize(int newCapacity) {
Entry[] oldTable = table;
int oldCapacity = oldTable.length;
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return;
}
Entry[] newTable = new Entry[newCapacity];
transfer(newTable);
table = newTable;
threshold = (int)(newCapacity * loadFactor);
}
1.如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?
默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。这个值只可能在两个地方,一个是原下标的位置,另一种是在下标为<原下标+原容量>的位置
2.重新调整HashMap大小存在什么问题吗?
当重新调整HashMap大小的时候,确实存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了。(多线程的环境下不使用HashMap)
扩容步骤:
1.扩容:创建一个新的Entry空数组,长度是原数组的2倍。
2.ReHash:遍历原Entry数组,把所有的Entry重新Hash到新数组。为什么要重新Hash呢?因为长度扩大以后,Hash的规则也随之改变。
hash公式:index = HashCode(Key) & (Length - 1)
- hashset是怎么实现的? hashmap是怎么实现hashset的?
通过new HashMap()实现的,底层数据结构是哈希表,cun存取比较方便,线程不安全。
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
- 多线程:并发和并行,原子类,CAS操作
- mysql的索引:B+树底层实现?B树的底层实现?为什么要用B+树而不用B树?
- 最左前缀匹配具体是怎么实现查找的?最左前缀匹配用了B+树的哪些特性?
- (a,b,c)联合索引,为什么不能单用(b),而一定要用(a,b)?B+树是怎么实现的?
- 什么是幻读,不可重复读?这些概念是在事务内还是事务外? 事务内
- mysql怎么实现可重复读?设置了可重复读隔离级别底层是怎么实现的? (MVCC)
- 了解MVCC吗?怎么实现的?什么是快照读?快照读能读取到最新的吗?快照读和当前读的区别?
- synchronized和reentrentlock哪个效率高?
二面
23. 算法:实现一个缓存队列 ,二叉树的镜像
24. 进程和线程的区别?内存管理说一下你的了解。进程调度算法。
25. 为啥B+树最后叶子节点需要用链表相连接? 便于区间查找
26. TCP状态转换图,画一下。
27. 操作系统I/O模型了解吗?epoll模型了解吗?
28. CopyOnWriteArrayList的相关特性?
29. ArrayList遍历的时候能删除元素吗? 删除的时候会报什么异常?
三面
30. 算法题: (1)树的节点最大距离(2)区间覆盖 例 [1 3] [2 5] [3 6]能否覆盖[2 6]
31. Linux相关命令。
32. 手写SQL,join
百度
信息中心
一面
算法:字符串反转 、 倒着打印链表(为什么用递归比用栈差?) 、 单例模式
线程start 、 run方法区别
可以不通过构造函数创建对象吗? object.clone() 反序列化
volatile关键字
Spring AOP原理(cglib 和 JDK的动态***实现有什么区别?)
重写equals方法,为什么一定要重写hashcode方法?
字符串 == 比较。输出true还是false;
看了七八个程序,然后问输出什么?
HashMap 能不能存储 null 能,放在第一个格子里?concurrentHashMap 能不能存储 null?
分布式系统设计:现在有一个方法,可以给10台服务器调用,如何统计一天内10台电脑调用的次数和?
分布式锁的设计:每天早上8:00输出前一天的业务报表发到老板邮箱。如果现在有10台服务器,如果设计这个定时任务?
法1:分布式锁。法2:通过外部发来一个http请求,传给ngnix,通过ngnix自动进行分配到某一台服务器上。
二面
你对哪方面知识比较自信?
HashMap初始容量多少?(16)为啥要设计初始为16?如果传入容量10会怎么样?(还是会构建16容量的);
知道什么异常?(说几个)
http的状态码说几个。403是什么状态?
String有什么方法?
list,set集合在iterator输出的时候能删去值吗?
SimpleDateFormat是线程安全的吗?
手写左连接。
聚合函数有哪些?
三面
算法题:数组A和数组B,求 A并B - A交B;(说了几种,好像不满意不是最优解)
算法题:矩阵搜索(说完之后问优化,没想到,提示二分搜索);
SSM的运作流程,说说你做的项目难点。
GET POST请求,url里面的参数
说说索引,如果对每一列都建索引有什么不好?
白盒测试、黑盒测试
Linux会吗?
凤巢
一面
算法题:手写堆排序
Spring IOC原理 AOP原理,如何利用AOP实现日志,写过吗?
Spring bean创建的方法 注解 @Service xml配置 @bean
Java反射原理?
SpringBoot 里面 @bean 解释一下
Java内存模型和运行时数据区
Spring 中事务@Tranctional,出现异常回滚是怎么实现的
数据库MVCC原理
乐观锁和悲观锁概念
悲观锁的实际例子。 select * from table for update …
乐观锁实际上有没有加锁?
用两个线程去操作数据库,乐观锁具体是什么实现的?演示一遍,画一画
数据库常用存储引擎,区别,锁范围。
写过单纯的非web项目的 Spring工程, 用main实现的吗?例子。
SSM 三层技术架构的总体流程
@component @service @controller 三个区别
mybatis中 # 和 $ 的区别?哪个会出现SQL注入?
JVM 新生代,老年代。survival是不是在任意时刻都只有一块有对象?
JVM 垃圾收集器了解哪些?
二面
算法题: 实现一个四则运算计算器(两个栈 + 优先级) , 冒泡排序
输入一个网站的全过程。从计算机网络到服务器内部技术实现流程。
日常怎么学习。
阿里
各部门简历面
- volatile的底层如何实现,怎么就能保住可见性了?
- 三个线程如何实现交替打印ABC
- 线程池有哪些创建方式和安全性问题
- 有哪些线程池的类型
- 线程池中LinkedBlockingQueue满了的话,线程会怎么样
- 线程池的底层原理和实现方法
- 线程之间的交互方式有哪些?有没有线程交互的封装类 (join)
- 算法:堆排序、栈实现队列、反转链表
- Java锁机制,都说一下~
- 除了@ResponseBody,controller层如何标准返回给前端所要的数据类型?你会怎么实现?
- 异常捕获处理
- Spring MVC的原理和流程
- HashMap和ConcurrentHashMap哪个效率更高?为什么?
- Redis的缓存淘汰策略有哪些?
- Java内存模型说一下
- mybatis如何进行类型转换
- mybatis的xml有什么标签
- MySQL锁机制
- 如何修改linux的文件权限
- jvm的回收算法
- 你会怎么设计数据库表结构
- 数据库有哪些索引?
- 如何防止sql注入
- 抽象类和接口有什么不同
- myql间歇锁的实现原理
- future的底层实现异步原理
- SpringBoot Starter原理
- rpc原理
- 多个服务端上下线怎么感知
- 缓存和数据一致性,怎么处理。流式计算
- 多线程讲一下,FutureTask
- Java和mysql的锁介绍,乐观锁和悲观锁
- 分布式一致性讲一讲
- 分布式锁的实现方式,zk实现和redis实现哪个比较好
- 多点登陆怎么实现
- 把乐观锁加在数据库上面,怎么实现
- 项目介绍
- 降级处理hystrix了解过么
- 两次点击,怎么防止重复下订单
- ioc原理详细讲讲,源码看过么
- 静态***和动态***的区别
- JUC说说你知道的东西
- B+树的叶子节点
菜鸟
一面
- Java内存模型
- full gc怎么触发
- gc算法
- 高吞吐量的话用哪种gc算法
- ConcurrentHashMap和HashMap
- JDK8的stream的操作
- volatile原理
- 有参与过开源的项目
- 项目介绍
- 线程池原理,拒绝策略,核心线程数
- 1亿个手机号码,判断重复
- 是否有写过小工具
- 单元测试介绍一下,多模块依赖怎么单元测试。Mockito
二面
- 项目介绍
- dubbo、netty介绍原理
- 限流算法
- zk挂了怎么办
- 秒杀场景设计,应付突然的爆发流量
- redis的热点key问题
- redis的更新策略(先操作数据库还是先操作缓存)
- 分布式数据一致性
- 一致性哈希
- 消息队列原理介绍(不太会)
- full gc问题,怎么排查
- jvm的回收策略
- ClassLoader原理和应用
- 注解的原理
- 数据库原理,数据库中间件,索引优化
- aop原理和应用
- 大数据相关,MapReduce
- 机器学习有了解么?
- Java的新技术,以及技术最新进展
- Docker的原理
三面
1、全程项目
2、讨论了一下数据库表设计
四面
1、项目介绍
2、分布式事务
3、Java三大特性
4、数据库表设计
5、RPC原理
6、netty原理
7、降级策略和降级框架
腾讯
一面(电话)(50分钟)
- 算法题:六七道,都是剑指offer难度
- 半小时项目介绍 & 问答
- 分布式相关:rpc原理、微服务架构
- 海量数据问题:套路题
- 计网:传输层、网络层(必须要非常熟,ping的原理,tcp的三次握手、四次挥手、拥塞控制。UDP的不可靠、一对一、一对多)
- 操作系统:虚拟内存、段式、页式、进程调度算法
- 数据一致性: 分布式数据一致性、缓存数据一致性
- Java相关:线程池、HashMap、CopyOnWriteArrayList
- Redis相关:复制原理、持久化原理
- 杂谈:最近看什么书,实习地点。
二面(牛客视频)(85分钟)
- 算法题:最长不重复字串
- 半小时钟项目介绍 & 问答
- 操作系统:Linux的namespace(不会)、进程线程、线程通信方式、进程通信方式
- 计算机网络:传输层和网络层,因为我项目做了链路层,也讲了一下。
- Java相关: 线程池
- 数据库相关: 一条连表查询语句。数据库索引原理
- 海量数据问题: 套路题
- 杂谈:介绍了部门业务
三面(电话) (20分钟)
- 应该是大老板面试了,问的都很哲学:技术背景、学习方法、项目介绍
- 问了一些简单技术问题。主要考察逻辑表达和整体的素质。
- 杂谈:介绍了部门业务
hr(电话)(15分钟)
- 家庭情况
- 面腾讯原因,还有面其他公司么
- 兴趣爱好
- 业务介绍
- 口头offer