一面(电话面试):
Vector和ArrayList的区别:
1、vector是由synchronized保证线程安全的,ArrayList不是,所以vector的性能较低
2、vector扩容是翻倍,ArrayList是增加50%,所以ArrayList更加节约空间
static int a = 1执行顺序
先初始化,在赋值
父类构造器和子类构造器先调用谁?
从该类所在的继承树最顶端开始执行,然后依次往下执行,最后执行到本类的构造器,如果其父类通过this调用同类中的构造器,则会依次执行多个父类中的构造器【1、子类构造器总会调用父类构造器;2、如果子类没有super显示调用父类构造器,则会默认调用父类的无参构造器;3、创建子类实例时,总会调用最顶层的父类构造器;4、构造方法无法继承】
数据库三大范式:
1、表设计中每一列都是不可拆分的原子列(四川省成都市,应该设计成province,city)
2、每一列都需要跟主键有关联关系
3、每一列跟主键都需要有直接关联关系
数据库隔离级别:
未提交读:事务修改中,即使事务没有提交,其他事务也能看到(发生脏读)
读已提交:事务修改中,其他事务只能看到历史数据,事务完成后,其他事务看到结果数据(读到就数据)【oracle默认】
可重复读:解决了脏读和旧数据的问题,但是没法保证幻读【mysql默认】
串行化:SERIALIZABLE是最高的隔离级别,它通过强制事务串行执行(注意是串行),避免了前面的幻读情况
分布式线程安全怎么实现:
1、时间戳方式:A系统大并发请求B系统进行操作的时候,带上时间戳,B系统在执行命令的时候比较存在时间戳和A系统请求时间戳,只有当A系统请求的时间戳大于存在的时间戳才做更新【需要保证A系统时序的有效性】
2、串行化:接受方使用消息队列将请求缓存起来,然后串行化处理这些调用
3、通过数据库保证【1、利用唯一索引,2、更新计算操作尽可能通过数据库完成(数据库锁机制会保证一致性)】
4、行锁:在表里面添加锁字段,采用select for update方法保证数据一致性;
5、尽量统一触发途经
MQ和dubbo的一些基本知识: