字节一面3.25
有哪些表?序列表?序列号是在下单表里?是的
- 用户表,用户密码表
- 商品表,商品库存表
- 下单表
- 序列号表
- 秒杀表
项目哪些用到了事务?
- 用户:注册
- 商品:创建商品、减库存、增加销量
- 下单:创建下单、生成下单号
ItemStockDOMapper.xml:
update item_stock set stock = stock - #{amount}
where item_id = #{itemId} and stock >= #{amount}
int affectedRow = itemStockDOMapper.decreaseStock(itmeId,amount);//通过返回的受影响条目,来判断是否减库存成功。
if(affectedRow > 0 ){
return true;//更新库存成功
}else{
return false;//更新库存失败
}
万一同一时刻很多用户,序列号重复怎么办?
ACID?
- 原子性
- 一致性
- 隔离性
- 持久性
protected public private区别?
-
- private: 同一个类
-
- default: 同一个类、同一个包中
-
- protected:同一个类、同一个包中、子类
-
- public: 同一个类、同一个包中、子类、所有类
抽象类和接口的区别?
-
- 定义抽象类的关键字是abstract class,定义接口的关键字是interface;
-
- 继承抽象类是extends,实现接口是用implements;
-
- 继承抽象类只有单继承,实现接口可以多实现;
-
- 抽象类中可以有构造方法,接口中不能有构造方法;
-
- 抽象类中可以有成员变量,接口中只能有常量;
-
- 抽象类中可以有成员方法,接口中只能有抽象方法;
-
- 抽象类中增加方法可以不影响子类,接口中增加方法通常影响子类;
-
- 从jdk1.8开始,允许接口中有非抽象方法,但需要加default关键字;
接口:
- 不可以定义成员变量,但可以定义常量;
- 只能定义没有实现的方法,方法默认是public abstract;(特殊的抽象类,只包含有抽象方法的抽象类)
- 类实现接口后,必须实现该接口定义的所有方法;
abstract可以修饰什么?
- 类和方法;
- 具有抽象方法的类一定是抽象类,但是抽象类可以没有抽象方法,可以全是具体方法;
final可以修饰属性、方法、类吗?final可以修饰接口吗?
可以, 不可以。
-
- fianl修饰类,类不可以被继承,而且类里的所有成员方法也是final的;
-
- fianl修饰方法,方法不能被重写;
-
- fianl修饰变量,变量变成常量,一旦赋值再也不能修改。(基本类型变量:初始化后再不能更改;引用类型变量:初始化后,不能再指向另一个对象,但是对象的内容是可以改变的。)
static修饰类、方法、属性时的特点?
- static修饰类(只能修饰内部类),只有在用到的时候才加载,而不是和类一起加载;
- static修饰的成员属于类,类的所有对象共享的,可以通过类.来调用;
- static修饰代码块,静态代码块在非静态代码块之前执行,且只执行一次;
解释一下哈希冲突?扩容机制?扩容后原本数据怎么移动?
- 对key求hashcode,并经过扰动函数处理得到hash值,然后hash&(length-1)就是所在数组的位置,如果没有元素,说明没有冲突,直接存放,如果有则冲突,需要调用equals方法比较是否相等,相等则覆盖,不等则用链表存储,当链表长度>8时,转化为红黑树。
- 当数组的元素大于length*负载因子0.75时,则将数组扩为原来的两倍,并且重新计算hash&(length-1)值,把元素转移过去,防止产生环形链表,所以采用尾插法。扩容很影响效率,所以最好在最初的时候就指定数组大小。
栈里放什么?什么时候栈溢出?什么时候堆溢出?
- 基本数据类型和对象的引用,堆:对象实例
- 栈溢出:递归调用方法,线程请求的栈深度大于虚拟机允许的最大深度。(单线程SOM)-->(多线程OOM)当虚拟机扩展栈深度时,无法申请到足够空间则OOM。
- 堆溢出:循环创建大对象(OOM)
问操作系统?不太清楚。 虚拟内存干嘛?
- 虚拟内存为每个进程都分配了一致的、私有的地址空间。
- 虚拟内存的重要意义是它定义了一个连续的虚拟地址空间,并且把内存扩展到硬盘空间。
题目:给一个颗树,找到target节点,并返回距离target为2(k)的所有节点?
先找到target节点,然后以target为根节点,找到第k层的所有节点即可!