• 面试问题复盘


    JDBC

    https://www.cnblogs.com/kevinf/p/3705148.html

    JSP/Servlet/JavaBean 的 MVC 模式

    https://blog.csdn.net/ITBigGod/article/details/86515893

    SpringMVC 的应用

    https://blog.csdn.net/cx521600/article/details/90241944

    TCP/IP协议有几层模型?

    TCP/IP层次模型共分为四层:应用层、传输层、网络层、数据链路层。

    • 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。

    • 传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等, TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。

    • 网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。 等)来传送数据。

    进程和线程的区别

    • 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

    • 线程的划分尺度小于进程,使得多线程程序的并发性高.

    • 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率.

    • 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

    • 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别

    进程状态

    image-20210312192018357

    Mysql和SQL Server的区别

    • mysql支持enum,和set类型,sql server不支持

    • mysql不支持nchar,nvarchar,ntext类型

    • mysql的递增语句是AUTO_INCREMENT,而sql server是identity(1,1)

    • sql server默认导出表创建语句的默认值表示是((0)),而在mysql里面是不允许带两括号的

    • mysql需要为表指定存储类型

    • sql server识别符是[],[type]表示他区别于关键字,但是mysql却是 `,也就是按键1左边的那个符号

    • sql server支持getdate()方法获取当前时间日期,但是mysql里面可以分日期类型和时间类型,获取当前日期是cur_date(),当前完整时间是 now()函数

    常见的排序方式有几种?快速排序的原理

    • 时间复杂度O(n^2)

      • 冒泡排序

      • 选择排序

      • 插入排序

    • 时间复杂度O(nlogn)

      • 希尔排序

      • 堆排序

      • 归并排序

      • 快速排序

    快排原理

    原理:

    1. 从数组中取出一个数,称之为基数(pivot)

    2. 遍历数组,将比基数大的数字放到它的右边,比基数小的数字放到它的左边。遍历完成后,数组被分成了左右两个区域

    3. 将左右两个区域视为两个数组,重复前两个步骤,直到排序完成

    代码参考:

    public static void quickSort(int[] arr) {
       quickSort(arr, 0, arr.length - 1);
    }
    public static void quickSort(int[] arr, int start, int end) {
       // 如果区域内的数字少于 2 个,退出递归
       if (start >= end) return;
       // 将数组分区,并获得中间值的下标
       int middle = partition(arr, start, end);
       // 对左边区域快速排序
       quickSort(arr, start, middle - 1);
       // 对右边区域快速排序
       quickSort(arr, middle + 1, end);
    }
    // 将 arr 从 start 到 end 分区,左边区域比基数小,右边区域比基数大,然后返回中间值的下标
    public static int partition(int[] arr, int start, int end) {
       // 取第一个数为基数
       int pivot = arr[start];
       // 从第二个数开始分区
       int left = start + 1;
       // 右边界
       int right = end;
       // left、right 相遇时退出循环
       while (left < right) {
           // 找到第一个大于基数的位置
           while (left < right && arr[left] <= pivot) left++;
           // 交换这两个数,使得左边分区都小于或等于基数,右边分区大于或等于基数
           if (left != right) {
               exchange(arr, left, right);
               right--;
          }
      }
       // 如果 left 和 right 相等,单独比较 arr[right] 和 pivot
       if (left == right && arr[right] > pivot) right--;
       // 将基数和中间数交换
       if (right != start) exchange(arr, start, right);
       // 返回中间值的下标
       return right;
    }
    private static void exchange(int[] arr, int i, int j) {
       int temp = arr[i];
       arr[i] = arr[j];
       arr[j] = temp;
    }

    注意:快排是个不稳定的排序方式



  • 相关阅读:
    windows下安装php5.5的redis扩展
    redis常见命令
    HDU 5869 Different GCD Subarray Query
    WA时查错点
    HDU 3333 Turing Tree
    HDU 5868 Different Circle Permutation
    AcWing 272 最长公共上升子序列 (dp)
    中国计量大学现代科技学院第四届“中竞杯”程序设计校赛 I 题 (双端队列bfs / 优先队列bfs)
    AtCoder ARC 109 D (拆点 + 分类讨论)
    codeforces 1408D. Searchlights (暴力 + 前缀优化)
  • 原文地址:https://www.cnblogs.com/AntonyJ/p/14525963.html
Copyright © 2020-2023  润新知