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

整理中....未整理完css

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

咱们要正确认识"笔试"的意图:即便作很差也不要紧,在以后的面试当中表现好也是有 机会的 。(我面试时历来没有作完过一套题,只是选择其中1-2道认真做答,而后手机百度试卷上其余不会的知识点可是不会再做答,只是掌握不会的知识点,不建议和我学哈)mysql

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

通常在程序员的垂直招聘网站投递便可,好比脉脉、BOSS直聘、拉勾等等。智联招聘啥的,不太适合我们程序员,你懂的。另外,因为本身不是大牛,因此若是有猎头勾搭的话,尽可能不去理会。因此尽可能仍是本身投简历比较靠谱,或者是内推nginx

 

分类面试笔试题  传送门程序员

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

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

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

基础题算法

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的,重点学习什么 
有关注哪些新的技术 
工做任务很是多很是杂时如何处理 
项目出现延迟如何处理 
和同事的设计思路不同怎么处理 
如何保证开发质量 
职业规划是什么?短时间,长期目标是什么 
团队的规划是什么 
能介绍下从工做到如今本身的成长在那里

 

1、

Java

基础(非

Jave

程序员可略过)

1. HashTable

HashMap

的区别

2. String和StringBuffer的区别

3.final,finally,finalize

的区别

4. static,final,const

的区别

2、基础知识

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

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

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.    网络通信中,端口有什么含义。端口的取值范围?