面试题03
1,get请求与post请求的区别
-
get请求一般用于获取或查询资源信息,而post请求一般用于提交或更新资源信息。
-
get请求把参数包含在URL中,而post请求通过request body传递参数。
-
get请求的参数长度有限制,不同的浏览器和服务器有不同的限制,一般在2~8K之间;而post请求的参数长度没有限制。
-
get请求的参数只能是ASCII字符,而post请求可以支持多种编码方式。
-
get请求相对于post请求更不安全,因为参数会暴露在URL中,容易被拦截或篡改。
2,同步和异步的区别
-
同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是阻塞的,只有接收到返回的值或消息后才往下执行其他的命令。
-
异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。
3,什么是阻塞与非阻塞
-
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
-
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
-
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
4,软件的生命周期
分为1.需求分析阶段 2.软件设计阶段 3.软件编码阶段 4.软件测试阶段 5.软件运行和维护阶段
5,String,StringBuffer和StringBuilder的区别
- String是一个只读字符串,底层是一个final的字符数组,一经定义,无法增删改,每次对String的操作都是生成新的String对象
- 字符串拼接操作(+):就是在堆上new了一个StringBuilder对象,再调用append方法,拼接字符串
- StringBuffer和StringBuilder底层都是可变字符数组,但是StringBuffer是线程安全的,而StringBuilder是线程不安全的
6,mybatis中$和#的区别
-
mybatis&将传入的数据直接显示生成在SQL中,不会自动加引号,也不会进行JDBC类型转换,因此可能存在SQL注入的风险。
-
mybatis#将传入的数据当成一个字符串,会自动加引号,并且会进行JDBC类型转换,因此可以防止SQL注入。
-
在JDBC能使用占位符的地方,最好优先使用mybatis#;在JDBC不支持使用占位符的地方,就只能使用mybatis&,例如动态指定表名或排序字段。
7,start方法和run方法的区别
- start方法会创建一个新的线程,并让该线程执行run方法中的代码,同时主线程会继续执行下面的代码,实现了多线程的并发。
- run方法只是一个普通的方法,如果直接调用run方法,就相当于在主线程中执行run方法中的代码,并没有创建新的线程,也没有实现并发。
- start方法只能调用一次,否则会抛出IllegalThreadStateException异常;run方法可以多次调用。
8,http协议如何保证请求安全
-
选择拦截过滤器,拦截非法请求
-
数据加密,使用如md5等加密方式对传输的数据进行加密
-
签名:使用jwt进行验证
-
使用第三方框架与技术支持比如spring security和auth2框架
9,MySQL数据库连接方式
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接):与LEFT JOIN相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
- CROSS JOIN(交叉连接):获取两个表中所有可能的组合。
- NATURAL JOIN(自然连接):根据两个表中相同的字段进行连接。
10,HashTable、HashMap、ConcurrentHashMap的区别
- hashtable是线程安全的,但效率低,因为它在修改数据时会锁住整个表。它不允许键或值为null。它的初始容量是11,扩容时新容量等于旧容量的两倍加一。它使用链表来解决哈希冲突。
- hashmap是线程不安全的,但效率高,因为它不加锁。它允许键或值为null。它的初始容量是16,扩容时新容量等于旧容量的两倍。它也使用链表来解决哈希冲突,但当链表长度超过8且数组容量超过64时,会将链表转换为红黑树来提高查询效率。
- concurrenthashmap是线程安全的,且效率较高,因为它使用了分段锁的技术,只锁定部分数据而不是整个表。它不允许键或值为null。它的初始容量是16,扩容时只针对某个段进行扩容而不影响整个表。它也使用链表来解决哈希冲突,但在JDK1.8中也采用了红黑树的优化。
- 哈希冲突:是指在使用哈希表存储数据时,两个或多个不同的键(Key)被哈希函数映射到同一个位置的情况。这种情况会导致数据的存储和查找变得复杂
- 红黑树:基于二叉查找树实现,普通二叉查找树可能存在n个节点形成一条链的最坏情况,而红黑树就是在不影响树性质情况下使之平衡,即自平衡二叉查找树
- 左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。
- 右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。