Java面试题以及答案精选(架构师面试题)

整理中....未整理完

大家好,本人面试基本 “笔试死”、问"基础死"、"Java常识死"那一类型的....面试的过程中也从曾经被“鄙视”过,被否定过,但是这些并不能否定我们的一个价值,笔试或者基础成为面试环节中的重要一环,为什么不整理一下,好好准备呢?

我们要正确认识"笔试"的意图:即使做不好也没关系,在之后的面试当中表现好也是有 机会的 。(我面试时从来没有做完过一套题,只是选择其中1-2道认真作答,然后手机百度试卷上其他不会的知识点但是不会再作答,只是掌握不会的知识点,不建议和我学哈)

这几天面试了众多公司,涉及BAT,涉及金融、电子商务、传统行业、互联网行业等,职位涉及Java高级工程师、架构师、技术经理等,特此整理一份比较全的面试题,供大家参考。(整理周期一周:截止2018年9月15日完)

一般在程序员的垂直招聘网站投递即可,比如脉脉、BOSS直聘、拉勾等等。智联招聘啥的,不太适合咱们程序员,你懂的。另外,由于自己不是大牛,所以如果有猎头勾搭的话,尽量不去理会。所以尽量还是自己投简历比较靠谱,或者是内推

 

分类面试笔试题  传送门

1、Java面试题以及答案精选(架构师面试题)-Spring专题

2、Java面试题以及答案精选(架构师面试题)-数据库专题

3、Java面试题以及答案精选(架构师面试题)-基础题1

基础题

100、hashset和hashmap的区别与联系

101. 类有哪基本特性?各特性的优点? 
解答:类具有抽象、封装性、继承性和多态性。 

抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象
封装性:类的封装性为类的成员提供公有、缺省、保护和私有等多级访问权限,目的是隐藏类中的私
有变量和类中方法的实现细节。 
继承性:类的继承性提供从已存在的类创建新类的机制,继承(inheritance)使一个新类自动拥有
被继承类(父类)的全部可继承的成员。 
多态性:类的多态性提供类中方法执行的多样性,多态性有两种表现形式:重载和覆盖。

102 .jsp 有哪些内置对象?作用分别是什么?(至少三个) 
解答: 
1)request 表示 HttpServletRequest 对象。它包含了有关浏览器请求的信息,并且提供了几个用于
获取 cookie, header 和 session 数据的有用的方法。 
2)response 表示 HttpServletResponse 对象,并提供了几个用于设置送回 浏览器的响应的方法(如
cookies,头信息等) 。 
3) out 对象是 javax.jsp.JspWriter 的一个实例, 并提供了几个方法使你能用于向浏览器回送输出结
果。 
4) pageContext 表示一个 javax.servlet.jsp.PageContext 对象。 它是用于方便存取各种范围的名字
空间、servlet 相关的对象的 API,并且包装了通用的 servlet 相关功能的方法。 
5)session 表示一个请求的 javax.servlet.http.HttpSession 对象。Session 可以存贮用户的状态
信息。 
6)application 表示一个 javax.servle.ServletContext 对象。这有助于查找有关 servlet 引擎和
servlet 环境的信息。 
7)config 表示一个 javax.servlet.ServletConfig 对象。该对象用于存取 servlet 实例的初始化参
数。 
8)page 表示从该页面产生的一个 servlet 实例。

103.说一说Servlet的生命周期?

答: Servlet生命周期分为三个阶段:

  1,初始化阶段  调用init()方法

  2,响应客户请求阶段  调用service()方法-àdoGet/doPost()

  3,终止阶段  调用destroy()方法

104.方法重载和方法重写的概念和区别(面试过程中别问到过)

方法重写(override):即方法覆盖。指的是父子类中方法的关系。父类A中有方法method1,在子类中想要使用method1这个方法签名而又要实现与父类method1方法不同的功能,这个时候就要用到方法重写。即子类使用父类的方法签名,但子类方法体与父类不同,实现的功能不同。(实现了父类方法内部逻辑,即覆盖,方法名称和参数保持一致)

方法重载(overload):同一个类中方法之间的关系。这里要弄清楚如何区别是两个方法签名是否同一个方法的签名。方法签名的区分规则:方法签名的区分是以方法的参数类型、排序与个数为标准的。如果两个方法签名有相同的参数类型、参数排序和参数个数,那么这两个方法使用的同一个签名。在同一个类中两个方法使用同一个方法签名会报错。而方法重载就是两个方法使用了相同的方法名而方法的参数不一致。(方法名称一致,但是参数类型和个数不一样)

105.线程的基本概念、线程的基本状态以及状态之间的关系

 

106.运行时异常与一般异常有何异同

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

107 说出ArrayList,Vector, LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

108.说出Servlet的生命周期,并说出Servlet和CGI的区别。

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

 

提升篇:

200.

sql使用建议及优化方法

https://blog.csdn.net/u010223407/article/details/50736810 

 

内存溢出常见情况和和处理方式?

 

解答:导致OutOfMemoryError异常的常见原因有以下几种:

  1. 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
  2. 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
  3. 代码中存在死循环或循环产生过多重复的对象实体;
  4. 使用的第三方软件中的BUG
  5. 启动参数内存值设定的过小;

此错误常见的错误提示:

  1. tomcat:java.lang.OutOfMemoryError: PermGen space
  2. tomcat:java.lang.OutOfMemoryError: Java heap space
  3. weblogic:Root cause of ServletException java.lang.OutOfMemoryError
  4. resin:java.lang.OutOfMemoryError
  5. java:java.lang.OutOfMemoryError

解决java.lang.OutOfMemoryError的方法有如下几种:

  • 增加jvm的内存大小。方法有: 1)在执行某个class文件时候,可以使用java -Xmx256M aa.class来设置运行aa.classjvm所允许占用的最大内存为256M 2)对tomcat容器,可以在启动时对jvm设置内存限度
  •  优化程序,释放垃圾。

主要包括避免死循环,应该及时释放种资源:内存, 数据库的各种连接,防止一次载入太多的数据。导致java.lang.OutOfMemoryError的根本原因是程序不健壮。因此,从根本上解决Java内存溢出的唯一方法就是修改程序,及时地释放没用的对象,释放内存空间。 遇到该错误的时候要仔细检查程序,嘿嘿,遇多一次这种问题之后,以后写程序就会小心多了

Java代码导致OutOfMemoryError错误的解决:

需要重点排查以下几点:

  1. 检查代码中是否有死循环或递归调用。
  2. 检查是否有大循环重复产生新对象实体。
  3. 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
  4. 检查ListMAP等集合对象是否有使用完后,未清除的问题。ListMAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

参考文章:http://outofmemory.cn/c/java-outOfMemoryError  

 

经常面试一些候选人,整理了下我面试使用的题目,陆陆续续整理出来的题目很多,所以每次会抽一部分来问。答案会在后面的文章中逐渐发布出来。 
基础题目

Java线程的状态 
进程和线程的区别,进程间如何通讯,线程间如何通讯 
HashMap的数据结构是什么?如何实现的。和HashTable,ConcurrentHashMap的区别 
Cookie和Session的区别 
索引有什么用?如何建索引? 
ArrayList是如何实现的,ArrayList和LinkedList的区别?ArrayList如何实现扩容。 
equals方法实现 
面向对象 
线程状态,BLOCKED和WAITING有什么区别 
JVM如何加载字节码文件 
JVM GC,GC算法。 
什么情况会出现Full GC,什么情况会出现yong GC。 
JVM内存模型 
Java运行时数据区 
事务的实现原理 
技术深度

有没有看过JDK源码,看过的类实现原理是什么。 
HTTP协议 
TCP协议 
一致性Hash算法 
JVM如何加载字节码文件 
类加载器如何卸载字节码 
IO和NIO的区别,NIO优点 
Java线程池的实现原理,keepAliveTime等参数的作用。 
HTTP连接池实现原理 
数据库连接池实现原理 
数据库的实现原理 
技术框架

看过哪些开源框架的源码 
为什么要用Redis,Redis有哪些优缺点?Redis如何实现扩容? 
Netty是如何使用线程池的,为什么这么使用 
为什么要使用Spring,Spring的优缺点有哪些 
Spring的IOC容器初始化流程 
Spring的IOC容器实现原理,为什么可以通过byName和ByType找到Bean 
Spring AOP实现原理 
消息中间件是如何实现的,技术难点有哪些 
系统架构

如何搭建一个高可用系统 
哪些设计模式可以增加系统的可扩展性 
介绍设计模式,如模板模式,命令模式,策略模式,适配器模式、桥接模式、装饰模式,观察者模式,状态模式,访问者模式。 
抽象能力,怎么提高研发效率。 
什么是高内聚低耦合,请举例子如何实现 
什么情况用接口,什么情况用消息 
如果AB两个系统互相依赖,如何解除依赖 
如何写一篇设计文档,目录是什么 
什么场景应该拆分系统,什么场景应该合并系统 
系统和模块的区别,分别在什么场景下使用 
分布式系统

分布式事务,两阶段提交。 
如何实现分布式锁 
如何实现分布式Session 
如何保证消息的一致性 
负载均衡 
正向代理(客户端代理)和反向代理(服务器端代理) 
CDN实现原理 
怎么提升系统的QPS和吞吐量 
实战能力

有没有处理过线上问题?出现内存泄露,CPU利用率标高,应用无响应时如何处理的。 
开发中有没有遇到什么技术问题?如何解决的 
如果有几十亿的白名单,每天白天需要高并发查询,晚上需要更新一次,如何设计这个功能。 
新浪微博是如何实现把微博推给订阅者 
Google是如何在一秒内把搜索结果返回给用户的。 
12306网站的订票系统如何实现,如何保证不会票不被超卖。 
如何实现一个秒杀系统,保证只有几位用户能买到某件商品。 
软能力

如何学习一项新技术,比如如何学习Java的,重点学习什么 
有关注哪些新的技术 
工作任务非常多非常杂时如何处理 
项目出现延迟如何处理 
和同事的设计思路不一样怎么处理 
如何保证开发质量 
职业规划是什么?短期,长期目标是什么 
团队的规划是什么 
能介绍下从工作到现在自己的成长在那里

 

一、

Java

基础(非

Jave

程序员可略过)

1. HashTable

HashMap

的区别

2. String和StringBuffer的区别

3.final,finally,finalize

的区别

4. static,final,const

的区别

二、基础知识

派生子进程的系统凋用是什么?

如何使某进程使用某个固定的

cpu?

进程、线程、协程的区别是什么?

简単解释什么是死锁?

进程间通信有几种方法?

简述tcp/udp的逐别

简述tcp三次握手

 

架构题

300:说明反转控制(IOC)和面向方向编程(AOP)在 spring 中的应用 
解答:Spring 核心容器(Core)提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,
它是工厂模式的实现。BeanFactory 使用控制反转(Ioc)模式将应用程序的配置和依赖性规范与实际
的应用代码程序分开。Spring 的声明式事务基于 AOP 实现,却并不需要程序开发者成为 AOP 专家,亦
可轻易使用 Spring 的声明式事务管理。 

 

301:HashMap和Hashtable的区别.以及HashMap底层实现原理,线程安全新增一个类是XXX

这个道题被许多公司问到过,希望大家重视起来,熟练的掌握。(未整理完)

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都实现了Map接口。主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上高于Hashtable,

HashMap允许将null作为一个entry的key或者value,Hashtable不允许。HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人产生误解。

Hashtable继承自Dictionary类, 而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供同步

 

302.abstract class 和 interface 有什么区别

 

303.Arraylist,Vector,LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。

Vector由于用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,序号索引数据需要进行前向或后台遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快

304 .JVM相关(重点!架构师必问)

 

305.并发包&并发变成&多线程&线程池(高开&架构师必须会)

 

306.AOP &IOC&事务&Spring源码

IoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。

 Spring AOP面向方面编程原理:AOP概念(1)AOP(Aspect Oriented Programming),也就是面向方面编程的技术。AOP基于IoC基础,是对OOP的有益补充。

AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的方面Crosscutting enterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等。

AOP正在成为软件开发的下一个光环。使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。

Spring framework是很有前途的AOP技术。作为一种非侵略性的、轻型的AOP framework,你无需使用预编译器或其他的元标签,便可以在Java程序中使用它。这意味着开发团队里只需一人要对付AOP framework,其他人还是像往常一样编程。
 

spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。

围绕Poxy的动态代理 能够自动的提交和回滚事务
org.springframework.transaction.interceptor.TransactionProxyFactoryBean

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 

PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 

PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 

PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 

PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 

PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。 

PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

307.注解方式,注解相关

 

308.分布式事务(架构师必考)

最终一致性

309.dubbo相关

10层

 

310.solr&es

变慢原因:solr 建立索引 IO阻塞

 

311 CAP&base

 

312.设计模式

单例,工厂,观察者,等等

 

313.排序常用方法(sort,compareXXX)

 

 

 

JAVA架构师的水准:

既然java架构师,首先你要是一个高级java攻城尸,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池…:;java反射技术,写框架必备的技术,但是有严重的性能问题,替代方案java字节码技术;nio,没什么好说的,值得注意的是”直接内存”的特点,使用场景;java多线程同步异步;java各种集合对象的实现原理,了解这些可以让你在解决问题时选择合适的数据结构,高效的解决问题,比如hashmap的实现原理,好多五年以上经验的人都弄不清楚,还有为什扩容时有性能问题?不弄清楚这些原理,就写不出高效的代码,还会认为自己做的很对;总之一句话越基础的东西越重要,很多人认为自己会用它们写代码了,其实仅仅是知道如何调用api而已,离会用还差的远。 
熟练使用各种数据结构和算法,数组、哈希、链表、排序树…,一句话要么是时间换空间要么是空间换时间,这里展开可以说一大堆,需要有一定的应用经验,用于解决各种性能或业务上的问题;有时间再补充。 
熟练使用linux操作系统,必备,没什么好说的 。 
熟悉tcp协议,创建连接三次握手和断开连接四次握手的整个过程,不了解的话,无法对高并发网络应用做优化; 熟悉http协议,尤其是http头,我发现好多工作五年以上的都弄不清session和cookie的生命周期以及它们之间的关联。 
系统集群、负载均衡、反向代理、动静分离,网站静态化 。 
分布式存储系统nfs,fastdfs,tfs,Hadoop了解他们的优缺点,适用场景 。 
分布式缓存技术memcached,redis,提高系统性能必备,一句话,把硬盘上的内容放到内存里来提速,顺便提个算法一致性hash 。 
工具nginx必备技能超级好用,高性能,基本不会挂掉的服务器,功能多多,解决各种问题。 
数据库的设计能力,mysql必备,最基础的数据库工具,免费好用,对它基本的参数优化,慢查询日志分析,主从复制的配置,至少要成为半个mysql dba。其他nosql数据库如mongodb。 
还有队列中间件。如消息推送,可以先把消息写入数据库,推送放队列服务器上,由推送服务器去队列获取处理,这样就可以将消息放数据库和队列里后直接给用户反馈,推送过程则由推送服务器和队列服务器完成,好处异步处理、缓解服务器压力,解藕系统。 
以上纯粹是常用的技术,还有很多自己慢慢去摸索吧;因为要知道的东西很多,所以要成为一名合格的架构师,必须要有强大的自学能力,没有人会手把手的教给你所有的东西。 
想成为架构师不是懂了一大堆技术就可以了,这些是解决问题的基础、是工具,不懂这些怎么去提解决方案呢?这是成为架构师的必要条件。 
架构师还要针对业务特点、系统的性能要求提出能解决问题成本最低的设计方案才合格,人家一个几百人用户的系统,访问量不大,数据量小,你给人家上集群、上分布式存储、上高端服务器,为了架构而架构,这是最扯淡的,架构师的作用就是第一满足业务需求,第二最低的硬件网络成本和技术维护成本。 
架构师还要根据业务发展阶段,提前预见发展到下一个阶段系统架构的解决方案,并且设计当前架构时将架构的升级扩展考虑进去,做到易于升级;否则等系统瓶颈来了,出问题了再去出方案,或现有架构无法扩展直接扔掉重做,或扩展麻烦问题一大堆,这会对企业造成损失。

面试题:

1.HttpservletResponse的sendError方法的作用
2.什么情况下使用URL重写
3.doGet和doPost在什么时候调用?区别?
4.response对象的作用
5.jsp中import指令的作用

1.    网络通讯中,端口有什么含义。端口的取值范围?
2.    jsp是如何被容器调用和执行的?
3.    编写一个servlet的步骤。
4.    为什么要为servlet配置URL映射
5.    谈谈servlet的生命周期

21.    说出3个常见协议的默认端口。
22.    socket是什么,它有什么作用?
23.    TCP/IP通讯的基本步骤是什么?
24.    UDP通讯的基本步骤是什么?
25.    JDBC访问数据库的基本步骤是什么(手写)?
26.    说说preparedStatement和Statement的区别
27.    说说事务的概念,在JDBC编程中处理事务的步骤。
28.    数据库连接池的原理。为什么要使用连接池。
29.    servlet和jsp有什么关系?
30.    编写一个servlet的步骤。
 

1.    css和div 开发的优势?
优点:1)div+css,这个布局中,div承载的是内容,而css承载的是样式。内容和样式的分离。
2)搜索引擎亲和力(快速找到需要的数据,而不是像在table中一层层的查找) 重构页面的方便性(换皮肤如blog)
   缺点:开发效率低
2.    谈谈页面间的参数传递有哪些方式 ?
通过请求作用域request,session,通过内部转发携带参数,在jsp页面中使用<jsp:forward /> <jsp:param />
3.    hidden表单域有什么作用?
    用来记录一些用户不需要关心,但你程序需要关心的东西比如某条数据的主键值. 
暂时隐藏某个表单字段可以让你的表单变的简洁
4.    jsp有哪些内置对象?
Page,request,session,application,exception,config,pageContext,out,
5.    request的作用有哪些?
获取客户端传递的参数值
获取客户端请求头信息
获取会话
获取转发对象
获取servletContext对象
6.    session有什么作用。
Session对象类似于一个容器,可以存放任何对象,以供不同页面间共享数据
Session是记录客户端的状态信息,它是针对http协议的无状态连接的特性而提供的解决方案。
7.     application有什么作用。
取得保存的一些全局性的对象信息。
8.    在jsp中怎样操作page作用域
特定于 JSP 的一个类型,代表当前的 JSP 页面。pageContext.setAttribute();
9.    jsp有哪些动作?作用分别是什么?
<jsp:include /> <jsp:forward /> <jsp:usebean /> <jsp:setProperty /> <jsp:getProperty />
<jsp:param /> 
10.    java servlet api中forward() 与redirect()的区别?
1.    forward客户端请求服务器一次,redirect请求服务器两次
2.    forward由request对象发出,而redirect由response对象发起
3.      对于页面跳转来说,forward请求在URL地址栏会显示SERVLET的地址,而redirect显示的是重定向后页面的地址
4。     由于redirect()是2次请求,因此不能使用request作用域来保存信息
 

1.    class.forname的作用?为什么要用?
2.    在oracle大数据量下的分页解决方法?
3.    mySQl的分页是怎么实现的?
4.    cookie被禁止后怎样使用session?
5.    项目开发经历了哪几个阶段?
6.    谈谈项目的体系统架构:(客户层,表示层)web层,业务层,数据层?
7.    J2EE规范中的组件技术在项目中用到了哪些?
8.    TCP/IP通讯和UDP通迅的区别?
9.    浏览器和WEB服务器是用什么协议通迅的?
10.    网络通讯中,端口有什么含义。端口的取值范围?
 

 

 

版权声明:程序员胖胖胖虎阿 发表于 2022年9月25日 下午3:16。
转载请注明:Java面试题以及答案精选(架构师面试题) | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...