介绍
网上完整的少(都是一面二面) 我就挑一些吧
1、 synchronized和lock的区别
synchronized是java中的一个关键字,也就是说是java内置的一个特性;Lock是一个java接口,通过这个接口可以实现同步,使用Lock时,用户必须手动进行锁的释放,否则容易出现死锁。ReentranLock是Lock的唯一实现类,它扩展了锁的功能,分为公平锁和非公平锁,本人文章:Java多线程相关
2、 spring bean加载
bean的生命周期:
1.bean对象的实例化
2.封装属性,也就是设置properties中的属性值
3.如果bean实现了BeanNameAware,则执行setBeanName方法,也就是bean中的id值
4.如果实现BeanFactoryAware或者ApplicationContextAware ,需要设置setBeanFactory或者上下文对象setApplicationContext
5.如果存在类实现BeanPostProcessor后处理bean,执行postProcessBeforeInitialization,可以在初始化之前执行一些方法
6.如果bean实现了InitializingBean,则执行afterPropertiesSet,执行属性设置之后的操作
7.调用执行指定的初始化方法
8.如果存在类实现BeanPostProcessor则执行postProcessAfterInitialization,执行初始化之后的操作
9.执行自身的业务方法
10.如果bean实现了DisposableBean,则执行spring的的销毁方法
11.调用执行自定义的销毁方法。
3、 介绍一下nio
本人文章,非阻塞式IO介绍
我觉得面试考这个应该只是问下了解不了解
4、 双亲委派机制
5、 两个String类如何区分
每一个类都是由这个类本身和其被加载的类加载器决定
6、 Retrantlock aqs底层
锁是面向使用者的,定义了用户调用的接口,隐藏了实现细节;
AQS是锁的实现者,屏蔽了同步状态管理,线程的排队,等待唤醒的底层操作。
锁是面向使用者,AQS是锁的具体实现者
背后复杂的线程排队,线程阻塞/唤醒,如何保证线程安全,都由AQS为我们完成了
7、 反射的原理
https://blog.csdn.net/weixin_42724467/article/details/84311385 这篇文章写得不错
8.hashmap如何解决散列冲突
链表法和开放寻址法:链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位;开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位
9.hashmap扩容的时候,链表尾部的节点怎么处理的?(hashmap扩容过程)
美团技术团队HashMap 这个写的比较好
10.Spring IOC的原理
11.设计模式
。。
12.行转列。写一个sql,表里有3行数据,如何查询出这些数据并以一行的形式展现出来?比如一个字段,第一行a,第二行b,查询出来是一行结果第一列a,第二列b(不会……)
//case when语句使用
select country, sum(case when type='A' then money end) as A,
sum(case when type='B' then money end) as B,
sum(case when type='C' then money end) as C
from table1
group by country
13.那换一个简单一点的吧,a和b两个表,查出a表有b表没有的数据行。
select * from a where id not in(select id from b)
第一种 使用not in,目测效率比较低
select a.* from a left join b on a.id=b.id where isnull(b.xxx)
左外链接查询
14、数据库的事务隔离知道吗?
mysql数据库四种隔离级别:读未提交,读已提交,可重复读,串行化
15、数据库的索引的数据结构。
B+树,这里估计会问原因是什么,答磁盘IO吞吐量和B+树和B树区别
16、网络输入一个域名会发生什么?
这个本人文章有比较全的:输入一个域名会发生什么
17、滑动窗口是拿来干嘛的,具体是怎样的?
流量控制:: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议
18.try 里面return了finally还会执行吗?执行顺序是?
会执行的,在方法return动作之前,return语句执行之后,若finally中再有return语句,则此方法以finally的return作为最终返回,若finally中无return语句,则此方法以try的return作为最终返回。
19.HashMap底层,多线程操作导致死循环问题
20.如果HashCode一样,equal不一样怎么办
转化为hash冲突问题如何解决:rehash,开放定址,拉链法(hashmap),建立公共溢出区
21.ConcurrentHashMap底层 讲了JDK1.7 和 JDK1.8之后的
老遇到hashmap我都烦了,找时间整理下hashmap的
22.ClassLoader 讲了双亲委派机制,类加载可以用来干啥
类加载器的作用是将.java文件编码成.class文件,通过在方法区生成一个class对象来调用它
23.char int float long double几个字节
char 16位2个字节
byte 8位1个字节
short 16位2个字节
int 32位4个字节
long 64位8个字节
float 32位 4个字节
double 64位8个字节
24.守护线程
守护线程是一种特殊的线程,就和它的名字一样,它是系统的守护者,在后台默默完成一些系统性的服务,比如垃圾回收线程,JIT线程就可以理解为守护线程。
与守护线程相对的是用户线程,用户线程可以认为是系统的工作线程,它会完成这个程序要完成的业务员操作。如果用户线程全部结束,则意味着这个程序无事可做。守护线程要守护的对象已经不存在了,那么整个应用程序就应该结束。因此,当一个Java应用内只有守护线程时,Java虚拟机自然退出。
25.线程 sleep和wait的区别,sleep的时候CPU在干啥
sleep不释放锁,wait释放锁,sleep时会让出CPU时间片
26.Volatile的作用,底层实现
保证可见性,不保证原子性
底层原理:汇编语句 lock
修改volatile变量时会强制将修改后的值刷新的主内存
lock前缀指令其实就相当于一个内存屏障。内存屏障是一组处理指令,用来实现对内存操作的顺序限制。volatile的底层就是通过内存屏障来实现的