1、抽象类和接口的异同点?(这个本人在面试中被三家公司问道,很重要哦)
1.1、相同点:(1)都不能被直接实例化,都可以通过继承实现其抽象方法;
(2)都是面向抽象编程技术基础,实现诸多的设计模式
1.2、不同点:(1)接口支持多继承;抽象类不能实现多继承
(2)接口只能定义抽象规则;抽象类既可以定义规则,还可能提供己实现的成员。
(3)接口是一组行为规范;抽象类是一个不完整的类,着重族的概念。
(4)接口可用于支持回调;抽象类不能实现回调,因为继承不支持。
(5)接口只包含方法,属性,索引器,事件的签名,但是不能定义字段和包含实现的方法;抽象类可以定义字段,属性,包含有实现的方法。
(6)接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如:Struct就可以继承接口,而不能继承类。
2.ArrayList,vectro,LinkedList存储性能和特征
首先ArrayList类、vectro类、LinkedList类都是可伸缩的数组,也就是可以动态改变长度的数组。
ArrayList类是JDK1.1后出现的,在内存中是队列形式存储,适合查找,它是线程不安全的
Vectro类是较老的数组列表,他是线程安全的。
LinkedList类链表结构的数组,它适合增删改操作,但与ArrayList相比查询效率较低。在实际开发中用ArrayList相对多一点。
3.链表,队列和栈的区别
链表是一种存储结构,指得是存储时候除了要存储数据元素之外,还要用数据元素一起的另外空间存储数据元素的关系。
队列和栈都是线性表,属于逻辑结构范畴,都是访问点受到限制,并且限制在线性表端点的线性表。
栈被限定为在线性表中的同一个(唯一一个的)端点插入删除
队列被限定为在线性表的一端插入,另外一个端点删除
栈和队列也可以用链表来实现,分别称为链栈和链队列
4.HashMap和HashTable的区别?
HashMap和HashTable都实现了Map接口,他们之间的主要区别在于:线程安全性,同步(synchronization)以及速度。
(1)、HashMap几乎可以等价于HashTable,除了HashMap是非synchronization的,并可以允许null,也就是说HashMap的k-v可以为null,而HashTable则不允许k-v为null;
(2)、HashMap是非synchronization,而HashTable是synchronization的,这样就意味着HashMap是线程不安全的,恰恰相反HashTable就是线程安全的,多个线程可以共享一个HashTable;而如果没有正确同步的话,多个线程是不能共享HashMap的。Java5提供了ConcurrentHashMap,他是替代HashTable的替代者,比HashTable的扩展性更好。
(3)、HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
(4)、HashMap不能保证随着时间的推移Map中的元素次序是不变的。
5、session和cookie的区别
(1)、session数据放在服务器上;cookie数据存放在客户浏览器上
(2)、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑安全问题的时候应使用session
(3)、session会在一定时间内保存在服务器上面。当访问增多的时候,会比较占用服务器的内存,如果考虑减轻服务器性能方面问题,应使用cookie.
(4)、单个cookie保存的数据不能超过4k,大多数浏览器限制一个站点最多保存20个cookie
(5)、可以将重要信息比如用户名和密码存放到session中,其他信息如果需要保留可以放在cookie中。
6.SpringMVC的理解?SpringMVC的工作流程?
SpringMVC是基于过滤器对servlet进行了封装的一个框架,我们使用的时候就在web.xml中配置DispatcherServlet类;SpringMVC工作是主要是通过DispatcherServlet管理接受到的请求并进行处理。
SpringMVC的工作流程描述:
第一步:用户先服务器发送请求,请求被Spring前端控制Servelt DispatcherServlet捕获;
第二步: DispatcherServlet对请求URL进行解析,得到请求资源标识符(URL),然后根据该URL调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
第三步: DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)
第四步:提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:(1)、 HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息(2)、数据转换:对请求消息进行数据转换。如String转换成Integer、Double等(3)、数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等(4)、数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
第五步: Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
第六步:根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
第七步:ViewResolver 结合Model和View,来渲染视图
第八步:将渲染结果返回给客户端。
7、Nginx?怎么实现负载均衡?
Nginx 是俄罗斯人编写的十分轻量级的 是一个高性能的HTTP和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器.
Nginx实现负载均衡只需要在nginx文件中进行配置即可,配置如下:
第一步:在http模块的 #gzip on; 下面加上:(举例)
upstream www.myweb.com {
server 127.0.0.1:9100 weight=1;
server 127.0.0.1:9200 weight=1;
}
其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多;
upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器;
第二步:在server模块里添加:(举例)
location /myweb {
proxy_pass http://www.myweb.com;
}
其中 www.myweb.com 字符串要和 upstream 后面的字符串相等;