最近面试问题-1
1.Spring的核心是?
IOC(控制反射)和AOP(面向切面编程)。
从注入方法上看,IoC主要可以分为3种类型:①构造函数注入②属性注入③接口注入。Spring支持构造函数注入和属性注入
2.SpringMVC是什么?
*.创建一个web环境;*.在创建一个controller类,加入@Controller的注解
SpringMVC是Spring的一个子框架,也包括了一些Spring的特性,如:依赖注入
3.算法知道哪些?
冒泡排序:两个数相比较,哪一个数较大,就交换两个的位置。
function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len - 1; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1]) { // 相邻元素两两对比 var temp = arr[j+1]; // 元素交换 arr[j+1] = arr[j]; arr[j] = temp; } } } return arr; }
快速排序:从数列中找一个数为“基准”,重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)
public class QuickSort implements IArraySort { @Override public int[] sort(int[] sourceArray) throws Exception { // 对 arr 进行拷贝,不改变参数内容 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); return quickSort(arr, 0, arr.length - 1); } private int[] quickSort(int[] arr, int left, int right) { if (left < right) { int partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex - 1); quickSort(arr, partitionIndex + 1, right); } return arr; } private int partition(int[] arr, int left, int right) { // 设定基准值(pivot) int pivot = left; int index = pivot + 1; for (int i = index; i <= right; i++) { if (arr[i] < arr[pivot]) { swap(arr, i, index); index++; } } swap(arr, pivot, index - 1); return index - 1; } private void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
4.数据结构你知道哪些?
堆:先进后出,多用于递归功能方面的场景,如:斐波那契数列:1.先写递归结束条件;2.接着写等价关系式
队列:先进先出,多用于线程阻塞队列
链表:分为单链表、双链表、循环链表。它的每个元素都有两个结点,一个结点是存放数据的内存空间,一个结点是指向下一个结点的指针域。
对于链表,在增加删除是,只需要改变前后两个元素结点的指针域的地址就行了,但是链表中的指针太多,对于修改查找就会过于复杂、麻烦。
5.数据库的三大范式?
第一范式:列不可再分,确保它的原子性;
第二范式:在第一范式的基础上,完全依赖主键;
第三范式:在一、二范式的基础上,直接依赖于主键。
6.如何理解JVM?
JVM即Java虚拟机,其中它包含了Java解释器和类加载器,根据指定全限定名称将class文件加载到JVM内存,转为Class对象。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。
7.你知道哪些加密的方法?
- MD5:
- SHA1:是哈希算法的一种
- RSA:非对称加密算法:公开密钥(publickey)和私有密钥(privatekey)
- AES:对称密钥加密:加密代码实现:引入 #import <CommonCrypto/CommonCryptor.h>
- DES:先将内容加密一下,然后转十六进制,传过去 ;DES解密 :把收到的数据转二进制,decode一下,然后再解密,得到原本的数据
代码实现 :引入#import <CommonCrypto/CommonCryptor.h>
8.如何理解外键?
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。
9.Nginx和Linux的命令?
Nginx:高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
nginx -s reopen #重启Nginx nginx -s reload #重新加载Nginx配置文件,然后以优雅的方式重启Nginx nginx -s stop #强制停止Nginx服务 nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务) nginx -t #检测配置文件是否有语法错误,然后退出 nginx -?,-h #打开帮助信息 nginx -v #显示版本信息并退出 nginx -V #显示版本和配置选项信息,然后退出 nginx -t #检测配置文件是否有语法错误,然后退出 nginx -T #检测配置文件是否有语法错误,转储并退出 nginx -q #在检测配置文件期间屏蔽非错误信息 nginx -p prefix #设置前缀路径(默认是:/usr/share/nginx/) nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf) nginx -g directives #设置配置文件外的全局指令 killall nginx #杀死所有nginx进程
Linux:多用户、多任务、支持多线程和多CPU的操作系统。
磁盘:cd:跳转到想要跳转的磁盘;
系统:clear:清屏
passwd:用来更改使用者的密码
ip :是 Linux 加强版的的网络配置工具,用于代替 ifconfig 命令
10.事物的隔离级别?
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
事务的并发问题
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A
改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
事务的基本要素(ACID)
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
11.servlet、listener、filter的区别?怎么用?
servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。
filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。
创建一个Filter只需两个步骤:
- 建Filter处理类;
- web.xml文件中配置Filter。
listener:监听器,从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。
interceptor:是在面向切面编程的,就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,是基于JAVA的反射机制。
servlet、filter、listener是配置到web.xml中(web.xml 的加载顺序是:context-param -> listener -> filter -> servlet ),interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中。spring的拦截器配置到spring.xml中。
1、servlet:
创建并返回一个包含基于客户请求性质的动态内容的完整的html页面;
创建可嵌入到现有的html页面中的一部分html页面(html片段);
读取客户端发来的隐藏数据;
读取客户端发来的显示数据;
与其他服务器资源(包括数据库和java的应用程序)进行通信;
通过状态代码和响应头向客户端发送隐藏数据。
2、filter:
filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应:
在执行servlet之前,首先执行filter程序,并为之做一些预处理工作;
根据程序需要修改请求和响应;
在servlet被调用之后截获servlet的执行
3、listener:职责如概念。
servlet2.4规范中提供了8个listener接口,可以将其分为三类,分别如下:
第一类:与servletContext有关的listner接口。包括:ServletContextListener、ServletContextAttributeListener
第二类:与HttpSession有关的Listner接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener;
第三类:与ServletRequest有关的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener
4、interceptor:与过滤器十分相似,通过层层拦截,处理用户的请求和响应。
11.Redis是什么?
redis是一个高性能的key-value存储系统。
redis提供五种数据类型:string,hash,list,set及zset(sorted set)。