总结
[toc]
基础题
语言
- 谈谈你对java语言的理解;
- 是否接触过其他开发语言,谈谈Java语言与其他语言的优缺点或区别;
特性
- 阐述下你对Java语言的三大特性的理解;
- 结合项目,说说你对三大特性的使用和理解;
- 如何看待Java中三大特性的滥用,或者时极简代码与冗余代码区别,更倾向于哪一种;
- 如果让你设计一个功能模块,你会从哪些方面考虑;
- 类是否可以多继承或多实现;
- 接口类与抽象类之间的区别;
设计模式
- Java常用的设计模式;
- 项目中用到的设计模式;
- Spring框架中用到的设计模式,列举几个;
类型
- Java中的基础类型;
- 谈谈对String的理解;
- 如果让你重新去定义一个String类,讲讲实现方式;
- 变量的创建几种方式:
- 基本类型比较,'==' 与 'equals'区别;
- 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
}
序列化
- 谈谈你对序列化的理解;
- 谈谈在项目哪些场景中使用到了序列化;
- 类实现序列化时会有一个serialVersionUID,谈谈它的作用;
多线程
- 谈谈对Java多线程的理解;
- 谈谈你项目中使用的多线程;
- 如何保证线程安全;
- 简述下ThreadLocal;
- 服务中的Bean实例是单线程还是多线程;
- Redis底层实现是单线程还是多线程;
- 谈谈对线程池的理解;
排序
- 简述几种排序算法和对应的复杂度;
- 冒泡排序;
- 快速排序,什么情况下达到最大复杂度;
- 堆排序;
- 插入排序;
集合
- ArrayLIst 和 LInkList区别;
- ArrayList 和 LinkList的实现原理;
- ArrayList 和 LInkList是否是线程安全;
- ArrayList 和 LinkList的最优使用场景;
- 是否了解过jdk源码,简述下Map的几种实现类;
- 说说对HashMap的理解;
- HashMap底层的存储结构;
- HashTable和HashMap之间的区别;
- HashTable和HashMap中是否线程安全;
JVM
- 对象的创建是在堆还是栈里面;
- 简述下GC流程;
- 简述下新生代和老生代;
- 新生代中各个区的作用;
- 方法在栈中的调用流程;
进阶题
框架
- 谈谈对SpringMVC的理解;
- SpringBoot与SpringMVC之间的区别;
- 谈谈对SpringBoot的理解(优缺点);
- 谈谈你对Dubbo框架的了解;
- Rpc调用与Http调用之间的区别;
- Dubbo服务基于什么协议调用;
- Dubbo服务的调用方式;
- zookeeper作用;
- zookeepper挂了,dubbo服务之间是否能正常调用;
- 在项目开发过程中是否对dubbo进行过扩展开发;
- 简述下Spring中的AOP和IOC;
- 是否了解SpringCloud;
- zookeeper实现分布式锁原理;
Redis
- redis中存储数据类型有哪些;
- 讲述下redis中zSet排序的实现原理;
- 如何用redis实现分布式锁;
- 用redis做分布式锁时,会有什么问题,如何解决;
- redis中数据的存储结构;
- redis底层是单线程还是多线程;
- redis的性能瓶颈在哪;
- 简述下I/O多路复用原理;
- 简述下一致性Hash或hash环;
- 针对缓存穿透、缓存雪崩和缓存击穿场景,怎么避免;
MySQL
- MySQL的存储引擎(InnoDB和MyISAM);
- MySQL的存储引擎之间有什么区别;
- MySQL左右连接与内连接之间的区别;
- MySQL左右连接查询有什么问题;
- MySQL的存储过程;
- MySQL的存储结构,B+树实现原理,有什么优点;
ElasticSearch
- ES中的倒排索引原理;
分布式
- 常用的分布式锁;
协议
- 说说TCP传输的三次握手四次挥手策略;
- http请求,说下其中的步骤;
- 为什么说Http请求是无状态的;
客观题
智商题
- 一根绳子对折三次剪开后,有几跟绳子?
- 井盖为什么是圆的?
思维题
- 看图说话,给一张桌子,桌腿长短不一,谈谈自己的理解?
- 给定一个假设,如果让你去统计这个城市的下水道井盖数量,你会采用哪些方法?
- 一个岛上有三只白羊,五只黑羊,七只棕羊,不同颜色之间两两对视则会变成同一种颜色,那岛上的羊是否会变成同一种颜色?
主观题
算法
- 给定一个字符串,校验该字符串是否是回文(写出你认为最快的方法)?
1. 输入 aba, abba,aaaaa等,则返回true;
2. 输入 abc,abac则返回false;
- 给定一个随机字符,找出字符串中最长的回文?
/**
* 输入一个字符串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";
}
- 手机号码合法性验证;
/**
* 新增手机号码,输出手机号码是否注册成功,或注册失败的原因.
*/
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";
}
- 给一个字符串,输出所有字符串字符不重复组合;
字符串字符不重复组合, 比如: 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
}
- 已知一个有序数组[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
}
项目经验
- 讲述下你在项目中印象最深刻的工作;
- 讲述下你在项目中有什么记忆深刻的问题;
- 如果现在给你一个新的服务,你会如何去设计和开发;
工作
- 为什么从上一家公司离职;
- 为什么选择我们公司;
- 未来三到五年的职业规划;