1.自我介绍
2.聊聊最近的项目
3.7层网络协议
- 应用层:为应用服务提供网络服务,http,snmp,ftp
- 表现层:将下层收到的数据进行处理成网络标准的数据格式
- 会话层:管理连接,就是何时创建连接,何时关闭连接
- 传输层:保障数据传输的可靠稳定,tcp,udp
- 网络层:通过路由,产生IP地址,来实现数据包的发送
- 数据链路层:把不规范的比特流通过封装成数据帧的方式传给上层
- 物理层:连接底层物理设备的传输介质,通过比特流的方式进行数据传输
4.数据库索引有哪些
- 主键索引:给一个键设置为主键的时候自动创建主键索引
- 唯一索引:可以给单独某个键创建唯一索引,不能有重复值
- 联合索引:可以给多个键设置联合索引,最左匹配
- 全文索引:全表查询关键字
5.聚集索引和非聚集索引
- 聚集索引就是索引存放的顺序和数据表中的顺序一致,类似新华字典的索引,一个表只能有一个
- 非聚集索引就是存放的顺序不一样,例如普通索引,唯一索引,全文索引都是属于这个的
6.B树和B+树的区别
- B树的每个节点都会保存指针和数据,所以每个节点占用了磁盘较多空间,这样会增加树的高度,导致IO操作变多,查询性能变低
- 而B+树其实是在B树上进行了优化,每个非叶子节点只保存索引,不保存数据,这样占用空间会小一些,一个节点也能存更多的key,树的高度也不会那么高,IO查询效率更高,而且叶子节点会构成一个有序链表
7.数据库隔离级别
先说下事物4种特性
- 原子性:事物在执行过程中,要么全部执行成功,要么全部失败
- 一致性:事物在执行过程中,保障数据的完整性,一致性,
- 隔离性:同一时间,只能有一个事物进行
- 持久性:事物执行完后后,数据会保存在数据库中,无法回滚
事物并发的几个概念
- 脏读:比如财务给员工发工资,发了1W元,员工查工资卡一看挺高兴,后来财务发现工资发错了,立马取消,又改成8K,那么员工看到的1W就是脏数据,这就是脏读
- 不可重复读:事物1需要读2次数据a,读完第一次时,事物2把a的值修改并提交了,这是事物1进行第二次读的时候前后2次读的数据不一致
- 幻读:跟不可重复度类似,例如事物1需要查询2次本月发放工资1W-2W的人,查询完第一次有5条记录,这时事物2发现有一个人的工作发的是8K,发错了,应该发1.2W的,然后把这个人的工资改成了1.2W,这时事物1进行第二次查询的时候,就会发现有6条记录,多了一条记录,就邪门了,产生幻觉了
隔离级别
- 读不提交:读了一个未提交的数据,隔离级别最低
- 读可提交:只能读提交过后的数据,sqlserver的默认隔离级别
- 可重复读:同一事物多次读取数据都一致,MySQL的默认级别
- 序列化读:把事物排序按照顺序执行,上锁,这样会造成锁竞争,占用资源,不建议使用
8.算法题
给定int 类型数组 [5, 0, -2, 1, 0, 2, 0, -1, 0, 0, 4]
将数据分为3类,移动元素后,元素顺序为 正数、负数、零
要求只能进行数组内移动,空间复杂度 O(1)
public static int [] sortArr(){
int [] arr = new int[]{-3, -4, 5, 0, -2, 1, 0, 2, 0, -1, 0, 0, 4};
//思路
//定义3个游标
//a:从0开始,用来交换正数的游标
//b和c是从0到数组长度-1的遍历区间
//每次循环,遇到0就和最后的数交换,此时遍历长度-1,也就是c-1,
//如果是负数,就游标b+1,进行下次循环,
// 然后遇到正数就和第a位交互,交互完之后a 和 遍历起点b都+1
int a = 0;
int b = 0;
int c = arr.length - 1;
while(b < c){
if(arr[b] < 0){
b ++;
}else if(arr[b] > 0){
int temp = arr[b];
arr[b] = arr[a];
arr[a] = temp;
a ++;
b ++;
}else if(arr[b] == 0){
if(c != 0){
int temp = arr[b];
arr[b] = arr[c];
arr[c] = temp;
}
c --;
}
}
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]);
System.out.println();
}
return arr;
}