爱奇艺电话面试:
(1)请描述在浏览器中输入一个url,到浏览器显示页面的过程。请尽量详细。
可分为3个部分:
1.从浏览器到服务器
2.服务器接受HttpRequest请求之后的变化
3.浏览器接受到返回数据之后的变化
对于第一步:
浏览器通过DNS服务器,获得网址对应的IP地址。之后通过TCP协议与服务器通过“三次握手”建立连接。
其中三次握手协议的过程:
- 客户端发送标志为SYN=1,seq=j的数据包到服务器
- 服务器收到该数据包包之后,发送标志位SYN=1和ACK=1,ack=j+1,syn=k的数据包。
- 客户端接收到数据包之后,检查ACK是否为一,ack是否为j+1.检查正确之后发送ACK=1,seq=j+1的数据包
对于第二步:
- WEB容器接收客户请求解析。
- WEB容器首先检查是否已经创建好了Servlet的实例对象,如果创建好执行第4步,否则执行第2步
- 创建Servlet实例对象(只有首次访问时候才创建目标Servlet)
- 调用Servlet的init()方法
- WEB容器创建一个用于封装HTTP请求消息请求的HttpServletRequest对象和一个封装响应消息的HttpServletRespose对象,然后调用Servlet的Service()方法将请求和响应对象作为参数传进去,写入响应消息。
- WEB容器再发出HTTP响应将结果发送给浏览器
对于第三步
浏览器将响应内容进行渲染
(2)介绍一些MVC
1.model
代表一个存储数据的对象,有时候也代表数据库中存取对象
2.view
将model的数据可视化
3.control
负责转发请求,对请求进行处理。
(3)Map有几个子类,以及查找时间复杂度。
HashMap和TreeMap。
- HashMap查找复杂度为常数级,根据键的hashcode存储value。
- TreeMap查找复杂度为log(n),键的对象需要继承comparable接口。会感觉键进行排序。因此插入删除会消耗时间。红黑树的插入和删除的时间复杂度均为O(lg(n))。
ArrayList和LinkedList的区别,以及相关操作的时间复杂度.
-ArrayList由数组实现,查找复杂度为O(1),删除,增加复杂度为O(n)
-LinkedList由链表实现,查找复杂度为O(n),删除,增加复杂度为O(1).
(4)ArrayList和Vector里面数组如果满了。采取什么方案解决
-ArrayList创建一个新的数组,数组的长度为之前长度的1.5倍,并远数组的内容复制到该数组中。添加数据的时间复杂度为O(1);Arraylist是线程不安全的
-Vector创建一个新的数组,数组长度为之前长度的2倍。Vector是线程安全的。因此效率不及Arraylist。
(5)给出两个链表,如果有相交节点。设计一个算法如何判断,并给出时间复杂度和空间复制度。
将第一个链表的每个值依次传进hashSet中。再遍历第二条链表,通过if语句判断是否存在hashset中。时间复杂度为O(l1+l2),空间复杂度为O(l1)的存储空间。
(6)如果链表中有环如何解决。
- 依然可以用hashset解决,遍历链表,存储到hashset中,如果出现重复的节点者返回。
- 弄两个指针,一个快指针,每次走两步,一个慢指针每次走一步。如果出现相交情况则说明有环。
网易电面(突然打电话过来,有些慌乱,过程很不好)
(1)java的三大特性
继承,动态,封装(平时没在意这些,只答出两个)
(2)数据库事物的隔离级别
- 读未提交(脏读:读取到了未提交的数据)
- 读已提交(不可重复读:一次事物两次相同查询的结果不同)
- 可重复读(幻读:事物A先查询匹配若干行,事物B再进行增加或者删除。之后A查询匹配的结果集和之前不同)
- 串序列化
(3)线程同步的几种方式
- 使synchronized关键字修饰的方法。
- 使用synchronized关键字修饰的代码块
- 使用lock进行加锁
- 使用TreadLocal获得数据的副本,从线程独立,互相不影响。
网友评论