最近在面试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()的区别:
Sleep不让出系统资源;wait是进入线程等待池等待,让出系统资源,其他线程可以占用cpu,且需要notify,notifyAlll来唤醒等待池中的线程。
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
解答:Spring事务详解
解答:Spring事务详解
解答:Hibernate与Mybatis的比较
解答:Spring MVC 与 Struts的区别
解答:Spring事务机制
解答:Spring4新特性
解答:a、WEBLOGIC负载均衡原理 b、负载均衡和集群的配置(参考)
解答:配置参考
解答: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