背景:人生不可以后悔,但它却可以转弯。不知不觉到新的公司上班已经一个多星期了,然而之前面试了好几家公司都没有好好总结下;新公司给我的总体印象还不错,是一家非外包的创业型企业,就是公司是做大数据项目的,之前我是搞Java开发的,然后现在自己hadoop不了解、Linux不熟悉、测试用例也没写过等,搞得一脸被嫌弃的样子,心疼自己两秒;但是我每天上班也是坚持硬着头皮搞,边搞边学,希望自己不要成长太慢,被公司开了就尴尬了;总之,2019干就完了。
Java面试总结:
本人2017年毕业的,面试的是Java初级开发,拿到的offer有9k、10k、11k和12k,多面试几家,总有一家眼瞎,尽管都是低开,但面试总结对我此等初级开发段位还是管用的。
1、为什么辞职?
这个问题几乎每次面试都被问到了,蛋疼,感觉对企业忠诚度太低不怎么OK,然后论人是非者必是非之人;于是我就说想换个更niubility的公司,同时工资也要往上涨,所以辞职了。
2、最近做了什么项目,主要负责哪些模块?
简单讲了最近做的一个智慧园区的项目:我们这个智慧园区项目主要服务于政府、教育、地产和化工厂行业,她重新定义了园区,帮助客户更高效、更敏捷地解决传统技术手段很难甚至无法解决的业务问题,使智能、安全、便捷、高效以及低能耗真正落地园区;其内部还有一个响亮的口号“平行移动 批量复制 有竞争力”;主要模块有综合态势、事件中心、安防管理、设备管理、人员通行、车辆通行、设备主数据和配置中心;用的是SpringCloud微服务架构开发的,我主要负责人员通行和车辆通行模块;车辆通行的主要业务逻辑如:一辆车到距离摄像头5米左右的距离,摄像头就会对该范围内对移动车辆抓拍,然后把拍到的视频流发送到EI,EI快速分析视频流,然后再通过kafka消息队列把成功识别之后到车辆信息(包括车辆图片url、车牌号、车辆进车时间等)发送到IOC平台进行处理,IOC监听到消息后,首先通过Redis对消息进行去重,然后根据车牌号判断该车辆是否有权限进出,鉴权结束后一方面把车辆图片上传到文件存储服务器,另一方面通过Websocket时时推送把当前的车辆信息发送给前端页面展示。
3、为什么平常用String拼接字符串,而不用StringBuffer/StringBuilder?如:String gateKey = "font110"+"_520"
没答上,之后面试官告诉我String是不可变对象,在后面拼接字符串不会重新创建对象;而用StringBuffer的话,太多就会占用过多的内存,特别是循环添加时,主要是考虑JVM内存才用的String。
4、工作之外下班后喜欢做些什么?
学习英语、打球、写博客、看博客和研究新技术。
5、对未来的职业有什么规划?
3-5年内进BAT,不过公司平台和福利都足够好也没谁想进BAT。
6、你认为进入BAT的要求有哪些?
1)基础部分:Java语言基础部分、Java运行时环境、并发知识于Concurrent包、设计模式和反射、文件IO/NIO、网络IO及网络协议;
2)加薪部分:SpringCloud、Spring、Mybatis等主流框架、Linux服务器、数据库优化、缓存服务、负载均衡;
3)加分部分:数据结构与算法、计算机操作系统、计算机网络、熟练使用一种脚本语言如python、JS等、Github和博客。
7、有研究什么新的技术?
Apache Camel。
8、项目中对你最具有挑战的事情或问题?
我认为在项目中沟通和扯皮时最重要的,诸如智慧园区这个项目我们有上游合作伙伴,他们消息队列时以GBK格式给我们发送消息的,然后我们这边是以UTF-8接收消息的,造成了车牌号乱码等问题,还有我们需要调用上游合作伙伴的接口,他们有随意改动接口的出参格式或是改IP等,此类问题影响恶劣。
9、手写单例模式?
10、Mysql有哪些引用函数?
When、Then、If、Concat、Field、Format、Lower、ABS等。
11、读取一个有100万条数据的文件,并且把着100万条数据插入数据库需要注意些什么?
1)JVM是否可以承受住这么大的数据量;
2)每当放入1000条数据就提交一次,然后重新new一个Table,赋值给原来的变量、再继续放入下一个1000条记录;
3)先取消数据库表的索引、外键和触发器等会加大写入的速度。
12、Python基本数据类型?
Stiring、Digit(数字)、List、Tuple(元组)、Sets(集合)、Dictionary、date。
13、说说你对Socket通信的理解?
服务端先初始化Socket,然后与端口绑定,对端口进行监听,调用accept阻塞,等待客户端连接;在这时如果有个客户端初使化了一个Servlet,然后连接服务器(connect),如果连接成功,这时客户端与服务的的连接就建立了;客户端发送数据请求,服务器端接收请求并处理,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
14、Websocket怎么建立连接并保证长链接?
Websocket进行全双工的通信,只需要建立一次连接(长连接);其不像xml(AJAX)请求实现长轮询,因为不停的连接,HTTP连接始终打开,效率低且浪费资源。
15、接口interface和程抽象类Abstract?
1)抽象类是对一种事物的抽象即对类抽象,而接口是对行为的抽象;
2)抽象类和接口都不能直接实例化,若要实例化,抽象类变量必须指向实现所有抽象方法的自类对象,接口变量则必须指向实现所有接口方法的类对象;
3)抽象类要被子类继承,接口要被类实现;
4)接口中定义的变量只能是公共的静态的常量,抽象类中的变量则是普通变量;
5)接口可以继承接口,并支持多继承,但类只能当根继承;
6)当关注一个事物的本质时,用抽象类,而当关注一个操作时,用接口。
16、Mysql什么情况下会造成表锁死?
1)alter table 大表操作会死锁;
2)高并发插入可能会死锁;
3)多个事务同时锁定一个资源时也会造成死锁。
17、用Redis怎么做一个排名?
用Redis的排序集合类型Sortset()实现排行榜。
18、数据库表主键又何作用?
主键可以保证数据不会重复。
19、REST是什么?
REST描述的是一种网络中Client与Server的一种交互形式;REST本身不实用,实用的是如何设计RESRful API(REST风格的网络接口)。
20、什么是微服务?
微服务Microservice的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底的去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事情;从技术角度看就是一种小而独立的处理过程,类似进程的概念,能够独立启动或销毁,拥有自己独立的数据库。(业务拆分、单独进程、独立数据库)
21、什么是SpringCloud?
SpringCloud是一个基于SpringBoot的快速构建分布式系统的工具集;其基于SpringBoot提供类一套微服务一站式解决方案,包括服务注册与发现Eureka、配置中心Config、全链路监控、服务网关Zuul、负载均衡Ribbon、熔断器Hystrix等组件的微服务协调治理框架。
22、微服务优缺点?
优点:
1)每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个置顶的业务功能或业务需求;
2)开发简单、效率高,一个服务可能就是专门做一件事;
3)微服务能够被小团队开发,这个小团队可由2-5个开发人员组成;
4)微服务是松耦合的,是具有功能意义的服务,无论在开发还会是部署阶段都是独立的;
5)微服务可以使用不同的语言开发;
6)易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具如Jenkins、Hudson等;
7)微服务只是业务代码的逻辑,不会与HTML、CSS或其他界面组件混合;
8)每个微服务都有自己独立的存储,可以有独立的数据库,也可以有统一的数据库;
缺点:
1)开发人员要处理分布式系统的复杂性;
2)多服务运维难度大,随着服务的增加,运维的压力也在增大;
3)系统部署依赖;
4)服务间通信成本;
5)数据一致性。
23、Listen & Filter两者的作用和区别?
首先知道web.xml的加载顺序是:Context-Param --> Listener --> Filter --> Servlet
1)Listner是一种观察者模式的实现,我们在web.xml中配置Listner时就是把一个被观察者放入观察者的观察对象队列中,当被观察者触发了对象事件时,观察者做出相应的相应Response;具体的实现(在jsp/Servlet中)是在web.xml中注册Listener,由Container在特定事件发生时呼叫特定的实现Listener类;应用场景:统计网站在线人数、清除过期session。
2)Filter过滤器的使用可以改变一个Request或改一个Response,Filter不是一个Servlet,它不能产生一个Response,但是能够在一个Reqeust到达Servlet之前预先处理Request,也可以在一个相应Response离开Servlet时处理一个Response;应用场景:设置字符编码、过滤敏感词汇、URL级别的权限访问控制、压缩相应信息。
24、悲观锁 & 乐观锁?
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为somebody会修改,所以每次在拿数据的时候都会上锁;传统的关系型数据库里就用到了很多的这种锁机制,如行锁、表锁、读锁和写锁等,都是在操作之前先上锁;Java中Synchronized和ReetranLock等独占锁就是悲观锁实现的;
乐观锁:总是假设最好的situation,每次去拿数据时都believe别人不会修改,所以不会上锁,但是更新的时候会判断一下在此期间别人有没有去更新了这个数据(用版本号机制和CAS算法实现);乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write-condition机制,其实都是提供的乐观锁。
25、抗住千万级流量系统的架构思路?
1)实现高并发
服务拆分:将整个项目拆分成多个子项目或模块,将项目平行扩展;
服务化:使用服务注册与发现;
消息队列:解耦、异步处理;
缓存:各种缓存带来的并发;
2)实现高可用
集群、限流、降级、数据库(读写分离、主从分离);
3)业务设计
Nginx代理等。
26、Spring最主要的两大特性?
AOP & IOC
IOC(控制反转)是Spring的一个容器,他不是一种技术,而是一种思想,是基于面向对象编程的,可以设计出松耦合、更优秀的程序;简而言之,如A类要引用B类中某个方法,传统编程是在A类中实例化一个B类,也就是通过new,然后打点调方法,而代码的高度耦合最大的原因就是用了new;But利用Spring框架就可以将实例化的过程交给IOC容器,通过配置文件中的设置Bean或者B类中添加注解,A类可不通过new而通过ApplicationContext的getBean方法得到实例,然后打点调用方法,如此就减少了两个类的耦合;IOC三种注入方式:接口注入、构造方法注入、赋值方法注入(Setter)。
AOP(面向切面/接口编程),同样是一种思想非技术;和OOP(面向对象编程)相比,AOP是对OOP的补充;OOP是静态的抽象,AOP是动态的抽象;简而言之,就是将一个工程中与源代码无关,但是很多地方都需要用到,抽出来也不影响源代码上下文的那一部分代码抽出来,然后要用的时候就织入,进行使用;就比如我们打算结婚,婚礼的整个流程我们可以自己负责,但是会spend我们的时间和精力,这是我们可以选择将婚礼交给婚庆公司,而自己不再负责婚礼的筹备过程,只需要在婚礼当天使用婚庆公司给我们的成果,So也说AOP是基于代理模式下进行的。
27、一些Spring常用的注解的含义?
@RequstParam:参数拼接在URL后面才可以接收;
@ReqeustBody:请求正文里的Json字符串;
@RequestPart:上传文件接收用的;
@RequestBody是把返回的实体转为字符串;
@RestController包含了@ResponseBody和@Controller。
28、动态代理 & 静态代理?
动态代理是在程序运行期间,由Java反射等机制动态生成,也就是在将class文件加载到JVM时期完成的工作,此方式不会修改字节码;
静态代理是在程序运行前已经存在代理的字节码文件,也就是编译时期已经完成代理工作了。
29、SpringMVC运行原理?
①用户向服务器发送请求,请求被Spring前端控制Servlet DispatchServlet捕获;
②DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),然后根据该URI调用HandlerMaping的Handler配置相关的对象,以HandlerExecutionChain对象的形式返回给DispatherServlet;
③DispatherServlet根据获得的Handler,选择一个 合适的HandlerAdapter;
④提取Request中的模型参数,填充Handler入参,开始执行Handler(Controller),在填充Handler的过程中,Spring会做一些额外的工作如:数据格式化、数据转换和验证等;
⑤Handler填充完毕后,向DispatherServelt返回一个ModelAndView对象;
⑥根据返回的ModelAndView,选择一个合适的ViewResolver视图解析器,并返回给DispatherServlet;
⑦ViewResovler结合Model和View来渲染视图;
⑧将渲染的结果返回给客户端。
30、SpringAOP动态代理实现步骤?
动态代理:https://www.cnblogs.com/taojietaoge/p/10463649.html
①实现InvocationHandler接口,重写invoke方法,创建自己的调用处理器;
②通过Proxy类指定ClassLoader对象和一组interface来创建动态代理类;
③通过反射机制获得动态代理的构造函数,其唯一参数类型是调用处理器接口类型;
④通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数传入。
31、谈谈对HashTable和HashMap理解?
HashMap + HashTable:https://www.cnblogs.com/taojietaoge/p/10301711.html
32、谈谈对Java内存的理解?
Java内存:https://www.cnblogs.com/taojietaoge/p/10264416.html
33、@Autowire和@inject有什么区别?
相同点:二者同样可以注入对象,在属性域上面注入、在set方法或者其他需要注入点方法上注入、在构造器上面注入;
不同点:@Autowire有@required标签,允许对象为空;@inject没有@required标签,强制要求对象不能为空。
34、BeanFactory和ApplicationContext的区别?
1)BeanFactory是Spring的心脏,Spring使用BeanFactory来实例化、配置和管理bean,BeanFactory是IOC容器的核心接口;
2)ApplicationContext是IOC容器的另外一个重要接口,他继承了BeanFactory的基本功能,同时也继承了容器的高级功能,如MessageSource国际化资源接口、ResourceLoad等;
3)BeanFactory采用的是延迟加载形式来注入Bean等,只有在使用到某个Bean时才会调用getBean方法对该Bean进行加载实例化,这样就不能发现一些存在的Spring配置问题;
4)ApplicationContext则会在容器启动时,一次性创建所有的Bean,这样在容器启动的时就可以发现Spring中存在的错误配置,但ApplicationContext占用内存空间,且程序配置Bean较多时启动缓慢。