2019年Java工程师面试复盘

公司一(数据通信项目组)

一面

  1. synchronized修饰方法和代码块有什么区别?
  2. CAS单点登录的原理?
  3. CAS锁有了解吗?
    即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数:
  • 需要读写的内存值 V
  • 进行比较的值 A
  • 拟写入的新值 B
    当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操作,即不断的重试
  1. 并发锁有了解吗?
  2. 手写一个单例模式
  3. 单向链表了解吗?如何判断两个无环单向链表是否相交?
  • 方法1:先循环链表1,将每个节点的地址进行hash计算存入哈希表,然后计算链表2的每个节点的地址的hash值,若与hash表中对应位置有值,则相交,否则不相交。
  • 方法2:见链表1与2进行首尾相连,判断新链表是否有环,若没有,则不相交,若有环,则是相交的。
  • 方法3:先计算两个链表的长度L1、L2,若L1 > L2,则先将链表1移动(L1 - L2)个节点,等到链表1和链表2剩下的长度一样的时候,一起向后移动,依次判断当前链表的节点是否相等,若相等,则相交,若到队尾还没有相等的,则不相交
  1. 谈一谈MySQL的数据库引擎
  2. 索引的数据结构说一说
  3. MySQL的redo log知道吗?
    innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。
    undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志:
  • redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
  • undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。
  1. JVM内存分配是怎样的?
  2. JVM方法区内存溢出怎么办?
    JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1.7 就已经开始了),取而代之是元空间,元空间使用的是直接内存。整个永久代有一个 JVM 本身设置固定大小上限,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,并且永远不会得到 java.lang.OutOfMemoryError。
  3. JVM哪个区不会内存溢出?
  4. 谈一谈GC算法?
  5. Redis在项目中的使用?
  6. Redis如何保证高可用?
  7. Redis雪崩怎么解决?比如新浪微博这种百万并发请求直接打在Redis上,如何避免缓存雪崩?
  8. 消息中间件在项目中怎么使用的?
  9. 如何保证消息不被重复消费?
  10. 消息丢失怎么解决?

二面(考察手写代码)

  1. 手写条件查询SQL

  2. 手写更新SQL

  3. 手写外连接SQL

  4. 手写上传下载

  5. 手写用字符流实现文本文件复制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public 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();
    }
  1. 手写synchronized实现多线程加锁

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class MyThread extends Thread {
    static int ticket = 100;//共享数据
    @Override
    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--;
    }
    }
    }
    }
    }

公司一(游戏云服务器开发项目组)

一面

  1. Java 中如何实现有符号无符号位移
  2. Kafka 谈一谈
  3. 为什么要使用 Redis
  4. 谈谈你印象最深的项目,或者获得成长最大的项目,从项目中学到了什么
  5. Spring 框架简要谈一谈
  6. Spring MVC 和 Structs2 区别? Herbinate 和 Mybatis 的区别?

公司二(大数据、ETL数据仓库项目组)

一面

  1. HashMap有了解吗
  2. 对Spring的理解
  3. SpringMVC的执行流程
  4. MQ消息积压怎么办
  5. MQ消息被重复消费怎么办
  6. AngularJS路由怎么使用
  • 导入路由文件:angular-route.js
  • 在主模块中注入ngRoute
  • 将超链接改写为路由格式。 #/标记
  • 在页面的合适位置,添加ng-view,用于承载路由打开的页面
  • 在config配置阶段,注入$routeProvider,进行路由配置
  1. AngularJS统一给url加前缀或后缀怎么做
  2. 接口开发时如何避免url被攻击
  • 验证码(最简单有效的防护),采用点触验证,滑动验证或第三方验证码服务,普通验证码很容易被破解
  • 频率,限制同设备,同IP等发送次数,单点时间范围可请求时长
  • 归属地,检测IP所在地是否与手机号归属地匹配;IP所在地是否是为常在地
  • 可疑用户,对于可疑用户要求其主动发短信(或其他主动行为)来验证身份
  • token,对于重要的API接口,生成token值,做验证
  1. Linux常用命令有哪些,怎么查看进程?怎么定位错误?

二面

  1. 简单介绍一下项目和模块,你做了什么
  2. fastDFS分布式文件系统详细说一说
  3. Redis雪崩和穿透解决方案
  4. 消息中间件丢消息怎么解决

公司三(自研智能门锁,政府管理系统,交通大数据)

一面

  1. Arraylist谈一谈
  2. HashMap谈一谈
  3. MySQL如何进行SQL优化
  4. 你在项目中做了哪些模块
  5. redis主从哨兵怎么搭
    面试官人很nice,不会的地方会给予一些提示,你讲完他会做一些补充,项目介绍非常详细。整个过程氛围轻松。

公司四

一面

  1. 项目中负责的模块详细介绍一下
  2. Redis是怎么用的,kv分别存什么字段?
  3. 项目中消息中间件用的是哪个,怎么用的?
  4. 为什么要使用消息中间件?
  5. 如何避免消息丢失?

二面

  1. String,StringBuffer和StringBuilder的区别?

  2. Arraylist 和 HashMap 哪个是线程安全的?

  3. List,Set,Map都实现了 Collection 接口,是吧?

  4. HashMap的key和value能不能为空?

  5. Spring IoC和AOP说一下?

  6. Spring事务的传播行为,一般在项目中用过哪些?

  7. Spring中怎么自动执行类中的方法?

  8. MySQL分库分表有了解吗?怎么用的?

分表:把一个表的数据放到多个表中,然后查询的时候只查一个表。单表数据量太大,会极大影响 sql 执行的性能。一般来说,单表到几百万的时候,查询性能大幅降低,这时就需要分表了。

分库:把一个库的数据拆分到多个库中,访问的时候只访问一个库。MySQL中一个库一般最多支持 2000 左右的并发量,一个健康的单库最好保持在每秒 1000 左右的并发值。

常见的分库分表中间件:Cobar,TDDL,Atlas,Sharding-jdbc,Mycat。

  1. JVM堆内存的结构?

  2. 有哪些GC算法?

  3. 在项目中用过哪些设计模式?

  4. 你了解哪些常见的加密算法?

散列算法

名称 安全性 速度
SHA-1
MD5

对称加密算法:加密与解密 密钥相同

名称 密钥名称 运行速度 安全性 资源消耗
DES 56位 较快
3DES 112位或168位
AES(推荐) 128、192、256位

非对称加密算法:加密密钥与解密 密钥不同

名称 成熟度 安全性 运算速度 资源消耗
RSA
ECC
  1. 项目中是否用到多线程?
  2. Redis主从和哨兵原理和工作机制讲一讲
0%