面试总结

来源:互联网 发布:如何分析问卷调查数据 编辑:程序博客网 时间:2024/06/06 18:52

JDK自带集合类型3种:

set 、list、map


HashMap的实现原理:

HashMap原理是基于hashing原理,通过put(),get()函数进行存储和获取,当我们将一个键值对给put()方法的时候,它会调用键的HashCode()方法计算出hashcode,从而找到bucket位置进行存储。hashMap采用equals()方法找到正确的键值对。hashMap采用链表解决碰撞,当发生碰撞了,对象将会储存在链表的下一个节点中。


HashMap和HashTable的区别:

HashMap:线程不安全,允许null做键值,加载因子0.75,初始容量16,每次增加为原来的1倍,将HashTable中的contains()改成了containValue()和containKey(),单线程下比HashTable快。

HashTable:线程安全,不允许null做键值,加载因子0.75,初始容量11,2*原数组长度+1。


List下的集合种类,以及区别:

Vector:线程安全的,速度比其他两个慢

ArrayList:可变数组实现的,线程不安全,检索快

LinkedList:双向链表实现的,线程不安全,插入删除快


Redis支持的数据类型:

string、 hash、 list、 set、 zset 


二叉树三种遍历方式:

先序:中左右

中序:左中右

后序:左右中


数据库连接池的作用:

1、快的系统反应

2、统一管理避免连接泄露

3、资源重用

4提高效率节省内存


SpringMVC的实现原理:

http://www.cnblogs.com/zbf1214/p/5265117.html

1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给
DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、执行处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户

前端控制器DispatcherServlet对用户的请求和各组件的响应进行处理,即一个转发器,根据前端控制器DispatcherServlet发送的请求,查找并生成handler处理器(后端控制器)以及处理  拦截器一并返回给前端控制器DispatcherServlet,前端控制器DispatcherServlet通过处理器适配器HandlerAdapter调用handler处理器(后端控制器)执行,返回ModelAndView给前端控制器。

后端控制器handler(Controller)Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要 程序员根据业务需求开发Handler。

图解析器ViewReslover接收到前端控制器的ModelAndView,将该结果生成view,View Resolver首先根据逻辑视图名解析成物理图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户


HandlerMapping:请求到处理器的映射,如果映射成功返回一个HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象;如BeanNameUrlHandlerMapping将URL与Bean名字映射,映射成功的Bean就是此处的处理器;


HandlerAdapter:HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;如SimpleControllerHandlerAdapter将对实现了Controller接口的Bean进行适配,并且掉处理器的handleRequest方法进行功能处理;

实现二叉树的广度遍历和深度遍历(给一个之前学习的代码)

public void bSearch(TreeNode1 node1) {    ArrayDeque<TreeNode1> queue = new ArrayDeque<>();    queue.add(node1);    while (!queue.isEmpty()) {        TreeNode1 temp = queue.remove();        System.out.print(temp.data+",");        if (temp.leftNode != null) {            queue.add(temp.leftNode);        }        if (temp.rigthNode != null) {            queue.add(temp.rigthNode);        }    }}

public void deepSearch(TreeNode1 node1) {    Stack<TreeNode1> stack = new Stack<>();    stack.push(node1);    while (!stack.isEmpty()) {        TreeNode1 temp = stack.pop();        System.out.print(temp.data+",");        if (temp.rigthNode != null){            stack.push(temp.rigthNode);        }        if (temp.leftNode != null) {            stack.push(temp.leftNode);        }    }}

synchronized和Lock的区别:

1、Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现。

2、synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁。

3、Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断。

4、通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

5、Lock可以提高多个线程进行读操作的效率。


synchronized原理:

保证方法或者代码运行时,同一时刻只有一个方法可以进入临界区,同时还可以保证共享变量的内存可见性,synchronized的底层实现主要依靠Lock-Free的队列,基本思路是自旋后阻塞,竞争切换后继续竞争锁,稍微牺牲了公平性,但获得了高吞吐量。


事务的四大特性:(简单说一下)

1、原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚

2、一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

3、隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

4、持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。


线程池作用:

限制系统中线程数量。更好控制资源从而进行控制。减少线程创建和销毁的次数。使线程可以反复使用。


重定向和转发的区别:

首先要明确的就是

转发是服务器行为:浏览器URL不会发生变化,转发只产生一次请求,网址只能是本站点地址,发送请求 -->服务器运行-->进行请求的重新设置,例如通过request.setAttribute(name,value)-->根据转发的地址,获取该地址的网页-->响应请求给浏览器

重定向是客户端行为:浏览器URL会发生变化,实际是产生两次请求,网址可以是任意地址,发送请求 -->服务器运行-->响应请求,返回给浏览器一个新的地址与响应码-->浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址-->服务器运行-->响应请求给浏览器



当输入域名之后,都发生了什么

1、浏览器会通过域名查找IP

DNS查找过程如下:

1、浏览器缓存

2、系统缓存

3、路由器缓存

4、ISP DNS 缓存

5、递归搜索

2、浏览器给web发送一个HTTP请求

3、服务的永久定向相应

4、浏览器跟踪重定向地址

5、服务器处理请求

6、服务器发送HTML响应

7、浏览器显示HTML

8、发送获取嵌入在HTML中对象

9、浏览器发送Ajax异步请求


什么是反射?反射的作用是什么?什么时候用到反射?

在运行状态下可以知道类属性和方法,并且任何一个对象可以通过反射机制调用那个类中的方法,这种动态获取信息的,和动态调用类对象方法的功能成为java反射机制。特点是Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载、探知、自审。使用在编译期并不知道的类。这样的特点就是反射。

作用:获取类的访问修饰符,成员,方法,构造方法以及超类信息

创建一个直到程序运行期才知道类名的实例

获取并设置一个类对象的成员

spring的IOC用到了反射机制,Spring帮我们实例化对象,之后放到容器中。通过反射实现的

  1. //解析<bean .../>元素的id属性得到该字符串值为“courseDao”  
  2. String idStr = "courseDao";  
  3. //解析<bean .../>元素的class属性得到该字符串值为“com.qcjy.learning.Dao.impl.CourseDaoImpl”  
  4. String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl";  
  5. //利用反射知识,通过classStr获取Class类对象  
  6. Class<?> cls = Class.forName(classStr);  
  7. //实例化对象  
  8. Object obj = cls.newInstance();  
  9. //container表示Spring容器  
  10. container.put(idStr, obj);  
其实只要在代码或配置文件中看到类的完整路径(包.类),其底层原理基本上使用的就是Java的反射机制。


垃圾回收的回收器:

在Java中,垃圾回收是一个自动的进程可以替代程序员进行内存的分配与回收这些复杂的工作。(但是回收的不彻底)

垃圾回收机分几种:

1、串行垃圾回收器          通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

2、并行垃圾回收器          JVM的默认垃圾回收器

3、并发标记扫描垃圾回收器           XX:+USeParNewGC 打开并发标记扫描垃圾回收器。

4、G1垃圾回收器             –XX:+UseG1GC 使用G1垃圾回收器              java8的新特性:通过 JVM参数 -XX:+UseStringDeduplication

人们可以向JVM中传递参数实现选择哪种垃圾回收器

参考:http://www.importnew.com/13827.html



Spring实现原理:

动态注入,让一个对象创建不在需要new,可以自动生成,利用java反射机制,根据xml文档动态的创建对象和调用对象里的方法。

AOP面向切面编程可以为某一对象进行监督和控制也就是在调用这类对象方法前后去调用你指定的模块从而达到模块扩充的目的

代理方式:

1、静态代理

针对每一个具体类编写代理类

针对每一接口编写代理类

2、动态代理

针对一个方面编写一个InvocationHandler,然后借助JDK中的Proxy类,为每个接口动态生成代理类

Spring用到经典的设计模式:模板方法设计模式


Mybatis底层实现原理:

无论怎么说Mybatis底层就是JDBC,对JDBC进行封装使用。SqlSession是一个接口,可以通过一个叫executor的执行器(基本执行器,缓存执行器(默认的))执行MappedStatement封装的Statement信息。接口的默认实现是DefaultSqlSession类。

输入出类型:基本类型,自定义类型,hashmap


java是单继承还是多继承尴尬:java当然是单继承,但是一个类可以继承多个接口
Mysql的引擎:http://www.cnblogs.com/gaobint/p/6367193.html

Redis的数据持久化AOF,RDB
原创粉丝点击