最近在面试java的工作所以略微总结下所遇到的一些面试以及技巧
下面是面试题基础总结
一、面试题基础总结
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类中有哪些方法?
7、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、java的多态表现在哪里;
父类引用指向子类对象
11、接口有什么用;
一是实现多重继承,因为java是单根语言。
二是便于实现各种框架,java 的各种框架中,都是拿接口调来调去。一旦你实现了这个接口,你的代码就嵌入了框架。
三是为了实现前面各位说的规范。
12、tcp,udp区别;
1、基于连接与无连接。
2、TCP要求系统资源较多,UDP较少。
3、UDP程序结构较简单。
4、流模式(TCP)与数据报模式(UDP)。
5、TCP保证数据正确性,UDP可能丢包。
6、TCP保证数据顺序,UDP不保证。
7、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
8、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
13、悲观锁和乐观锁的区别,怎么实现;
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
14、http请求与响应,TCP三次握手&四次分手
参考:https://blog.youkuaiyun.com/qq_33616529/article/details/78288883
15、Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
参考:http://outofmemory.cn/c/java-outOfMemoryError
16、java里有什么数据结构
参考: https://www.cnblogs.com/yangyquin/p/4921664.html
17、JAVA处理千万级数据(单线程)
参考:https://blog.youkuaiyun.com/qq_41790443/article/details/83719466
18、JVM调优浅谈
19、字节流和字符流
参考:https://blog.youkuaiyun.com/qq_34707744/article/details/79802252
20、Java并发编程:Lock和synchronized
参考:https://www.cnblogs.com/dolphin0520/p/3923167.html
21、java设计模式
参考:https://blog.youkuaiyun.com/isanovice/article/details/80497930
22、基于Zookeeper开源客户端Curator实现分布式锁
参考:https://blog.youkuaiyun.com/fanrenxiang/article/details/81704691
23、Git的各种工作流
参考:https://blog.youkuaiyun.com/qq_35865125/article/details/80049655
24.Git在linux下创建仓库
参考:https://www.cnblogs.com/HuSay/p/9101130.html
25、git解决冲突
参考:https://www.cnblogs.com/gavincoder/p/9071959.html
26、java中并发Queue种类与各自API特点以及使用场景!
参考:https://www.cnblogs.com/houzheng/p/9124764.html
27、io和nio的区别
参考:https://blog.youkuaiyun.com/henglang5194/article/details/78138515
28、synchronized的底层、版本的区别
参考:https://blog.youkuaiyun.com/xlantian/article/details/89211386
29、类加载的几种方式,类的加载过程
参考:https://blog.youkuaiyun.com/weixin_42447959/article/details/81255112
参考:https://blog.youkuaiyun.com/weixin_38832563/article/details/81449940
30、java常见的几种排序算法
参考:https://www.cnblogs.com/ll409546297/p/10956960.html
31、list删除某个元素的三种方法
参考:https://blog.youkuaiyun.com/sinat_35757488/article/details/95347864
32、volatile和synchronized的区别
参考:https://www.cnblogs.com/kaleidoscope/p/9506018.html
二、Spring和SpringMVC框架方面知识
参考:https://www.cnblogs.com/shuai-server/p/9011334.html
2、Spring中事务管理支持哪几种方式以及每种方式的具体使用方法。
实现方式两种:
编码方式;
声明式事务管理方式。
声明式事务管理是通过AOP技术实现的,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完成目标方法后根据执行情况提交后回滚事务。
声明式事务管理有两种方式:基于XML配置文件(拦截器 AOP),通过标签@Transaction注解
3、spring里面的aop的原理是什么;
AOP的主要原理:动态代理
1.静态代理:
针对每个具体类分别编写代理类;
针对一个接口编写一个代理类;
2.动态代理:
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类
4、Spring 事务的隔离性,并说说每个隔离性的区别
解答:Spring事务详解
5、Spring事务的传播行为,并说说每个传播行为的区别
解答:Spring事务详解
6、简单说说Spring 事务机制
解答:Spring事务机制
7、Spring 4.0新特性
解答:Spring4新特性
三、springcloud方面知识
1、springboot启动流程
参考:https://www.cnblogs.com/trgl/p/7353782.html
2、Spring Cloud Ribbon负载均衡策略自定义配置
参考:https://blog.youkuaiyun.com/u010816545/article/details/80461957
3、Eureka的底层
参考:https://blog.youkuaiyun.com/shaojianjun521/article/details/91848846
参考:https://www.cnblogs.com/linjiqin/p/10191389.html
四、redis方面基础知识
1、redis分布锁
参考:https://blog.youkuaiyun.com/turbo_zone/article/details/83422215
2、redis缓存穿透、缓存击穿、缓存雪崩区别和解决方案
参考:https://blog.youkuaiyun.com/starskyboy/article/details/97621570
五、elasticsearch方面基础知识
1、elasticsearch 原理和使用
参考:http://www.xytschool.com/group/190.html
2、ES 的query 和 filter 区别
参考:https://blog.youkuaiyun.com/qq_29580525/article/details/80908523
六、数据库
1、一条sql执行过长的时间,你如何优化,从哪些方面?
答:
1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)
2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合
3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度
4、针对数量大的表进行历史表分离(如交易流水表)
5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步
6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等
7、查看mysql执行日志,看看是否有其他方面的问题
2、mysql数据库索引实现原理
参考:https://blog.youkuaiyun.com/lucky_ly/article/details/90733661
3、数据表分区
具体分区操作:https://www.cnblogs.com/mliudong/p/3625522.html
4、数据库中索引失效(原因)
参考:https://blog.youkuaiyun.com/qq_28081081/article/details/81150842
5.什么是索引?Mysql目前主要的几种索引类型
参考:https://blog.youkuaiyun.com/liutong123987/article/details/79384395
https://blog.youkuaiyun.com/always_younger/article/details/79558628
5、mybatis里面的#和$之间的区别
参考:https://blog.youkuaiyun.com/qq_34237136/article/details/83781290
6、Select Count(*)、Count(1)、Count(0)的区别和执行效率比较