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;
    }