面试笔记-某游戏公司
文章目录
- 面试笔记-某游戏公司
- 数据库逻辑外键和不使用逻辑外键的区别
- mysql的隔离级别,默认的是
- 为什么默认的是**可重复读**
- 为什么公司用的是**读已提交**
- 反射的应用场景
- 拦截器的实现和使用场景
- 深拷贝浅拷贝的区别和使用场景,如何实现
- 多线程sync和voli的区别
- thread和另外两种创建线程的方式有何区别
- int有多少位
- http的各种错误码
- tcp,为什么用tcp不用http,使用场景
- 用线程池遇到的坑
- springboot如何处理异常
- ArrayList的扩容机制,HashMap的扩容机制和扩容因子,初始长度
- map是如何确定位置的
- integer和int区别
- mysql中乐观锁和悲观锁的应用
- java种两个date类型如何确定是同一天
- spring 事务注解的使用,事务的隔离级别,默认是?
数据库逻辑外键和不使用逻辑外键的区别
https://blog.csdn.net/qq_18863573/article/details/83781629
mysql的隔离级别,默认的是
https://www.cnblogs.com/shoshana-kong/p/10516404.html
读未提交,读已提交,可重复读,串行化。默认的是可重复读
为什么默认的是可重复读
历史原因,因为在5.0之前,主从复制是基于binlog实现的,binlog只支持一种格式,也就是statement。
statement记录的是修改SQL语句
row:记录的是每行实际数据的变更
mixed:statement和row模式的混合
那么这个时候可能会出现问题。因为statement是基于sql生成的,所以只会在commit的时候记录sql语句。那么就有可能出现,记录的语句顺序和实际执行的顺序不一致,从而导致从机更新数据的时候数据不一致。
解决这个问题就是1.使用“可重复读RR”,引入间隙锁的概念,锁住部分行;2.将binlog设置为row模式,这个时候就不会有顺序不一致的问题了。
为什么公司用的是读已提交
1.历史原因了解了,使用row就可以解决问题;
2.使用RR可能会导致间隙锁,产生死锁的概率更高;
3.使用RR在索引失效的情况下,会使用表锁锁住整张表,效率很低。
4.RC的并发性更好,使用了一个semi-consistent read功能,锁冲突的时候可以判断是否能重新获取锁,而RR只能傻等。
https://blog.csdn.net/JackCaptain1015/article/details/93568371
反射的应用场景
1.反射实现深拷贝工具类;
2.反射实现日志注解;
3.Aop、Ioc用了反射;
4.优化工厂模式;
(这四个都是面试官不想听的,太简单了,他还想听其他的,但是我无了)
https://blog.csdn.net/jinwufeiyang/article/details/80115119
拦截器的实现和使用场景
// todo 单独写一篇吧,太大了。拦截器,监听器,过滤器的实现和使用场景
深拷贝浅拷贝的区别和使用场景,如何实现
实现就是1.通过反射;2.通过序列化和反序列化。
使用场景:redis出来的就是一个深拷贝。
多线程sync和voli的区别
虚拟机提供的轻量级保证。
不会对读取或是写入时加锁。不是线程安全的。
适合于只有一个线程写,多个线程读的场景,因为它只能确保可见性。不能保证原子性。
尽量不使用符合操作“a=a+1”。使用get(),set()方法。
private volatile int a = 0;
//todo 单独写几篇JUC部分,内容太多了
thread和另外两种创建线程的方式有何区别
避免了java中单继承的局限性
int有多少位
32
http的各种错误码
200:正确的请求返回正确的结果,如果不想细分正确的请求结果都可以直接返回200
301:请求成功,但是资源被永久转移。比如说,我们下载的东西不在这个地址需要去到新的地址。
400:请求出现错误,比如请求头不对等。
401:没有提供认证信息。请求的时候没有带上 Token 等。
403:请求的资源不允许访问。就是说没有权限。
404:请求的内容不存在。
500:服务器错误。
505:请求的 HTTP 版本不支持。
4开头的都是被服务器拦截了,请求错误
3开头的和地址有关,重定向
5开头的就是到服务层了,服务错误
https://www.cnblogs.com/xiaodai0/p/9811639.html
tcp,为什么用tcp不用http,使用场景
http是建立在tcp之上的应用。
socket是支持TCP/IP协议的网络通信的基本操作单元。
socket适用场景:网络游戏,银行交互,支付。
http适用场景:公司OA服务,互联网服务。
https://www.cnblogs.com/baizhanshi/p/8482612.html
用线程池遇到的坑
// todo 单独写在JUC里面
springboot如何处理异常
ArrayList的扩容机制,HashMap的扩容机制和扩容因子,初始长度
ArrayList是1.5倍+1,初始长度是10
Vector是2倍,初始长度是10
HashMap是2倍,初始长度是16,扩容因子0.75
HashTable是2倍+1,初始长度是11
map是如何确定位置的
高16 bit 不变,低16 bit 和高16 bit 做了一个异或(得到的 hashcode 转化为32位二进制,前16位和后16位低16 bit和高16 bit做了一个异或)
(n·1) & hash = -> 得到下标
integer和int区别
1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 。
4、Integer的默认值是null,int的默认值是0
mysql中乐观锁和悲观锁的应用
todo在mysql文章内补充
java种两个date类型如何确定是同一天
参考https://blog.csdn.net/longzhongxiaoniao/article/details/86533014
使用Calendar对象,将date转成calendar对象,通过比较calendar对象的0、 1、6元素,来比较是不是同一天,同一个世纪同一年的第同一天
JAVA8已经有了并发安全的用来替代Calendar、date、SimpleDateFormat的类。
//todo 详见我的另外一篇文章,详细讨论时间相关类。。。
spring 事务注解的使用,事务的隔离级别,默认是?
默认是数据库的隔离级别。
todo 在spring分类中补充