1.基础及遇到概率较高的知识点
1)集合以及其特点,延伸到其实现原理,比如HashMap(CurrentHashMap)的实现原理
2)SQL的熟练度考察,一般是参考表连接查询(left join,right join, join),子查询,还有就是一些函数,比如MAX,TOP等
3)多线程的创建形式,线程池的使用,延伸到线程不安全所要使用的策略,比如锁
4)Linux的常用命令,笔试或者技术面试有被问到,比如cp,cat,more,ps, which,find等
5)网络应用程序框架netty方面,面得比较少,遇到的话难度系数有点大
6)Java特性,比如Java8的Stream操作
7)手写代码,这块遇到的不是很多,就是遇到把关键点写出来就行
2.关于底层源码
1)Spring源码系列,AOP,IOC必问,延伸到让你实现AOP,然后如何去实现一个Spring
2)Spring MVC的从浏览器发送请求到页面渲染的原理
3)Spring Boot的启动流程,涉及哪些重要节点和类
4)Mybatis中SQL的执行过程,一二级缓存的作用
5)Spring Cloud系列里的Ribbon/Feign组件实现原理
6)Nacos/Apollo(携程) 配置文件热部署原理
7)ZK的源码,包含选举算法,监听机制
8)MQ源码,生产者和消费者以及路由,发布订阅
9)Redis缓存穿透,雪崩,以及其为什么快的原因
3.关于项目经验
截止面试前,我做的系统有城市轨道交通清分清算系统、SAAS平台、贷款平台以及支付平台等。所以面试官一般在问了技术以后,会针对他感兴趣的项目对我进行提问,大致是以下几个方向:
1)团队的分工,前后端配比
2)负责的模块,使用的技术框架
3)遇到了哪些问题,针对问题是怎么解决的
4)做完项目有哪些收获
5)某个模块的设计思想,为什么这么做,除了这样做有没有更好的实现方式等
面向对象面试题
public class Test {
public static void main(String[] args) {
Student s1 = new Student("小张");
Student s2 = new Student("小李");
Test.swap(s1, s2);
System.out.println("s1:" + s1.getName());
System.out.println("s2:" + s2.getName());
}
public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp;
System.out.println("x:" + x.getName());
System.out.println("y:" + y.getName());
}
}
常用api
String str=”i”与 String str=new String(“i”)一样吗?
- 不一样,因为内存的分配方式不一样。String str=”i”的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的
可变性
- String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。
线程安全性
- String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
性能
- 每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
对于三者使用的总结
- 如果要操作少量的数据用 = String
- 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
- 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
Integer a= 127 与 Integer b = 127相等吗
- 对于对象引用类型:==比较的是对象的内存地址。
- 对于基本数据类型:==比较的是值。
如果整型字面量的值在-128到127之间,那么自动装箱时不会new新的Integer对象,而是直接引用常量池中的Integer对象,超过范围 a1==b1的结果是false