Java高级工程师面试之路

最近在面试java的工作所以略微总结下所遇到的一些面试以及技巧

 

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()的区别:

  1. 父类不同Sleep()来自Thread类,wait()来自Objcet类
  2. 最主要的是sleep()方法没有释放锁,而wait方法释放了所,使得其他线程可以使用同步空值快或者方法。

Sleep不让出系统资源;wait是进入线程等待池等待,让出系统资源,其他线程可以占用cpu,且需要notify,notifyAlll来唤醒等待池中的线程。

  1. 使用范围:wait,notify和notifyAll只能在同步空值方法或者同步控制块里使用,而sleep可以在任何地方使用
  2. 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三次握手&四次分手

参考:https://blog.csdn.net/qq_33616529/article/details/78288883

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

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

18、java里有什么数据结构

参考: https://www.cnblogs.com/yangyquin/p/4921664.html

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

参考:https://blog.csdn.net/qq_41790443/article/details/83719466

20、JVM调优浅谈

21、字节流和字符流

参考:https://blog.csdn.net/qq_34707744/article/details/79802252

22、Java并发编程:Lock和synchronized

参考:https://www.cnblogs.com/dolphin0520/p/3923167.html

23、java设计模式

参考:https://blog.csdn.net/isanovice/article/details/80497930

24、redis分布锁

参考:https://blog.csdn.net/turbo_zone/article/details/83422215

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

参考:https://blog.csdn.net/fanrenxiang/article/details/81704691

26、Git的各种工作流

参考:https://blog.csdn.net/qq_35865125/article/details/80049655

27.Git在linux下创建仓库

参考:https://www.cnblogs.com/HuSay/p/9101130.html

28、git解决冲突

参考:https://www.cnblogs.com/gavincoder/p/9071959.html

29.java中并发Queue种类与各自API特点以及使用场景!

参考:https://www.cnblogs.com/houzheng/p/9124764.html

30、io和nio的区别

参考:https://blog.csdn.net/henglang5194/article/details/78138515

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

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分布式缓存同步

三、数据库

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

答:

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

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

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

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

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

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

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

 

2、数据表分区

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

具体分区操作:https://www.cnblogs.com/mliudong/p/3625522.html

 

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

参考:https://blog.csdn.net/qq_28081081/article/details/81150842

4.什么是索引?Mysql目前主要的几种索引类型

参考:https://blog.csdn.net/liutong123987/article/details/79384395

https://blog.csdn.net/always_younger/article/details/79558628

5、mybatis里面的#和$之间的区别

参考:https://blog.csdn.net/qq_34237136/article/details/83781290

四、三大框架方面问题

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配置文件详细说明

参考:

https://www.cnblogs.com/java1024/p/8594784.html

https://blog.csdn.net/huangshulang1234/article/details/79203818

https://www.cnblogs.com/chengxuyuanzhilu/p/4707787.html

https://www.cnblogs.com/chengxuyuanzhilu/p/4707787.html

你可能感兴趣的:(java)