1、面试题基础总结
一、 JVM结构原理、GC工做机制详解java
答:具体参照:JVM结构、GC工做机制详解 ,说到GC,记住两点:一、GC是负责回收全部无任何引用对象的内存空间。 注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象自己,二、GC回收机制的两种算法,a、引用计数法 b、可达性分析算法( 这里的可达性,你们能够看基础2 Java对象的什么周期),至于更详细的GC算法介绍,你们能够参考:Java GC机制算法mysql
二、Java对象的生命周期nginx
答:建立阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间从新分配阶段等等,具体参照:Java 对象的生命周期web
三、Map或者HashMap的存储原理面试
答:HashMap是由数组+链表的一个结构组成,具体参照:HashMap的实现原理redis
四、当数据表中A、B字段作了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)算法
答:看A、B两字段作组合索引的时候,谁在前面,谁在后面,若是A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,若是只是使用前面%,那么有索引效果,若是使用双%号匹配,那么则无索引效果sql
五、数据库存储日期格式时,如何考虑时区转换问题?数据库
答:使用TimeStamp , 缘由参照:Java编程中遇到的时区转换问题
六、Java Object类中有哪些方法?
七、HTTP协议,GET和POST 的区别
2、线程、设计模式、缓存方面
一、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢
答:关于SimpleDateFormat安全的时间格式化线程安全问题
二、如何看待设计模式,并简单说说你对观察者模式的理解
三、集群环境中,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记录来实现四、如何区分上传的图片是否是木马?
解答:一、看上传的图片后缀 二、如何后缀是篡改的,那么每一个文件有个魔术数字 文件上传-魔术数字五、消息队列的原理和实现
解答: 一、消息队列原理 二、 深刻浅出 消息队列 ActiveMQ7、数据库方面
一、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
八、分享一个调优工具和方案:如何利用 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、设计方案相关
面试还会问到一些关于设计方案相关的问题,好比
一、你的接口服务数据被人截包了,你如何防止数据恶意提交?
答:咱们能够在接口传输参数里面设置一个业务编号,这个编号用来区分是否重复提交。这样即便数据被抓包了,对方也没法区分每一个字段你的含义,这时,这个业务编号的做用就来了
二、假设服务器常常宕机,你从哪些方面去排查问题?