文章标题


一: 前言




人不光是靠他生来就拥有一切,而是靠他从学习中所得到的一切来造就自己。----歌德




二: 面试挑战

  在开始第三章题目之前,还是先安利下"面试挑战": 凡是满足下面的挑战条件的,如果一个月内没有拿到一个Offer的,免费提供简历封装建议和相关面试题目解答。

  如果面试通过的,可以截图分享领红包,让大家一起见证,具体条件如下:

  1、计算机相关专业或者经过计算机相关专业的培训(不少于3个月,正常来说培训机构培训时间不会少于三个月),准备从事JAVA开发人员。

   2、从事的工作是JAVA开发,年限是1-3年(大神的话就忽略我说的,可以直接退出了)或者是符合计算机相关专业,准备从学校出来就业的。

   3、持续学习本人《面试大全》至少两个月且对其中的内容基本掌握的。

  4、需要提供相关面试证据或者是面试题目。

  如果大家对这个感兴趣的,可以关注【IT学习日记】回复【面试挑战】即可参与,现在参与还免费赠送一份面试资料。



三: 后端基础知识篇(三)



一: JAVA中有序和无序的区别



  有序:

    存储的顺序和添加的顺序相同,并且可以通过下标进行访问,如List



  无序:

    存储的顺序和添加的顺序无关,没有下标如TreeSet,它是存储的顺序和添加的顺序无关,但其中的对象也进行了相应规范的排序。



二: IO密集型和CPU密集型



  CPU密集型(计算密集型):


    指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。



  IO密集型(I/O bound)


    IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。



三: 垃圾回收中ROOTS对象有哪些



  1、引用栈帧中的本地变量表的所有对象


  2、引用方法区中静态属性的所有对象


  3、引用方法区中常量的所有对象


  4、引用native方法的所有对象



四: 标记(引用计数和可达性分析的区别)



  1、引用计数:


    存在一个计数器,对象每被调用一次,则计数器加1,每被释放一次,则计数器减1。但是它难解决几个对象循环引用的问题。



  2、可达性分析:


    以GC ROOTS的对象为起点,从此处开始搜索,搜索与该节点直接或者间接引用关系的对象,并将他们以链的形式组合起来(引用链),GC则回收不在此链上的对象。



五: J2EE的核心组件有哪些



  1、JDBC


  2、JNDI


  3、RMI


  4、JSP


  5、SERVLET


  6、XML


  7、JMS


  8、EJB


  9、IDL


  10、JTS


  11、JTA


  12、JAVA MAIL


  13、JAF



六: Servlet的生命周期



  1、加载和实例化


    当Servlet容器启动或者客户端发起一个请求时,Servlet容器查找内存中是否存在该Servlet,若存在则直接读取该实例的响应,若不存在则创建。

  2、初始化


    Servlet容器调用init方法机型初始化

  3、处理服务


    在service方法中处理具体的业务需求

  4、销毁


    服务器关闭或者重启时,执行destroy方法销毁容器。



七: 使用POI技术时遇到内存溢出该如何解决



  1、写操作时遇到内存溢出:


    数据量大时,写操作存在溢出风险,可以使用POI官方提供的SXSSYWorkBook相关的API进行写操作(它支持xlsx),它保证了任何时候只有可配置的行才会被保存在内存中,最大程度的避免了内存溢出的问题,但是还是存在内存溢出问题,建议使用阿里巴巴的easyExcel组件代替。

  2、读取数据时内存溢出


    可以将导出的格式用csv替换excel。



八: JAVA中代码块和构造函数等的执行顺序



  1、父类静态代码快


  2、子类静态代码快


  3、父类代码快


  4、父类构造函数


  5、子类代码快


  6、子类构造函数



九: JAVA是面向对象的语言,有什么特点



  1、易于理解,有更好的可读性

  2、平台无关性,一次编译,处处运行

  3、提供了许多类库,方便开发者的工作,减少开发时间

  4、提供了对web的支持

  5、具有较好的安全性和健壮性(如垃圾回收)

  6、去除了C++中难以理解,易于混淆的特性



十: MVC模式是什么,它的优缺点



  1、定义:


    全称是:Model、View、Controller,它是一个通过业务逻辑、数据和界面显示分离的方式来组织代码的一种模式。

    典型的案例: JSP + Servlet + JavaBean。

    JavaBean作为模型(model)即作为数据模型封装业务数据、JSP作为View用于界面展示,Servlet作为Controller,用于控制界面View和Model之间的流转。

  2、优点:


    1、耦合性低: View和Model分离,允许修改视图层代码而不用重编译Model和Controller层的代码。


    2、重用性高: 允许不同的视图使用同一个服务器的代码


    3、可维护性高: 分离View和Model使Web应用更易于维护和修改

  3、缺点:


    1、完全理解MVC模式比较复杂


    2、调试比原来更加麻烦


    3、增加了系统结构和实现的复杂性



十一: Int和Integer所占用的内存大小比较



  Integer占用的内存更大,因为它是一个对象,需要存储对象的元数据。Int是一个原始数据类型,没有这部分的数据。



十二: JSP和Servlet的区别



  1、JSP本质上是Servlet,但是它更擅长于界面展示,Servlet更擅长于逻辑控制


  2、Servlet中没有内置对象


  3、Servlet的应用逻辑是在java文件中,完全从表现层的HTML代码中分离出来了


  4、JSP是java和html组成的一个拓展名文件为.jsp的文件



十三: 什么是Shell



  定义:


    它是一个命令解释工具,将用户输入的命令转换成内核能够理解的语言。

    延申知识: 为程序分配系统资源,处理计算机内部细节的软件叫做操作系统或者内核

    它本身是用C语言编写的程序,是使用unix/linux的桥梁,简单来说它是一种命令语言,也是一种程序设计语言。

    它调用了系统中大部分功能来执行程序,建立文件并以并行的方式协调各个程序的运行。

  执行方式:


    1、交互式: 解释执行用户命令,用户输入一条,shell便解释执行一条。


    2、批处理: 先将写好的shell脚本(script),再让shell一次执行完,它是解释执行的,无序编译。



十四: 什么是Restful



  因为关于Restful风格的知识篇幅较多,在此处不好拓展,想要了解关于Restful风格更详细知识,可以查看之前的文章,在这之前有专门的文章非常描述了Restful风格的问题



十五: Tomcat的部署方式



  方式1、将编译号的web项目打包成war包放入tomcat的webapps目录下

  方式2、修改tomcat的server.xml文件,在Host标签中添加Context标签,属性如下:


    Path: 浏览器访问时的路径(相对与项目名),如:/webproject


    docBace: web项目的webroot所在的路径,是编译后的项目,如:”D:/web”


    Reloadable: 取值true/false,表示项目有改动时,tomcat是否重新加载该项目

  方式3、在tomcat的conf/Catalina/localhost目录中创建一个xml文件,加入Context标签,属性和第二种部署的方式一样,如:



十六: 基本数据类型占用的字节大小



  Byte(1),Short(2),int(4),long(7),char(2),float(4),double(8),boolean(未知)



十七: JAVA中序列化为什么要实现Serializable接口



  因为在调用序列化接口写入方法(writeObject)时,会进行类型判断,如果对象是String、Array、Enum、Serializable类型的对象则可以正常序列化,否则会抛出NotSerializableException异常,代码如下:

跳槽者、应届生必看JAVA面试题系列(三)_应届生



十八: 对象的Finalize方法作用



  作用:


    在对象被回收前(既被标记之后),该对象的该方法会被调用,可以重写用于释放关联的对象空间或者重新将对象引用,以防被GC回收。

  步骤:


    对象先进行一次标记,在下一次GC之前执行对象中的finalize方法,在执行的时候,先判断对象是否重写了该方法,如果没有,则直接回收,如果重写了,则先放在一个队列中,由虚拟机开一个低优先级的线程去执行它,随后,会进行第二次小规模的标记,在此次被标记的对象就会被真正的回收了。



十九: Maven项目中pom、war、jar工程的区别



  1、POM项目: 用于父级工程或者聚合工程,用来做jar包的版本控制

  2、war项目: 项目会可以被打包成war,发布在服务器上的工程

  3、JAR项目: 项目可以被打包成jar,一把是需要提供第三方使用或者单独运行的项目



二十: 互联网”三高”是指什么?



  三高: 高并发、高可用、高性能(3H)

  高并发: 简单的说是单位时间内软件最大能够承受的请求数量。

  高可用: 服务集群化,当某个服务down时,可以有备用的替换,不会导致服务不可用,如:Redis的哨兵模式

  高性能: 单位时间可以处理任务的数量,提高性能主要分为以下两方面。

    1、软件方面: 如正确的编码,SQL解决慢查询、引入缓存、使用多线程

    2、硬件方面: 提高服务器配置(内存、CPUT)等



二十一: 并发和并行的区别



  并发量:


    一段时间内,最大能够处理请求的数量。

  并行量:


    同一时间内,最大能够处理请求的数量。

  区别:


    并行是指同一个时间处理的请求数,并发是指一段时间内可以处理的请求数。并发是一个cpu(核)交替执行多个任务,并行是同一时刻不同cpu执行的任务数。



二十二: 常见衡量高并发的一些指标



  1、响应时间:


    客户端发起请求开始,到客户端接收到服务端返回的响应时间结束,这个过程所花费的时间。性能检测中一般以压力发起段至压测服务器返回处理结果的时间为计量,单位一般为秒或者毫秒。

  2、平均响应时间:


    系统在稳定的运行时间段内,同一个交易的平均时间,一般而言,交易响应时间均指平均响应时间。标值应根据不同的交易分别设定,一般情况下,分为复杂交易响应时间、简单交易响应时间、特殊交易响应时间。其中,特殊交易响应时间的设定必须明确该交易在响应时间方面的特殊性。

  3、吞吐量


    单位时间内处理请求的数量。

  4、QPS(Query Per Second)


    每秒查询数量(与吞吐量的含义相似)

  5、并发用户数


    同时承载正常使用系统功能的用户数量。



二十三: 提升系统并发能力的措施



  要提升系统的并发能力,理论上来讲,可以通过: 垂直拓展(Scale UP)和水平拓展(Scale OUT)两种方式。



一: 垂直拓展

  方式一: 可以提升机器的硬件性能,如四核cpu提升到8核cpu,添加固态硬盘等

  方式二: 提升系统的架构性能,如引入缓存减少IO次数,使用线程池和异步提高系统的吞吐量等

二: 水平拓展

  原因:


    无论进行哪一种方式的垂直拓展,当业务量和数据量到达一定量级后,单机的瓶颈还是会出现,此时,再使用垂直拓展对系统的性能并没有多大的效果,此时需要通过水平拓展,引入新的机器,来解决系统性能瓶颈问题。

  解决:


    当垂直拓展出现了单机性能瓶颈后,只需要引入新的机器,就能线性扩充系统性能,但是水平拓展对系统的架构也是存在要求的。

四: 面试题目大纲



   注意: 题目和面试材料会一直持续不断更新。

跳槽者、应届生必看JAVA面试题系列(三)_JAVA面试题_02



五: 总结



  由于文章篇幅的限制,面试大全的第三章暂时到这里就告一段落。如果有意见或者建议,可以在下方或者私信留言,看到会及时回复,也欢迎大家参加面试挑战和面试题投稿,希望大家早日获得心仪的Offer,

  面试大全系列文章会保持稳定的更新速度,大概每周两更到三更,感兴趣和可以关注我。



  如果想参加面试挑战,可以私信回复【面试挑战】即可,如果想进行面试题目投稿,可以私信回复【面试题目投稿】即可,如果想获取更多面试问题和资料,查看最新的面试题目更新进度,可以关注我,私信【面试资料】即可,谢谢大家的阅读和关注。