4.2面试问题复盘
1.数据库相关
- varchar实际存储容量的问题
情景:面试官开始问我的问题是:“在设计数据库字段是是会注意哪些问题?”(后来又追问了这个题,感觉他真正想听的是在设计字符类型数据时char与varchar的选择,以及varchar“可变长”的原理)
问题:如果我有一个表,该表的字段声明为接受varchar(100),然后我实际上插入单词"hello",那么在mysql服务器上将使用多少实际存储空间?
答案:6字节 = 5字节的实际长度 + 1字节(长度记录值,该值超过255会变为2字节)
varchar存储数据的底层原理:前缀 + 数据;其中前缀指的是记录varchar最大长度的值,255以内时为1,超过255以后为2
- 我的知识盲区:事务隔离级别、事务锁机制
- 事务未完成提交,突然断电,怎么办?
3.Java SE集合部分内容一定要弄得很熟练
ArrayList与LinkedList的区别(以下内容都是“没有绝对,只有相对”的原则)
- ArrayList与LinkedList那个效率更高(理论上):
- ArrayList:执行频繁的查找效率比LinkedList
- LinkedList:执行频繁的插入和删除效率比Arraylist高
- ArrayList与LinkedList内存占用对比:
- 表面上看,LinkedList的Node存储结构似乎更占空间,但是,如果数据量很大又在实时添加数据的情况下,ArrayList占用的空间不一定会比LinkedList空间小
- ArrayList与LinkedList的安全性对比:
- 二者都是线程不安全的(当时答错了…)
HashMap相关内容
- HashMap的key可以是空吗?
- 可以null,HashTable的key不能空(当时答错了…)
- HashMap扩容后如何移动原数组?
- 逐个重新push
- 我们如何较为合理的定义HashMap的初始容量?
- 预先估计一个元素可能个数 / 负载因子(或除一个比负载因子稍微小一点的数)
4.Java 多线程有关问题
- volatile底层如何实现指令重排?