在面试了很多家公司以后,一些其他公司也给了实习Offer,但是还是选择了这家。因为其他家要么是传统企业做CRM系统的,要么是面试Java开发工程师实习,连Java都没问,有点担心工作的内容。这边这个企业其他的不说,起码实习应该可以学到不少技术的,面试共面了5面,特别是第一面,电话打了四十多分钟,问题从数据结构到算法,再从Java到计算机网络,问的还是比较全的,后面四面基本都是一些实际的解决方案的问题。最后一面是公司技术负责人面得。全部都是之前没有接触过的实际问题,基本每个问题都没答全,只答出来了一部分。最后HR还是给了Offer,公司入职配MAC,公司规模虽然小,但是公司产品线还是比较可以的,而且公司对技术这一块是十分重视的。对于一个实习生,还是加油努力学习提高自己吧。
一面:
-
反射创建类有哪几种方法?
- 通过取得Class对象的getConstructor方法取得Construtor对象,然后再通过调用Constructor类的newInstance的两个方法
- 通过Class对象的newInstance()方法,这种方法的局限是只能取调用默认的构造函数
- 通过Class类的一个forName(String className)静态方法返回一个Class对象,className必须是全路径名称
- 一般使用这种,通用性好,字符串可以在配置文件中配置好
-
Java中synchronized和Lock的区别
- Lock是java的一个interface接口,而synchronized是Java中的关键字,synchronized是由JDK实现的,不需要程序员编写代码去控制加锁和释放
- synchronized修饰的代码在执行异常时,jdk会自动释放线程占有的锁,不需要程序员去控制释放锁,因此不会导致死锁现象发生;但是,当Lock发生异常时,如果程序没有通过unLock()去释放锁,则很可能造成死锁现象,因此Lock一般都是在finally块中释放锁
- Lock可以让等待锁的线程响应中断处理,如tryLock(long time, TimeUnit unit),而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够中断,程序员无法控制;
- 通过Lock可以知道有没有成功获取锁,tryLock()方法返回boolean值,因此可知道是否获得了锁,而synchronized却无法办到
- Lock的实现类ReentrantReadWriteLock提供了readLock()和writeLock()用来获取读锁和写锁的两个方法,这样多个线程可以进行同时读操作
- Lock锁的范围有局限性,仅适用于代码块范围,而synchronized可以锁住代码块、对象实例、类。
-
抽象类和接口的区别
- 抽象类要被子类继承,接口要被类实现
- 接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现
- 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量
- 接口是设计的结果,抽象类是重构的结果
- 抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高
- 抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量
- 抽象类主要用来抽象类别,接口主要用来抽象功能
-
JVM中内存有哪几种?
- 方法区
- 堆
- Java虚拟机栈
- 本地方法栈
- 程序计算器
-
HashMap和HashTable的区别
- HashMap类大致相当于哈希表,但它是非同步的,并且允许空值。HashMap允许空值作为键和值,而HashTable不允许空。
- HashMap是非同步的,而Hashtable是同步的,这意味着哈希表线程安全,可以在多个线程之间共享,但是HashMap如果没有适当的同步,就不能在多个线程之间共享
- HashMap 中的 Iterator 迭代器是 fail-fast 的,而 Hashtable 的 Enumerator 不是 fail-fast 的。所以,当其他线程改变了HashMap 的结构,如:增加、删除元素,将会抛出 ConcurrentModificationException 异常,而 Hashtable 则不会。
- Hashtable和HashMap之间一个更显著的区别是,由于线程安全性和同步性,如果在单线程环境中使用,Hashtable比HashMap慢得多。因此,如果您不需要同步,并且HashMap仅由一个线程使用,那么它的性能将优于Java中的Hashtable
-
OSI七层模型?
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
-
TCP和UDP的区别?
- TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
- 对系统资源的要求(TCP较多,UDP少)
- TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
- TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
- 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
- TCP首部开销20字节;UDP的首部开销小,只有8个字节
- TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠的信道
-
TCP位于七层中的哪一层?
- 传输层
-
HTTP和HTTPS的区别?
- https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。(原来网易官网是http,而网易邮箱是https。)
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
- http的连接很简单,是无状态的。Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)
-
HTTPS如何对数据进行加密的?
- HTTPS就是使用SSL/TLS协议进行加密传输,让客户端拿到服务器的公钥,然后客户端随机生成一个对称加密的秘钥,使用公钥加密,传输给服务端,后续的所有信息都通过该对称秘钥进行加密解密,完成整个HTTPS的流程。
-
HTTPS的默认端口?
- 443
-
简述ARP
- 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
-
SpringMVC的原理
- 客户端(浏览器)发送请求,直接请求到DispatcherServlet
- DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler
- 解析到对应的Handler后,开始由HandlerAdapter适配器处理
- HandlerAdapter会根据Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑
- 处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View
- ViewResolver会根据逻辑View查找实际的View
- DispaterServlet把返回的Model传给View
- 通过View返回给请求者(浏览器)
-
MyBatis的原理
- 加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。
- SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession
- SqlSession对象完成和数据库的交互
- 用户程序调用mybatis接口层api(即Mapper接口中的方法)
- SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
- 通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
- JDBC执行sql
- 借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回
-
简述快速排序
- 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
-
快速排序的时间复杂度?冒泡排序的时间复杂度?
- 快速排序的时间复杂度为O(N*logN)
- 冒泡排序的时间复杂度为O(N*N)
-
常见的索引有哪些
-
主键索引
- 当一张表,把某个列设为主键的时候,则该列就是主键索引
-
普通索引
- 普通索引一般是在建表后再添加的
-
全文索引
- 首先,全文索引主要针对文本文件,比如文章,标题,全文索引只有MyISAM有效
-
唯一索引
- 唯一索引可以有多个null,不能是重复的内容
-
主键索引
-
索引的基本原理?
- 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
- 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引
- 为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。
-
在什么情况下最好不要使用索引?
- 对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求
- 对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度
- 对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
- 当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引
-
B树和B+树的区别?
-
B树
- 树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加高效
-
B+树
- 由于B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围
- B+树的叶节点由一条链相连,因此当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间
-
B树
-
不使用除法求商?
- -
字母a-z散列到数组长度为255的数组中,编写散列算法。
- 通过对a-z取ASCII的值乘以对应的下标,比如a为0,不为1
- 然后取出值后对255取余
- 可以使用&(255-1),这个方法因为对一个数取余可以写成对这个数减一进行与运算
二面:
-
目前使用的HTTP是什么版本?
- HTTP 1.1
-
HTTP有哪些版本
- HTTP 0.9
- HTTP 1.0
- HTTP 1.1
- HTTP 2.0
- HTTP 3.0
-
详述HTTP1.0/1.1/2.0/3.0的特点
-
HTTP 0.9
- HTTP协议的最初版本,功能简陋,仅支持请求方式GET,并且仅能请求访问HTML格式的资源
-
HTTP 1.0
- 增加了请求方式POST和HEAD
- 不再局限于0.9版本的HTML格式,根据Content-Type可以支持多种数据格式,即MIME多用途互联网邮件扩展,例如text/html、image/jpeg等
- 开始支持cache,就是当客户端在规定时间内访问统一网站,直接访问cache即可
- 工作方式是每次TCP连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立TCP连接,就是不支持keepalive
-
HTTP 1.1
- 引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive
- 加入了管道机制,在同一个TCP连接里,允许多个请求同时发送,增加了并发性,进一步改善了HTTP协议的效率
-
HTTP 2.0
-
二进制协议
- HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。
-
多工
- HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"。举例来说,在一个TCP连接里面,服务器同时收到了A请求和B请求,于是先回应A请求,结果发现处理过程非常耗时,于是就发送A请求已经处理好的部分, 接着回应B请求,完成后,再发送A请求剩下的部分
-
数据流
- HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数
-
头信息压缩
- HTTP 协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如Cookie和User Agent,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP/2 对这一点做了优化,引入了头信息压缩机制(header compression)。一方面,头信息使用gzip或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
-
服务器推送
- HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。意思是说,当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。
-
二进制协议
-
HTTP 3.0
- HTTP/3把HTTP底层的TCP协议改成了UDP!
-
HTTP 0.9
明天正式去公司实习,加油,加油,加油啊!
文章为ArvinHan原创,如果文章有错的地方欢迎指正,大家互相交流。