JAVA工程师面试常见问题集锦

集锦一: html

1、面试题基础总结

一、 JVM结构原理、GC工做机制详解java

答:具体参照:JVM结构、GC工做机制详解     ,说到GC,记住两点:一、GC是负责回收全部无任何引用对象的内存空间。 注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象自己,二、GC回收机制的两种算法,a、引用计数法  b、可达性分析算法(  这里的可达性,你们能够看基础2 Java对象的什么周期),至于更详细的GC算法介绍,你们能够参考:Java GC机制算法mysql

二、Java对象的生命周期linux

答:建立阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间从新分配阶段等等,具体参照:Java 对象的生命周期nginx

三、Map或者HashMap的存储原理web

答:HashMap是由数组+链表的一个结构组成,具体参照:HashMap的实现原理面试

四、当数据表中A、B字段作了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)redis

答:看A、B两字段作组合索引的时候,谁在前面,谁在后面,若是A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,若是只是使用前面%,那么有索引效果,若是使用双%号匹配,那么则无索引效果算法

五、数据库存储日期格式时,如何考虑时区转换问题?spring

答:使用TimeStamp ,  缘由参照:Java编程中遇到的时区转换问题

六、Java Object类中有哪些方法?

答:Object有哪些方法

七、HTTP协议,GET和POST 的区别

答:浅谈HTTP中GET和POST的区别

2、线程、设计模式、缓存方面

一、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢

答:关于SimpleDateFormat安全的时间格式化线程安全问题

二、如何看待设计模式,并简单说说你对观察者模式的理解

答:一、设计模式有神马用     二、观察者模式类图及实现

三、集群环境中,session如何实现共享

答:

一、Java集群之session共享    

二、session多服务器共享方案,还有一种方案就是使用一个固定的服务器专门保持session,其余服务器共享

四、分布式、集群环境中,缓存如何刷新,如何保持同步?

答:

A、缓存如何刷新? 一、定时刷新  二、主动刷新覆盖   ,每一个缓存框架都有自带的刷新机制,或者说缓存失效机制,就拿Redis和 Ehcache举例, 他们都有自带的过时机制,另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖便可

B、缓存如何保持同步?  这个redis有自带的集群同步机制,即复制功能,具体参考:基于Redis分布式缓存实现      ,Ehcache也有分布式缓存同步的配置,只须要配置不一样服务器地址便可,参照:Ehcache分布式缓存同步

五、一条sql执行过长的时间,你如何优化,从哪些方面?

答:

一、查看sql是否涉及多表的联表或者子查询,若是有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)

二、涉及链表的查询,是否能进行分表查询,单表查询以后的结果进行字段整合

三、若是以上两种都不能操做,非要链表查询,那么考虑对相对应的查询条件作索引。加快查询速度

四、针对数量大的表进行历史表分离(如交易流水表)

五、数据库主从分离,读写分离,下降读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步

六、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等

七、查看mysql执行日志,看看是否有其余方面的问题

我的理解:从根本上来讲,查询慢是占用mysql内存比较多,那么能够从这方面去酌手考虑

3、三大框架方面问题

一、Spring 事务的隔离性,并说说每一个隔离性的区别

解答: Spring事务详解

二、Spring事务的传播行为,并说说每一个传播行为的区别

解答: Spring事务详解

三、hibernate跟Mybatis/ ibatis 的区别,为何选择?

解答: Hibernate与Mybatis的比较

四、Struts跟Spring mvc的优缺点,让你选会如何选

解答: Spring MVC 与 Struts的区别

五、简单说说Spring 事务机制

解答: Spring事务机制

六、Spring 4.0新特性

解答: Spring4新特性

4、负载均衡、集群相关

一、weblogic 负载均衡的原理和集群的配置

解答: a、WEBLOGIC负载均衡原理     b、负载均衡和集群的配置(参考)

二、Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享 

解答: 配置参考

三、nginx配置文件详解——nginx.conf

解答: Nginx配置文件详细说明

5、项目优化相关

一、web如何项目优化

解答:这个我整理过一次, web项目性能优化(整理)

二、单例模式有几种? 如何优化?

解答: 单例模式的7中用法

三、简单说说线程池的原理和实现

解答: 线程原理及实现

6、并发和安全方面

一、项目并发如何处理?(咱们是web项目)

解答: 高并发量网站解决方案,另外,还有数据库乐观锁,数据库读写分离、使用消息队列、多用存储过程等等

二、简单说说功能权限存在的水平权限漏洞和垂直权限漏洞的场景和解决办法(由于咱们目前权限级别就是功能权限)

解答:
A、水平权限漏洞,以下图

假设机构有 用户A和用户B 两个用户,其中A有一、2和3权限 ,  用户B有 2 和3 的权限,这时候假设用户B 知道1,并给本身添加1的权限,这时候就是水平权限漏洞。
目前解决办法:一、限制入口,让用户B没法编辑本身的权限   二、对用户B没法进行向上扩展。最根本的解决办法是深刻到数据权限
解答: 水平权限漏洞和解决办法

B、垂直权限漏洞
解答: 垂直权限漏洞案例和解决方案

三、平台上的图片如何防盗链

解答: http下载防盗链原理:http协议的字段referer记录来实现

四、如何区分上传的图片是否是木马?

解答:一、看上传的图片后缀  二、如何后缀是篡改的,那么每一个文件有个魔术数字   文件上传-魔术数字

五、消息队列的原理和实现

解答: 一、消息队列原理     二、 深刻浅出 消息队列 ActiveMQ

7、数据库方面

一、mysql查询字段区不区分大小写?

解答:不区分,哪怕值也不区分(我当时还反问了,区不区分大小的应用含义有哪些,面试官没说得出来)

二、简单说说数据库集群和负载均衡、分布式(我不懂这块)

解答: 数据库负载均衡和集群参考 , 参考2

三、存储过程的结构和优势

解答: 大概结构  
存储过程的优缺点

四、触发器的原理和做用

解答: 参考

8、Java底层基础题

一、SpringMVC的原理以及返回数据如何渲染到jsp/html上?

答:Spring MVC的核心就是 DispatcherServlet , 一个请求通过 DispatcherServlet ,转发给HandlerMapping ,而后经反射,对应 Controller及其里面方法的@RequestMapping地址,最后经ModelAndView和ViewResoler返回给对应视图  。  具体可参考:Spring MVC的工做原理

二、一个类对象属性发生改变时,如何让调用者知道?

答:Java event时间监听  ,即在set方法改变属性时,触发 ,这种模式也能够理解为观察者模式,具体查看:观察者模式简单案例和说明

三、重写equals为什么要重写hashCode?

答:判断两个对象是否相等,比较的就是其hashCode, 若是你重载了equals,好比说是基于对象的内容实现的,而保留hashCode的实现不变,那么极可能某两个对象明明是“相等”,而hashCode却不同。  hashcode不同,就没法认定两个对象相等了

四、谈谈你对JVM的理解?

答: Java语言的一个很是重要的特色就是与平台的无关性。而使用Java虚拟机是实现这一特色的关键。Java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,经过JVM将每一条指令翻译成不一样平台机器码,经过特定平台运行。

JVM执行程序的过程 :I.加载。class文件   ,II.管理并分配内存  ,III.执行垃圾收集

JRE(java运行时环境)由JVM构造的java程序的运行环境 

 

具体详情:JVM原理和调优

五、Mysql的事物隔离级别?

答:Mysql的事物隔离级别 其实跟 Spring的事物隔离级别同样,都是一、Read Uncommitted(读取未提交内容), 二、Read Committed(读取提交内容),三、Repeatable Read(可重读),四、Serializable(可串行化)    具体参照:mysql事物隔离级别

六、Spring的原理

答:Spring的核心是IOC和AOP  ,IOC是依赖注入和控制反转, 其注入方式可分为set注入、构造器注入、接口注入等等。IOC就是一个容器,负责实例化、定位、配置应用程序中的对象及创建这些对象间的依赖。简单理解就是:JAVA每一个业务逻辑处理至少须要两个或者以上的对象协做进行工做,可是每一个对象在使用它的合做对象的时候,都须要频繁的new 对象来实现,你就会发现,对象间的耦合度高了。而IOC的思想是:Spring容器来管理这些,对象只须要处理自己业务关系就行了。至于什么是控制反转,就是得到依赖对象的方式反转了。
AOP呢,面向切面编程,最直接的体现就是Spring事物管理。至于Spring事物的相关资料,就不细说了,参考:Spring注解式事物管理

七、谈谈你对NIO的理解

答:IO是面向流,NIO是面向缓冲 ,这里不细讲了,具体参照:Java NIO和IO的区别

八、ArrayList和LinkedList、Vector的区别?

答:总得来讲能够理解为:.

     1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
     2.对于随机访问get和set,ArrayList以为优于LinkedList,由于LinkedList要移动指针。 
     3.对于新增和删除操做add和remove,LinedList比较占优点,由于ArrayList要移动数据

Vector和ArrayList相似,但属于强同步类,即线程安全的,具体比较参照:比较ArrayList、LinkedList、Vector

九、随便说说几个单例模式,并选择一种线程安全的

答:单例的类别:懒汉、饿汉、枚举、静态内部类、双重校验锁 等等 , 选择线程安全我选最后一种,双重校验锁。  具体实现方式参照:Java:单例模式的七种写法

十、谈谈红黑树

答:算法和数据结构一直是我薄弱之处,这方面说本身补吧,成效不大,这里我就推荐一个:红黑树

十一、举例说说几个排序,并说明其排序原理

答:这里我就不细说了,你们本身看看 Java实现几种常见的排序算法

十二、Mysql索引的原理

答:索引的做用你们都知道,就是加快查询速度,可是原理,我说不上来,这里直接看吧:Mysql索引工做原理

1三、序列化的原理和做用

答:Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程,主要用于HTTP或者WebService接口传输过程当中对象参数的传播,具体可参看:Java序列化机制和原理

9、并发及项目调优

一、说说线程安全的几种实现方式?

答:什么是线程安全? 个人理解是这样的,一个对象被多个线程同时访问,还能保持其内部属性的顺序性及同步性,则认定为线程安全。实现线程安全的三种方式:被volatile、synchronized等关键字修饰,或者使用java.util.concurrent下面的类库。  至于前二者的关系,参考:synchronized和volatile的用法区别

二、方法内部,如何实现更好的异步?

答:咱们知道异步其实就是让另外一个线程去跑,那么如何建立线程?  第一种直接new Thread ,第二种new 一个实现Runnable接口的实现类。 第三种,经过线程池来管理建立等 ,这里说到更好的实现异步,那就是说咱们在方法内部避免频繁的new 线程,就能够考虑线程池了。 那么线程池如何建立? 这里能够new 一个线程池,可是须要考虑单例,或者在程序初始启东时,就建立一个线程池,让他跑着,而后在具体方法的时候,经过线程池来建立线程,实现异步

三、项目中为什么要用缓存?如何理解nginx + tomcat + redis 集群缓存?

答1:最直接的表现就是减轻数据库的压力。避免由于数据读取频繁或过大而影响数据库性能,下降程序宕机的可能性

答2:nginx经常使用作静态内容服务和代理服务器,直面外来请求转发给后面的应用服务。nginx自己也能作缓存,好比静态页面的缓存什么的。而tomcat是应用服务器,处理JAVA WEB程序功能等等 。你也能够这么理解,假设把用户的请求当作是一条河流,那么nginx就至关于一个水利工程,tomcat至关于一条条分流的支流,而redis 至关于支流旁边的一个个水库。 当你洪水来了,nginx根据你每条支流的承受力度分发不一样的水流量,在确保程序正常运行的状况下,分发给每条支流(tomcat)不一样的水流量。而redis至关于一个个支流的水库,存储水源,下降压力,让后面的水量平稳。

四、平常项目中,若是你接手,你准备从哪些方面调优?

答:这个呢首先是了解哪些须要优化,须要优化确定是项目性能遭遇瓶颈或者猜想即将遭遇了,咱们才会去考虑优化。那么怎么优化?

a、扩容 ,扩容的理解,就是扩充服务器并行处理的能力,简单来讲就是加服务器,增长处理请求的能力,例如增长nginx 、tomcat等应用服务器的个数,或者物理服务器的个数,还有加大服务器带宽等等,这里考虑的是硬件方面

b、调优 ,调优,包括系统调优和代码调优 。 系统调优就是说加快处理速度,好比咱们所提到的CDN、ehcache、redis等缓存技术,消息队列等等,加快服务间的响应速度,增长系统吞吐量,避免并发,至于代码调优,这些就须要多积累了,好比重构、工厂等, 数据库调优的话这个我不是很懂,只知道索引和存储过程,具体参考:Mysql数据库调优21个最佳实践  ,其余数据库调优方面就各位本身找找吧

五、谈谈你对分布式的理解

答:我的理解:分布式就是把一个系统/业务 拆分红多个子系统/子业务 去协同处理,这个过程就叫分布式,具体的演变方式参考:Java分布式应用技术架构介绍

六、Redis实现消息队列

答:Redis实现消息队列     、参考2

七、另总结多线程相关面试题50道

八、分享一个调优工具和方案:如何利用 JConsole观察分析Java程序的运行,进行排错调优

10、手写代码题(包含sql题)

一、假设商户表A(id , city )  ,交易流水表B (aid, amount , time)   这里的time表明交易时间,  请用sql写出查询每一个城市每月的销售业绩(答案可在评论里回复)

二、假设有一个数组 A ,int[] A = { 1 , 3 , -1 ,0 , 2 , 1 , -4 , 2 , 0 ,1 ...  N};   原来是须要查出大于0的数组,可是因为传参错误或者其余缘由,致使查出0和负数了,如今要求在不使用新数组和新集合的状况下(即只使用这个A数组,因数组数据比较大,且只能用一次循环) 实现正数放到数组的前面,小于等于0的数放到数组的末尾(答案可在评论里回复)

11、设计方案相关

面试还会问到一些关于设计方案相关的问题,好比

一、你的接口服务数据被人截包了,你如何防止数据恶意提交?

答:咱们能够在接口传输参数里面设置一个业务编号,这个编号用来区分是否重复提交。这样即便数据被抓包了,对方也没法区分每一个字段你的含义,这时,这个业务编号的做用就来了

二、假设服务器常常宕机,你从哪些方面去排查问题?

答:这个就留个各位看官补充了,可评论回复

 

集锦二:

1、Java基础

1. String类为何是final的。

2. HashMap的源码,实现原理,底层结构。

3. 说说你知道的几个Java集合类:list、set、queue、map实现类咯。。。

4. 描述一下ArrayList和LinkedList各自实现和区别

5. Java中的队列都有哪些,有什么区别。

6. 反射中,Class.forName和classloader的区别

7. Java七、Java8的新特性(baidu问的,好BT)

8. Java数组和链表两种结构的操做效率,在哪些状况下(从开头开始,从结尾开始,从中间开始),哪些操做(插入,查找,删除)的效率高

9. Java内存泄露的问题调查定位:jmap,jstack的使用等等

10. string、stringbuilder、stringbuffer区别

11. hashtable和hashmap的区别

13 .异常的结构,运行时异常和非运行时异常,各举个例子

14. String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他们之间用 == 比较的结果

15. String 类的经常使用方法

16. Java 的引用类型有哪几种

17. 抽象类和接口的区别

18. java的基础类型和字节大小。

19. Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题(建议熟悉 jdk 源码,才能从容应答)

20. 若是不让你用Java Jdk提供的工具,你本身实现一个Map,你怎么作。说了很久,说了HashMap源代码,若是我作,就会借鉴HashMap的原理,说了一通HashMap实现

21. Hash冲突怎么办?哪些解决散列冲突的方法?

22. HashMap冲突很厉害,最差性能,你会怎么解决?从O(n)提高到log(n)咯,用二叉排序树的思路说了一通

23. rehash

24. hashCode() 与 equals() 生成算法、方法怎么重写

2、Java IO

1. 讲讲IO里面的常见类,字节流、字符流、接口、实现类、方法阻塞。

2. 讲讲NIO。

3. String 编码UTF-8 和GBK的区别?

4. 何时使用字节流、何时使用字符流?

5. 递归读取文件夹下的文件,代码怎么实现

3、Java Web

1. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。

2. servlet的一些相关问题

3. webservice相关问题

4. jdbc链接,forname方式的步骤,怎么声明使用一个事务。举例并具体代码

5. 无框架下配置web.xml的主要配置内容

6. jsp和servlet的区别

4、JVM

1. Java的内存模型以及GC算法

2. jvm性能调优都作了什么

3. 介绍JVM中7个区域,而后把每一个区域可能形成内存的溢出的状况说明

4. 介绍GC 和GC Root不正常引用。

5. 本身从classload 加载方式,加载机制说开去,从程序运行时数据区,讲到内存分配,讲到String常量池,讲到JVM垃圾回收机制,算法,hotspot。反正就是各类扩展

6. jvm 如何分配直接内存, new 对象如何不分配在堆而是栈上,常量池解析

7. 数组多大放在 JVM 老年代(不仅是设置 PretenureSizeThreshold ,问一般多大,没作过一问便知)

8. 老年代中数组的访问方式

9. GC 算法,永久代对象如何 GC , GC 有环怎么处理

10. 谁会被 GC ,何时 GC

11. 若是想不被 GC 怎么办

12. 若是想在 GC 中生存 1 次怎么办

5、开源框架

1. hibernate和ibatis的区别

2. 讲讲mybatis的链接池。

3. spring框架中须要引用哪些jar包,以及这些jar包的用途

4. springMVC的原理

5. springMVC注解的意思

6. spring中beanFactory和ApplicationContext的联系和区别

7. spring注入的几种方式(循环注入)

8. spring如何实现事物管理的

9. springIOC

10. spring AOP的原理

11. hibernate中的1级和2级缓存的使用方式以及区别原理(Lazy-Load的理解)

12. Hibernate的原理体系架构,五大核心接口,Hibernate对象的三种状态转换,事务管理。

6、多线程

1. Java建立线程以后,直接调用start()方法和run()的区别

2. 经常使用的线程池模式以及不一样线程池的使用场景

3. newFixedThreadPool此种线程池若是线程数达到最大值后会怎么办,底层原理。

4. 多线程之间通讯的同步问题,synchronized锁的是对象,衍伸出和synchronized相关不少的具体问题,例如同一个类不一样方法都有synchronized锁,一个对象是否能够同时访问。或者一个类的static构造方法加上synchronized以后的锁的影响。

5. 了解可重入锁的含义,以及ReentrantLock 和synchronized的区别

6. 同步的数据结构,例如concurrentHashMap的源码理解以及内部实现原理,为何他是同步的且效率高

7. atomicinteger和Volatile等线程安全操做的关键字的理解和使用

8. 线程间通讯,wait和notify

9. 定时线程的使用

10. 场景:在一个主线程中,要求有大量(不少不少)子线程执行完以后,主线程才执行完成。多种方式,考虑效率。

11. 进程和线程的区别

12. 什么叫线程安全?举例说明

13. 线程的几种状态

14. 并发、同步的接口或方法

15. HashMap 是否线程安全,为什么不安全。 ConcurrentHashMap,线程安全,为什么安全。底层实现是怎么样的。

16. J.U.C下的常见类的使用。 ThreadPool的深刻考察; BlockingQueue的使用。(take,poll的区别,put,offer的区别);原子类的实现。

17. 简单介绍下多线程的状况,从创建一个线程开始。而后怎么控制同步过程,多线程经常使用的方法和结构

18. volatile的理解

19. 实现多线程有几种方式,多线程同步怎么作,说说几个线程里经常使用的方法

7、网络通讯

1. http是无状态通讯,http的请求方式有哪些,能够本身定义新的请求方式么。

2. socket通讯,以及长链接,分包,链接异常断开的处理。

3. socket通讯模型的使用,AIO和NIO。

4. socket框架netty的使用,以及NIO的实现原理,为何是异步非阻塞。

5. 同步和异步,阻塞和非阻塞。

6. OSI七层模型,包括TCP,IP的一些基本知识

7. http中,get post的区别

8. 说说http,tcp,udp之间关系和区别。

9. 说说浏览器访问www.taobao.com,经历了怎样的过程。

10. HTTP协议、  HTTPS协议,SSL协议及完整交互过程;

11. tcp的拥塞,快回传,ip的报文丢弃

12. https处理的一个过程,对称加密和非对称加密

13. head各个特色和区别

14. 说说浏览器访问www.taobao.com,经历了怎样的过程。

8、数据库MySql

1. MySql的存储引擎的不一样

2. 单个索引、联合索引、主键索引

3. Mysql怎么分表,以及分表后若是想按条件分页查询怎么办(若是不是按分表字段来查询的话,几乎效率低下,无解)

4. 分表以后想让一个id多个表是自增的,效率实现

5. MySql的主从实时备份同步的配置,以及原理(从库读主库的binlog),读写分离

6. 写SQL语句。。。

7. 索引的数据结构,B+树

8. 事务的四个特性,以及各自的特色(原子、隔离)等等,项目怎么解决这些问题

9. 数据库的锁:行锁,表锁;乐观锁,悲观锁

10. 数据库事务的几种粒度;

11. 关系型和非关系型数据库区别

9、设计模式

1. 单例模式:饱汉、饿汉。以及饿汉中的延迟加载,双重检查

2. 工厂模式、装饰者模式、观察者模式。

3. 工厂方法模式的优势(低耦合、高内聚,开放封闭原则)

10、算法

1. 使用随机算法产生一个数,要求把1-1000W之间这些数所有生成。(考察高效率,解决产生冲突的问题)

2. 两个有序数组的合并排序

3. 一个数组的倒序

4. 计算一个正整数的正平方根

5. 说白了就是常见的那些查找、排序算法以及各自的时间复杂度

6. 二叉树的遍历算法

7. DFS,BFS算法

9. 比较重要的数据结构,如链表,队列,栈的基本理解及大体实现。

10. 排序算法与时空复杂度(快排为何不稳定,为何你的项目还在用)

11. 逆波兰计算器

12. Hoffman 编码

13. 查找树与红黑树

11、并发与性能调优

1. 有个每秒钟5k个请求,查询手机号所属地的笔试题(记得不完整,没列出),如何设计算法?请求再多,好比5w,如何设计整个系统?

2. 高并发状况下,咱们系统是如何支撑大量的请求的

3. 集群如何同步会话状态

4. 负载均衡的原理

5 .若是有一个特别大的访问量,到数据库上,怎么作优化(DB设计,DBIO,SQL优化,Java优化)

6. 若是出现大面积并发,在不增长服务器的基础上,如何解决服务器响应不及时问题“。

7. 假如你的项目出现性能瓶颈了,你以为可能会是哪些方面,怎么解决问题。

8. 如何查找 形成 性能瓶颈出现的位置,是哪一个位置照成性能瓶颈。

9. 你的项目中使用过缓存机制吗?有没用用户非本地缓存

12、其余

1.经常使用的linux下的命令