题目来自网上面试过人的记录,个人总结,个人总结,请勿转载
面向对象的特征?
(答的封装继承多态)
面向对象编程的优点?
1、易维护
采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
2、质量高
在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
3、效率高
在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。
4、易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
你熟悉哪些设计模式?
(答的单例,Builder,abstract工厂,策略,适配器,代理)
单例用了面向对象的什么特性?
(封装。。。)
你会写几种单例?
(这个问题答的还算不错,总共回答了4种写法,前段时间刚好做了总结,详情可以看博客
单例模式学习总结)
线程有哪几种实现方式?
(一直没懂他问的是什么意思,事后想想可能是想问
1. 继承runnable
2. 继承Thread
3. 利用线程池
)
知道线程池吗?
(不熟悉,如实告诉面试官。只知道是线程管理的方式,比如Android的AsyncTask)
HTTP和HTTPS的区别?
(不熟悉,如实告知..但是也提到了https是加密传输的,安全性更可靠。但是监听端口不同,https需要ssl证书之类的没说)
GET和POST的区别?
(GET直接在url后面,相当于明文传输;POST在报文实体,相当于暗文。两者限制的长度不一样。POST的长度限制远大于POST,具体长度忘记了,面试官也没多问)
说一下ArrayList的实现?
(数组封装,主要讲了下add的时候扩容1.5倍的问题)
一般大家都知道ArrayList和LinkedList的大致区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
ArrayList删除操作的时间复杂度?具体过程?
(线性时间复杂度,解释了一下,顺带提到了一下链表的删除是常数)
接口和抽象类的区别?
(主要从is a和like a的角度去答,还有一些语法上的区别,比如抽象类可以有含具体实现的非abstract方法,接口不能有具体实现的方法一类的)
在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。
第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以多继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的。
当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
I/0的常见对象
下图说明相关体系:
线程互斥的方法?
四种进程或线程同步互斥的控制方法
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。
3、信号量:为控制一个具有有限数量用户资源而设计。
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
tomcat 运行机制
先不去关技术细节,对一个servlet容器,我觉得它首先要做以下事情:
1:实现Servlet api规范。这是最基础的一个实现,servlet api大部分都是接口规范。如request、response、session、cookie。为了我们应用端能正常使用,容器必须有一套完整实现。
1:实现Servlet api规范。这是最基础的一个实现,servlet api大部分都是接口规范。如request、response、session、cookie。为了我们应用端能正常使用,容器必须有一套完整实现。
2:启动Socket监听端口,等待http请求。
3:获取http请求,分发请求给不同的协议处理器,如http和https在处理上是不一样的。
4:封装请求,构造HttpServletRequest。把socket获取的用户请求字节流转换成java对象httprequest。构造httpResponse。
5:调用(若未创建,则先加载)servlet,调用init初始化,执行servlet.service()方法。
6:为httpResponse添加header等头部信息。
7:socket回写流,返回满足http协议格式的数据给浏览器。
8:实现JSP语法分析器,JSP标记解释器。JSPservlet实现和渲染引擎。
9:JNDI、JMX等服务实现。容器一般额外提供命名空间服务管理。
10:线程池管理,创建线程池,并为每个请求分配线程。
Tcp三次握手
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
SYN:同步序列编号(Synchronize Sequence Numbers)
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.
完成三次握手,客户端与服务器开始传送数据
并发
用过哪些数据库?
(移动端sqlite,写服务端的时候用过MySQL)
用复杂sql语句的实践经验吗?
(没有)
那一般写过什么?
(增插删改...)
那你写一个,根据字段分组查询的语句
(用是用了group by,但是太长时间不接触数据库,面试官说语法有问题)
看了下我简历上的实习和项目
问我手机上也没有可以看的
(暑假之后换了手机,调试都用的旧手机,去之前也忘记在新手机上装一编,这个Android,iOS或者web前端的同学可以记得以后把项目给面试官展示。没有机会给面试官展示一下聊一会项目,算是个遗憾,就算能拿到offer,估计也拿不到高的薪资了)
最后照旧是面试官问我有没有什么要问他的
(问了平时的内部培训,技术交流与分享机制)