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)。 等)来传送数据。
进程和线程的区别
-
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
-
线程的划分尺度小于进程,使得多线程程序的并发性高.
-
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率.
-
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
-
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别
进程状态
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)
-
希尔排序
-
堆排序
-
归并排序
-
快速排序
-
快排原理
原理:
-
从数组中取出一个数,称之为基数(pivot)
-
遍历数组,将比基数大的数字放到它的右边,比基数小的数字放到它的左边。遍历完成后,数组被分成了左右两个区域
-
将左右两个区域视为两个数组,重复前两个步骤,直到排序完成
代码参考:
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;
}