JAVA面试之路

总结

[toc]

基础题

语言
  1. 谈谈你对java语言的理解;
  2. 是否接触过其他开发语言,谈谈Java语言与其他语言的优缺点或区别;
特性
  1. 阐述下你对Java语言的三大特性的理解;
  2. 结合项目,说说你对三大特性的使用和理解;
  3. 如何看待Java中三大特性的滥用,或者时极简代码与冗余代码区别,更倾向于哪一种;
  4. 如果让你设计一个功能模块,你会从哪些方面考虑;
  5. 类是否可以多继承或多实现;
  6. 接口类与抽象类之间的区别;
设计模式
  1. Java常用的设计模式;
  2. 项目中用到的设计模式;
  3. Spring框架中用到的设计模式,列举几个;
类型
  1. Java中的基础类型;
  2. 谈谈对String的理解;
  3. 如果让你重新去定义一个String类,讲讲实现方式;
  4. 变量的创建几种方式:
  5. 基本类型比较,'==' 与 'equals'区别;
  6. String、StringBuilder和StringBuffer之间的区别;
/**
 * 整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以f1==f2的结果是true,而f3==f4的结果是false.
 */
@Test
public void compareTest() {
    Integer num1 = 100, num2 = 100, num3 = 150, num4 = 150;
    System.out.println(num1 == num2); // true
    System.out.println(num3 == num4); // false
}
序列化
  1. 谈谈你对序列化的理解;
  2. 谈谈在项目哪些场景中使用到了序列化;
  3. 类实现序列化时会有一个serialVersionUID,谈谈它的作用;
多线程
  1. 谈谈对Java多线程的理解;
  2. 谈谈你项目中使用的多线程;
  3. 如何保证线程安全;
  4. 简述下ThreadLocal;
  5. 服务中的Bean实例是单线程还是多线程;
  6. Redis底层实现是单线程还是多线程;
  7. 谈谈对线程池的理解;
排序
  1. 简述几种排序算法和对应的复杂度;
  2. 冒泡排序;
  3. 快速排序,什么情况下达到最大复杂度;
  4. 堆排序;
  5. 插入排序;
集合
  1. ArrayLIst 和 LInkList区别;
  2. ArrayList 和 LinkList的实现原理;
  3. ArrayList 和 LInkList是否是线程安全;
  4. ArrayList 和 LinkList的最优使用场景;
  5. 是否了解过jdk源码,简述下Map的几种实现类;
  6. 说说对HashMap的理解;
  7. HashMap底层的存储结构;
  8. HashTable和HashMap之间的区别;
  9. HashTable和HashMap中是否线程安全;
JVM
  1. 对象的创建是在堆还是栈里面;
  2. 简述下GC流程;
  3. 简述下新生代和老生代;
  4. 新生代中各个区的作用;
  5. 方法在栈中的调用流程;

进阶题

框架
  1. 谈谈对SpringMVC的理解;
  2. SpringBoot与SpringMVC之间的区别;
  3. 谈谈对SpringBoot的理解(优缺点);
  4. 谈谈你对Dubbo框架的了解;
  5. Rpc调用与Http调用之间的区别;
  6. Dubbo服务基于什么协议调用;
  7. Dubbo服务的调用方式;
  8. zookeeper作用;
  9. zookeepper挂了,dubbo服务之间是否能正常调用;
  10. 在项目开发过程中是否对dubbo进行过扩展开发;
  11. 简述下Spring中的AOP和IOC;
  12. 是否了解SpringCloud;
  13. zookeeper实现分布式锁原理;
Redis
  1. redis中存储数据类型有哪些;
  2. 讲述下redis中zSet排序的实现原理;
  3. 如何用redis实现分布式锁;
  4. 用redis做分布式锁时,会有什么问题,如何解决;
  5. redis中数据的存储结构;
  6. redis底层是单线程还是多线程;
  7. redis的性能瓶颈在哪;
  8. 简述下I/O多路复用原理;
  9. 简述下一致性Hash或hash环;
  10. 针对缓存穿透、缓存雪崩和缓存击穿场景,怎么避免;
MySQL
  1. MySQL的存储引擎(InnoDB和MyISAM);
  2. MySQL的存储引擎之间有什么区别;
  3. MySQL左右连接与内连接之间的区别;
  4. MySQL左右连接查询有什么问题;
  5. MySQL的存储过程;
  6. MySQL的存储结构,B+树实现原理,有什么优点;
ElasticSearch
  1. ES中的倒排索引原理;
分布式
  1. 常用的分布式锁;
协议
  1. 说说TCP传输的三次握手四次挥手策略;
  2. http请求,说下其中的步骤;
  3. 为什么说Http请求是无状态的;

客观题

智商题
  1. 一根绳子对折三次剪开后,有几跟绳子?
  2. 井盖为什么是圆的?
思维题
  1. 看图说话,给一张桌子,桌腿长短不一,谈谈自己的理解?
  2. 给定一个假设,如果让你去统计这个城市的下水道井盖数量,你会采用哪些方法?
  3. 一个岛上有三只白羊,五只黑羊,七只棕羊,不同颜色之间两两对视则会变成同一种颜色,那岛上的羊是否会变成同一种颜色?

主观题

算法
  1. 给定一个字符串,校验该字符串是否是回文(写出你认为最快的方法)?
    1. 输入 aba, abba,aaaaa等,则返回true;
    2. 输入 abc,abac则返回false;
  1. 给定一个随机字符,找出字符串中最长的回文?
  /**
     * 输入一个字符串s,我们可以删除字符串s中的任意字符,让剩下的字符串形成一个对称字符串.
     * 且该字符串为最长对称字符串。如:输入google,则找到最长对称字符串为goog;如输入abcda
     * 则能找到最长对称字符串为aba。若最长对称字符串存在多个,则输出多个相同长度的最长对称字符串。
     */
    public static void main(String[] args) {
        // TODO 输出最长对称字符串:goog
        String input1 = "google";
        
        // TODO 输出最长对称字符串:aba
        String input2 = "abcda";
     
        // TODO 输出2个最长对称字符串:pop/upu
        String input3 = "pop-upu";
    
    }
  1. 手机号码合法性验证;
    /**
     * 新增手机号码,输出手机号码是否注册成功,或注册失败的原因.
     */
    public static void main(String[] args) {
        // TODO 通过此手机号注册成功
        String phoneNum1 = "138 1234 1234";
       
        // TODO 通过本手机号无法注册,提示为非法手机号
        String phoneNum2 = "13812345abc";
    

        // TODO 通过此手机号注册成功
        String phoneNum3 = "13812345678";
      

        // TODO 提示此手机号已经被其他用户注册
        String phoneNum4 = "138 1234 5678";
        

        // TODO 此手机号码为中国大陆非法手机号码
        String phoneNum5 = "98765432101";
       

    }   
  1. 给一个字符串,输出所有字符串字符不重复组合;
字符串字符不重复组合, 比如: abc 组合为 [a, ab, ac, abc, acb, b, ba, bc, bac,bca c, ca, cb, cab, cba].
5. 给定一个数组numArray = new int[]{0, 1, 2, 3, 4, 5,7,9},一个整数 targetNum = 9,是的 numArray[i] +numArray[j] = targetNum成立,则返回对应的数组下标,反之返回null;
public static void main(String[] args) {
        // 随机数组
        int[] numArray = new int[]{0, 1, 2, 3, 4, 5,7,9};
        // 随机变量值
        int targetNum = 13;
        //TODO 当 numArray[i] + numArray[j] = targetNum时,输出 i 和 j

    }
  1. 已知一个有序数组[2, 3, 4, 5, 6, 7, 8, 9]被截断后变成了[6, 7, 8, 9, 2, 3, 4, 5],则当给定一个数 8时。则他所在数组中的下标变成了2,则怎么最快计算出下标索引;
public static int getNumberIndex(int[] array, int num) {
        // TODO 如何num在array存在,则返回对应的下标,否则返回-1
        
        
   }
项目经验
  1. 讲述下你在项目中印象最深刻的工作;
  2. 讲述下你在项目中有什么记忆深刻的问题;
  3. 如果现在给你一个新的服务,你会如何去设计和开发;
工作
  1. 为什么从上一家公司离职;
  2. 为什么选择我们公司;
  3. 未来三到五年的职业规划;

你可能感兴趣的:(JAVA面试之路)