公司一(数据通信项目组)
一面
- synchronized修饰方法和代码块有什么区别?
- CAS单点登录的原理?
- CAS锁有了解吗?
即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数:
- 需要读写的内存值 V
- 进行比较的值 A
- 拟写入的新值 B
当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操作,即不断的重试。
- 并发锁有了解吗?
- 手写一个单例模式
- 单向链表了解吗?如何判断两个无环单向链表是否相交?
- 方法1:先循环链表1,将每个节点的地址进行hash计算存入哈希表,然后计算链表2的每个节点的地址的hash值,若与hash表中对应位置有值,则相交,否则不相交。
- 方法2:见链表1与2进行首尾相连,判断新链表是否有环,若没有,则不相交,若有环,则是相交的。
- 方法3:先计算两个链表的长度L1、L2,若L1 > L2,则先将链表1移动(L1 - L2)个节点,等到链表1和链表2剩下的长度一样的时候,一起向后移动,依次判断当前链表的节点是否相等,若相等,则相交,若到队尾还没有相等的,则不相交
- 谈一谈MySQL的数据库引擎
- 索引的数据结构说一说
- MySQL的redo log知道吗?
innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。
undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志:
- redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
- undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。
- JVM内存分配是怎样的?
- JVM方法区内存溢出怎么办?
JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1.7 就已经开始了),取而代之是元空间,元空间使用的是直接内存。整个永久代有一个 JVM 本身设置固定大小上限,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,并且永远不会得到 java.lang.OutOfMemoryError。 - JVM哪个区不会内存溢出?
- 谈一谈GC算法?
- Redis在项目中的使用?
- Redis如何保证高可用?
- Redis雪崩怎么解决?比如新浪微博这种百万并发请求直接打在Redis上,如何避免缓存雪崩?
- 消息中间件在项目中怎么使用的?
- 如何保证消息不被重复消费?
- 消息丢失怎么解决?
二面(考察手写代码)
手写条件查询SQL
手写更新SQL
手写外连接SQL
手写上传下载
手写用字符流实现文本文件复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14public void copy(String f1,String f2) throws Exception{
FileReader fr = new FileReader(f1);
FileWriter fw =new FileWriter(f2,false);
char [] chars = new char[1024];
int len =fr.read(chars);
while(len!=-1){
fw.write(chars, 0, len);
fw.flush();
len =fr.read(chars);
}
fr.close();
fw.close();
}
手写synchronized实现多线程加锁
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public class MyThread extends Thread {
static int ticket = 100;//共享数据
public void run() {
while(true){
synchronized (MyThread.class){
if(ticket == 0){
break;
}else{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "---" + ticket);
ticket--;
}
}
}
}
}
公司一(游戏云服务器开发项目组)
一面
- Java 中如何实现有符号无符号位移
- Kafka 谈一谈
- 为什么要使用 Redis
- 谈谈你印象最深的项目,或者获得成长最大的项目,从项目中学到了什么
- Spring 框架简要谈一谈
- Spring MVC 和 Structs2 区别? Herbinate 和 Mybatis 的区别?
公司二(大数据、ETL数据仓库项目组)
一面
- HashMap有了解吗
- 对Spring的理解
- SpringMVC的执行流程
- MQ消息积压怎么办
- MQ消息被重复消费怎么办
- AngularJS路由怎么使用
- 导入路由文件:
angular-route.js
- 在主模块中注入
ngRoute
- 将超链接改写为路由格式。
#/标记
- 在页面的合适位置,添加ng-view,用于承载路由打开的页面
- 在config配置阶段,注入
$routeProvider
,进行路由配置
- AngularJS统一给url加前缀或后缀怎么做
- 接口开发时如何避免url被攻击
- 验证码(最简单有效的防护),采用点触验证,滑动验证或第三方验证码服务,普通验证码很容易被破解
- 频率,限制同设备,同IP等发送次数,单点时间范围可请求时长
- 归属地,检测IP所在地是否与手机号归属地匹配;IP所在地是否是为常在地
- 可疑用户,对于可疑用户要求其主动发短信(或其他主动行为)来验证身份
- token,对于重要的API接口,生成token值,做验证
- Linux常用命令有哪些,怎么查看进程?怎么定位错误?
二面
- 简单介绍一下项目和模块,你做了什么
- fastDFS分布式文件系统详细说一说
- Redis雪崩和穿透解决方案
- 消息中间件丢消息怎么解决
公司三(自研智能门锁,政府管理系统,交通大数据)
一面
- Arraylist谈一谈
- HashMap谈一谈
- MySQL如何进行SQL优化
- 你在项目中做了哪些模块
- redis主从哨兵怎么搭
面试官人很nice,不会的地方会给予一些提示,你讲完他会做一些补充,项目介绍非常详细。整个过程氛围轻松。
公司四
一面
- 项目中负责的模块详细介绍一下
- Redis是怎么用的,kv分别存什么字段?
- 项目中消息中间件用的是哪个,怎么用的?
- 为什么要使用消息中间件?
- 如何避免消息丢失?
二面
String,StringBuffer和StringBuilder的区别?
Arraylist 和 HashMap 哪个是线程安全的?
List,Set,Map都实现了 Collection 接口,是吧?
HashMap的key和value能不能为空?
Spring IoC和AOP说一下?
Spring事务的传播行为,一般在项目中用过哪些?
Spring中怎么自动执行类中的方法?
MySQL分库分表有了解吗?怎么用的?
分表:把一个表的数据放到多个表中,然后查询的时候只查一个表。单表数据量太大,会极大影响 sql 执行的性能。一般来说,单表到几百万的时候,查询性能大幅降低,这时就需要分表了。
分库:把一个库的数据拆分到多个库中,访问的时候只访问一个库。MySQL中一个库一般最多支持 2000 左右的并发量,一个健康的单库最好保持在每秒 1000 左右的并发值。
常见的分库分表中间件:Cobar,TDDL,Atlas,Sharding-jdbc,Mycat。
JVM堆内存的结构?
有哪些GC算法?
在项目中用过哪些设计模式?
你了解哪些常见的加密算法?
散列算法
名称 | 安全性 | 速度 |
---|---|---|
SHA-1 | 高 | 慢 |
MD5 | 中 | 快 |
对称加密算法:加密与解密 密钥相同
名称 | 密钥名称 | 运行速度 | 安全性 | 资源消耗 |
---|---|---|---|---|
DES | 56位 | 较快 | 低 | 中 |
3DES | 112位或168位 | 慢 | 中 | 高 |
AES(推荐) | 128、192、256位 | 快 | 高 | 低 |
非对称加密算法:加密密钥与解密 密钥不同
名称 | 成熟度 | 安全性 | 运算速度 | 资源消耗 |
---|---|---|---|---|
RSA | 高 | 高 | 中 | 中 |
ECC | 高 | 高 | 慢 | 高 |
- 项目中是否用到多线程?
- Redis主从和哨兵原理和工作机制讲一讲