一、尚硅谷面试题系列
1.考察自增变量,示例:
public static void main(String[] args) {
int i = 1;
i = i++;
int j = i++;
int k = i + ++i * i++;
System.out.println(i);
System.out.println(j);
System.out.println(k);
}
考察虚拟机栈中的栈帧,栈帧包括局部变量表,操作数栈,动态链接,方法返回地址,附加信息;
参考连接:https://zhuanlan.zhihu.com/p/45354152
https://blog.csdn.net/qq_38467473/article/details/103899955
2.单例模式设计
有饿汉式和懒汉式,方法加锁和代码块加锁,双重校验锁,静态内部类,枚举类的方式
3.类初始化和实例初始化
考察点:
- main方法所在类需要先加载和初始化; 一个子类初始化前先父类初始化;
- 一个类初始化就是执行方法,方法由静态类变量显示赋值代码和静态代码块组成,从上而下执行
- 方法只执行一次;
- 实例初始化就是执行方法,方法由静态实例变量显示赋值代码和非静态代码块,对应构造器代码块组成,从上而下执行;
- 方法可能重载多个,有几个构造器就有几个方法;
- 方法首行是super(),对应父类的方法;
- 方法重写和方法的多态性;
4.方法参数传递机制
考察点:基本数据类型传递数值,而引用数据类型传递地址值
5.递归和循环迭代
6.成员变量和局部变量
7.Spring中的bean的作用域
singleton,prototype,request,session,global session
8.Spring中支持的数据库事务传播属性和隔离级别
设置propagation:用来设置事务的传播行为,默认是Propagation.REQUIRED, isolation:用来设置事务的隔离级别,默认是可重复读
9.SpringMvc中如何解决POST请求乱码问题,GET请求又如何解决
POST请求乱码在web.xml文件中设置charaterfilterencoding的值为utf-8,GET请求在tomcat的connect标签的uriencoding属性设置为utf-8
10.SpringMvc的工作流程
参考链接:https://www.cnblogs.com/hamawep789/p/10840774.html
11.Mybatis中实体类属性和表中字段不一致
- 设置别名;
- 设置驼峰命名;
- 设置结果集和实体类之间的映射;
12.Linux常用的服务操作命令
centos6下使用service 服务名 【操作】,使用chkconfig命令设置自启动,查看服务的方法/etc/init.d/服务名
centos7下使用systemctl 【操作】服务名, 使用systemctl enable service_name设置自启动,使用systemctl --type service 查看服务命令
13.git分支相关命令
14.Redis持久化
Rdb生成文件快照的方式,全量备份;Aof是以日志的形式来记录每个写操作,只许追加文件
15.Mysql什么时候适合建索引,什么时候不适合建索引
16.JVM垃圾回收机制中,GC发生在JVM哪个部分,有几种GC,它们的算法是什么
GC发生在JVM的堆中,有两种GC,一种是minor GC,另外一种是full GC,回收算法是标记-清除,复制算法,标记-整理,分代回收算法
17.Redis在项目中使用场景
常用五种数据类型的使用场景
参考链接:https://www.cnblogs.com/wangcuican/p/12174758.html
18.volatile的理解
保证可见性,和禁止指令重排,但是不保证原子性,这里为了解决原子性可以依靠synchronized,或者使用AutomicInteger的原子类来实现,而volatile的实际应用场景,单例模式的dcl
19.cas的理解
unsafe.compareAndSwapInt(this, valueOffset, expect, update),在上面的AutomicInteger的自增和自减就是依靠cas来完成的,但是cas会产生aba问题,可以依靠版本号(AtomicStampedReference)来解决aba问题
20.集合list(ArrayList)线程不安全类
快速失败类(并发修改异常),这里要使用迭代器的remove方法进行删除,线程安全类Vector,Collections.synchronizedList,CopyOnWriteArrayList,COW写时复制机制
21.集合set(HashSet)线程不安全类
HashSet底层依靠HashMap来实现,map的key存放值,value是一个空对象 -》 map.put(e, new Object())
22.集合map (HashMap)线程不安全类
参考链接:https://mp.weixin.qq.com/s/VtIpj-uuxFj5Bf6TmTJMTw
23.锁的公平锁和非公平锁
公平锁是按申请锁的顺序来获取锁,而非公平锁并不是按申请锁的顺序来获取,会出现插队现象
24.锁的可重入锁(又名递归锁)
在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁
25.锁的自旋锁
采用循环方式去尝试获取锁,这样好处是减少线程上下文切换,但是会很消耗cpu
26.锁的读写锁ReentrantReadWriteLock
读是共享,写时互斥
27.JUC包下CountDownLatch,CyclicBarrier,Semaphore
CountDownLatch倒序计数器,CyclicBarrier正序计数器,Semaphore信号量,模拟资源类
28.阻塞队列
29.线程通信之生产者和消费者
使用一个flag标志位和lock创建多个condition,来实现相互通知(判断-操作-通知),注意判断使用while,这是为了解决唤醒之后再做一次判断
30.Synchronized和Lock的区别
31.创建线程的方式
32.线程池的几种创建方式
使用Executors(缺点),使用ThreadPoolExecutor(7大参数,工作流程)
33.死锁编码及原因分析
两个及两个以上线程互相持有对方的锁,造成相互等待现象;通过jps定位有问题代码的pid,然后再通过jstack查看对应pid进程的堆栈信息
参考链接:https://blog.csdn.net/qq_38071004/article/details/81004765
34.JVM调优和参数配置
参考链接:https://blog.csdn.net/zhangcongyi420/article/details/89060802
35.工作中常用jvm参数调优
36.对oom的认识
37.假如生产环境出现CPU占用过高,请谈谈你的分析思路和定位
参考链接:https://blog.csdn.net/gg4236131/article/details/120100385
38.java 字符串常量池
intern() 方法, 而“java”字符串会返回false,因为jvm中已经加载过了这个字符串常量了
参考链接:https://blog.csdn.net/oneby1314/article/details/113789304
39.求两个数之和-算法题
参考链接:https://blog.csdn.net/oneby1314/article/details/113789304
40.可重入锁synchronized,ReentrantLock,synchronized底层原理?
参考链接:https://blog.csdn.net/oneby1314/article/details/113789332
41.LockSupport 是什么?
参考链接:https://blog.csdn.net/oneby1314/article/details/113789332
42.AQS的理解
43.AOP常用注解
参考链接:https://blog.csdn.net/oneby1314/article/details/113789384
44.spring中的循环依赖
参考链接:https://www.cnblogs.com/liuqing576598117/p/11227007.html
45.redis分布式锁
46.redis内存淘汰策略,手写lru算法
参考链接:https://blog.csdn.net/oneby1314/article/details/113789412