作者:纠结哥_Shrek  ​

1、背熟你的简历

面试的第一个问题,一般都是让你简单介绍下你自己,或者介绍一下你最近的项目,而一个面试者,如果连自己的简历都无法熟知,对里面提到的项目、技术都无法描述清楚的话,我想没有哪家公司会接受这样的,哪怕你是超级人才,你自我表述不行,估计也会为此头疼,所以,切记:一定要背好自己的简历,不要求你能全部记下,至少要熟记你最近所待过的两家公司,这两家公司里面你做过的项目,你负责的模块,项目里面用到的技术以及相对应的技术实现方案

2、深入了解并熟记部分Java基础知识

举例List集合下面ArryList、LinkedList、Vector等集合的区别,那么同样的方法,你需要理解每一个的结构组成是什么

3、保持自信心和沉重冷静的心态

如果是让你提供技术方案或者说说某个技术原理,没必要一紧张一咕噜的什么都说,你可以对面试官说:我先想想,然后自己组装记忆中的知识,组装下语言,有条理的说出来,这样能更好的表现你的才能,不是吗? 面试谁都会紧张,我也会紧张,有时候明明记得的知识点忘了,没关系,大胆的说忘了,或者直接说不知道。

4、合理安排你的面试时间(如果有多家公司的面试机会,尽量把你想去的公司放到最后去面试)

下面是面试题基础总结

一、面试题基础总结

1、 JVM结构原理、GC工作机制详解

答:具体参照:JVM结构、GC工作机制详解     ,说到GC,记住两点:1、GC是负责回收所有无任何引用对象的内存空间。 注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,2、GC回收机制的两种算法,a、引用计数法  b、可达性分析算法(  这里的可达性,大家可以看基础2 Java对象的什么周期),至于更详细的GC算法介绍,大家可以参考:Java GC机制算法

2、Java对象的生命周期

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

3、Map或者HashMap的存储原理

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

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

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

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

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

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

答:Object有哪些方法

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

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

 8、简述一下面向对象的特征,并举例说明你对面向对象的理解?

面向对象是基于万物皆对象这个哲学观点,把一个帝乡抽象成类,具体就是你吧一个对象的静态特征和动态特征抽象成属性和方法,也就是把一类事务的算法和数据结构封装在一个类之中,程序就是多个对象和互相间的通信组成的。

面向对象具有封装性,继承性,多态性。封装隐蔽了对象内部不需要暴漏的细节,似的内部细节的变动跟外界脱离,只依靠接口进行通信。封装性降低了编程的复杂性。通过继承,使得新建一个类变得容易,一个类从派生类哪里获得其非私有的方法和公用属性的繁琐工作交给了编译器。而继承和实现接口和运行时的类型标定机制所产生的多态,使得不同的类所产生的对象能够对相同的消息做出不同的反映,记得提高了代码的通用性。

总之,面向对象的特性提高了大型程序的重用性和可维护性。

9、线程同步的关键字是什么?sleep() 和 wait() 有什么区别?怎么唤醒wait()停止的线程?(5分)

线程同步的关键字:synchronized

Sleep()和Wait()的区别:

父类不同Sleep()来自Thread类,wait()来自Objcet类
最主要的是sleep()方法没有释放锁,而wait方法释放了所,使得其他线程可以使用同步空值快或者方法。
Sleep不让出系统资源;wait是进入线程等待池等待,让出系统资源,其他线程可以占用cpu,且需要notify,notifyAlll来唤醒等待池中的线程。

使用范围:wait,notify和notifyAll只能在同步空值方法或者同步控制块里使用,而sleep可以在任何地方使用
Sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
10、Spring中事务管理支持哪几种方式以及每种方式的具体使用方法。

 实现方式两种:

 编码方式;

 声明式事务管理方式。

 声明式事务管理是通过AOP技术实现的,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完成目标方法后根据执行情况提交后回滚事务。

声明式事务管理有两种方式:基于XML配置文件(拦截器 AOP),通过标签@Transaction注解

 

11、spring里面的aop的原理是什么;
AOP的主要原理:动态代理
1.静态代理: 
 针对每个具体类分别编写代理类; 
 针对一个接口编写一个代理类; 
2.动态代理: 
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类

 

12、java的多态表现在哪里;

父类引用指向子类对象

 

13、接口有什么用;

一是实现多重继承,因为java是单根语言。

二是便于实现各种框架,java 的各种框架中,都是拿接口调来调去。一旦你实现了这个接口,你的代码就嵌入了框架。

三是为了实现前面各位说的规范。

14、tcp,udp区别;
1、基于连接与无连接。
2、TCP要求系统资源较多,UDP较少。
3、UDP程序结构较简单。
4、流模式(TCP)与数据报模式(UDP)。
5、TCP保证数据正确性,UDP可能丢包。
6、TCP保证数据顺序,UDP不保证。
7、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
8、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。

15、悲观锁和乐观锁的区别,怎么实现;

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

16、http请求与响应,TCP三次握手&四次分手

17、Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

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

18、java里有什么数据结构

19、JAVA处理千万级数据(单线程)

20、JVM调优浅谈

21、字节流和字符流

22、Java并发编程:Lock和synchronized

23、java设计模式

25、基于Zookeeper开源客户端Curator实现分布式锁

二、线程、设计模式、缓存方面
1、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢

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

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

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

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

1、Java集群之session共享    

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

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

答:

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

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

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

答:

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

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

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

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

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

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

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

8、数据表分区

参考:Oracle中的几种分区表方法

9、数据库中索引失效(原因)

个人理解:从根本上来说,查询慢是占用mysql内存比较多,那么可以从这方面去酌手考虑

三、三大框架方面问题
1、Spring 事务的隔离性,并说说每个隔离性的区别
解答:Spring事务详解

2、Spring事务的传播行为,并说说每个传播行为的区别
解答:Spring事务详解

3、hibernate跟Mybatis/ ibatis 的区别,为什么选择?
解答:Hibernate与Mybatis的比较

4、Struts跟Spring mvc的优缺点,让你选会如何选
解答:Spring MVC 与 Struts的区别

5、简单说说Spring 事务机制
解答:Spring事务机制

6、Spring 4.0新特性
解答:Spring4新特性

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

2、Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享 
解答:配置参考

3、nginx配置文件详解——nginx.conf
解答:Nginx配置文件详细说明

五、智力部分
 

1. 烧一根不均匀的绳要用一个小时,如何用它来判断半个小时?(5分)

两头同时烧

2. 4,4,10,10,加减乘除,怎么出24点?四个数字分别只能用一次(5分)

(10*10-4)/4

3. 如果你有无穷多的水,一个容积为3L的和5L的提桶,你如何准确称出 4L的水?(5分)

第一步:向5L的通中放两次3L水,这时3L水桶剩1L水。

第二步:将3L水桶中的1L水倒入5L的水桶中,这时5L的水桶中有1L水。

第三步:再用3L水桶盛满水全部倒入5L的水桶,4L水就称出来了。

 

4. 一只蜗牛从井底爬到井口,每天白天蜗牛要睡觉,晚上才出来活动,一个晚上蜗牛可以向上爬3尺,但是白天睡觉的时候会往下滑2尺,井深10尺,问蜗牛几天可以爬出来?(5分)

8天。

前七天是(3-1)*7 =7

第八天晚上又爬了3尺,这时已经到井口了。在井口睡觉想滑也滑不下去了。

 

5. 有一种细菌,经过一分钟分裂为2个,再过一分钟,分裂为4个,这样,将一个细菌放在一个瓶子里面,一个小时后瓶子被细菌充满了。现在假设一开始放入瓶中的为两个细菌,那么到充满瓶子要多长的时间?(10分)

59分钟。

一个放了一个细菌的瓶子经过一分钟分裂,就有两个细菌了。第二个瓶子直接就有了两个细菌,也就相当于调过了第一个瓶子在第一分钟的情况了。以后的情况就完全一致了,所以是59分钟。