文章目录
专业技能
1. 熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。
2. 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。
3. 对Spring的IoC容器和AOP原理有深入了解,熟练的运用Spring框架管理各种Web组件及其依赖关系,熟练的使用Spring进行事务、日志、安全性等的管理,有使用Spring MVC作为表示层技术以及使用Spring提供的持久化支持进行Web项目开发的经验,熟悉Spring对其他框架的整合。
4. 熟练的使用Hibernate、MyBatis等ORM框架,熟悉Hibernate和MyBatis的核心API,对Hibernate的关联映射、继承映射、组件映射、缓存机制、事务管理以及性能调优等有深入的理解。
5. 熟练的使用HTML、CSS和JavaScript进行Web前端开发,熟悉jQuery和Bootstrap,对Ajax技术在Web项目中的应用有深入理解,有使用前端MVC框架(AngularJS)和JavaScript模板引擎(HandleBars)进行项目开发的经验。
6. 熟悉常用的关系型数据库产品(MySQL、Oracle),熟练的使用SQL和PL/SQL进行数据库编程。
7. 熟悉面向对象的设计原则,对GoF设计模式和企业应用架构模式有深入的了解和实际开发的相关经验,熟练的使用UML进行面向对象的分析和设计,有TDD(测试驱动开发)和DDD(领域驱动设计)的经验。
8. 熟悉Apache、NginX、Tomcat、WildFly、Weblogic等Web服务器和应用服务器的使用,熟悉多种服务器整合、集群和负载均衡的配置。
9. 熟练的使用产品原型工具Axure,熟练的使用设计建模工具PowerDesigner和Enterprise Architect,熟练的使用Java开发环境Eclipse和IntelliJ,熟练的使用前端开发环境WebStorm,熟练的使用软件版本控制工具SVN和Git,熟练的使用项目构建和管理工具Maven和Gradle。
面试问题和技巧
一、Java 基础
- JDK 和 JRE 有什么区别?
- == 和 equals 的区别是什么?
- 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
- final 在 java 中有什么作用?
- java 中的 Math.round(-1.5) 等于多少?
- String 属于基础的数据类型吗?
- java 中操作字符串都有哪些类?它们之间有什么区别?
- String str="i"与 String str=new String(“i”)一样吗?
- 如何将字符串反转?
- String 类的常用方法都有那些?
- 抽象类必须要有抽象方法吗?
- 普通类和抽象类有哪些区别?
- 抽象类能使用 final 修饰吗?
- 接口和抽象类有什么区别?
- java 中 IO 流分为几种?
- BIO、NIO、AIO 有什么区别?
- Files的常用方法都有哪些?
二、容器
- java 容器都有哪些?
- Collection 和 Collections 有什么区别?
- List、Set、Map 之间的区别是什么?
- HashMap 和 Hashtable 有什么区别?
- 如何决定使用 HashMap 还是 TreeMap?
- 说一下 HashMap 的实现原理?
- 说一下 HashSet 的实现原理?
- ArrayList 和 LinkedList 的区别是什么?
- 如何实现数组和 List 之间的转换?
- ArrayList 和 Vector 的区别是什么?
- Array 和 ArrayList 有何区别?
- 在 Queue 中 poll()和 remove()有什么区别?
- 哪些集合类是线程安全的?
- 迭代器 Iterator 是什么?
- Iterator 怎么使用?有什么特点?
- Iterator 和 ListIterator 有什么区别?
- 怎么确保一个集合不能被修改?
三、多线程
- 并行和并发有什么区别?
- 线程和进程的区别?
- 守护线程是什么?
- 创建线程有哪几种方式?
- 说一下 runnable 和 callable 有什么区别?
- 线程有哪些状态?
- sleep() 和 wait() 有什么区别?
- notify()和 notifyAll()有什么区别?
- 线程的 run()和 start()有什么区别?
- 创建线程池有哪几种方式?
- 线程池都有哪些状态?
- 线程池中 submit()和 execute()方法有什么区别?
- 在 java 程序中怎么保证多线程的运行安全?
- 多线程锁的升级原理是什么?
- 什么是死锁?
- 怎么防止死锁?
- ThreadLocal 是什么?有哪些使用场景?
- 说一下 synchronized 底层实现原理?
- synchronized 和 volatile 的区别是什么?
- synchronized 和 Lock 有什么区别?
- synchronized 和 ReentrantLock 区别是什么?
- 说一下 atomic 的原理?
四、反射
- 什么是反射?
- 什么是 java 序列化?什么情况下需要序列化?
- 动态代理是什么?有哪些应用?
- 怎么实现动态代理?
五、对象拷贝
- 为什么要使用克隆?
- 如何实现对象克隆?
- 深拷贝和浅拷贝区别是什么?
六、Java Web
- jsp 和 servlet 有什么区别?
- jsp 有哪些内置对象?作用分别是什么?
- 说一下 jsp 的 4 种作用域?
- session 和 cookie 有什么区别?
- 说一下 session 的工作原理?
- 如果客户端禁止 cookie 能实现 session 还能用吗?
- spring mvc 和 struts 的区别是什么?
- 如何避免 sql 注入?
- 什么是 XSS 攻击,如何避免?
- 什么是 CSRF 攻击,如何避免?
七、异常
- throw 和 throws 的区别?
- final、finally、finalize 有什么区别?
- try-catch-finally 中哪个部分可以省略?
- try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
- 常见的异常类有哪些?
八、网络
- http 响应码 301 和 302 代表的是什么?有什么区别?
- forward 和 redirect 的区别?
- 简述 tcp 和 udp的区别?
- tcp 为什么要三次握手,两次不行吗?为什么?
- 说一下 tcp 粘包是怎么产生的?
- OSI 的七层模型都有哪些?
- get 和 post 请求有哪些区别?
- 如何实现跨域?
- 说一下 JSONP 实现原理?
九、设计模式
- 说一下你熟悉的设计模式?
- 简单工厂和抽象工厂有什么区别?
十、Spring/Spring MVC
- 为什么要使用 spring?
- 解释一下什么是 aop?
- 解释一下什么是 ioc?
- spring 有哪些主要模块?
- spring 常用的注入方式有哪些?
- spring 中的 bean 是线程安全的吗?
- spring 支持几种 bean 的作用域?
- spring 自动装配 bean 有哪些方式?
- spring 事务实现方式有哪些?
- 说一下 spring 的事务隔离?
- 说一下 spring mvc 运行流程?
- spring mvc 有哪些组件?
- @RequestMapping 的作用是什么?
- @Autowired 的作用是什么?
十一、Spring Boot/Spring Cloud
- 什么是 spring boot?
- 为什么要用 spring boot?
- spring boot 核心配置文件是什么?
- spring boot 配置文件有哪几种类型?它们有什么区别?
- spring boot 有哪些方式可以实现热部署?
- jpa 和 hibernate 有什么区别?
- 什么是 spring cloud?
- spring cloud 断路器的作用是什么?
- spring cloud 的核心组件有哪些?
十二、Hibernate
- 为什么要使用 hibernate?
- 什么是 ORM 框架?
- hibernate 中如何在控制台查看打印的 sql 语句?
- hibernate 有几种查询方式?
- hibernate 实体类可以被定义为 final 吗?
- 在 hibernate 中使用 Integer 和 int 做映射有什么区别?
- hibernate 是如何工作的?
- get()和 load()的区别?
- 说一下 hibernate 的缓存机制?
- hibernate 对象有哪些状态?
- 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
- hibernate 实体类必须要有无参构造函数吗?为什么?
十三、Mybatis
- mybatis 中 #{}和 ${}的区别是什么?
- mybatis 有几种分页方式?
- RowBounds 是一次性查询全部结果吗?为什么?
- mybatis 逻辑分页和物理分页的区别是什么?
- mybatis 是否支持延迟加载?延迟加载的原理是什么?
- 说一下 mybatis 的一级缓存和二级缓存?
- mybatis 和 hibernate 的区别有哪些?
- mybatis 有哪些执行器(Executor)?
- mybatis 分页插件的实现原理是什么?
- mybatis 如何编写一个自定义插件?
十四、RabbitMQ
- rabbitmq 的使用场景有哪些?
- rabbitmq 有哪些重要的角色?
- rabbitmq 有哪些重要的组件?
- rabbitmq 中 vhost 的作用是什么?
- rabbitmq 的消息是怎么发送的?
- rabbitmq 怎么保证消息的稳定性?
- rabbitmq 怎么避免消息丢失?
- 要保证消息持久化成功的条件有哪些?
- rabbitmq 持久化有什么缺点?
- rabbitmq 有几种广播类型?
- rabbitmq 怎么实现延迟消息队列?
- rabbitmq 集群有什么用?
- rabbitmq 节点的类型有哪些?
- rabbitmq 集群搭建需要注意哪些问题?
- rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?
- rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况?
- rabbitmq 对集群节点停止顺序有要求吗?
十五、Kafka
- kafka 可以脱离 zookeeper 单独使用吗?为什么?
- kafka 有几种数据保留的策略?
- kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?
- 什么情况会导致 kafka 运行变慢?
- 使用 kafka 集群需要注意什么?
十六、Zookeeper
- zookeeper 是什么?
- zookeeper 都有哪些功能?
- zookeeper 有几种部署模式?
- zookeeper 怎么保证主从节点的状态同步?
- 集群中为什么要有主节点?
- 集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?
- 说一下 zookeeper 的通知机制?
十七、MySql
- 数据库的三范式是什么?
- 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
- 如何获取当前数据库版本?
- 说一下 ACID 是什么?
- char 和 varchar 的区别是什么?
- float 和 double 的区别是什么?
- mysql 的内连接、左连接、右连接有什么区别?
- mysql 索引是怎么实现的?
- 怎么验证 mysql 的索引是否满足需求?
- 说一下数据库的事务隔离?
- 说一下 mysql 常用的引擎?
- 说一下 mysql 的行锁和表锁?
- 说一下乐观锁和悲观锁?
- mysql 问题排查都有哪些手段?
- 如何做 mysql 的性能优化?
十八、Redis
- redis 是什么?都有哪些使用场景?
- redis 有哪些功能?
- redis 和 memecache 有什么区别?
- redis 为什么是单线程的?
- 什么是缓存穿透?怎么解决?
- redis 支持的数据类型有哪些?
- redis 支持的 java 客户端都有哪些?
- jedis 和 redisson 有哪些区别?
- 怎么保证缓存和数据库数据的一致性?
- redis 持久化有几种方式?
- redis 怎么实现分布式锁?
- redis 分布式锁有什么缺陷?
- redis 如何做内存优化?
- redis 淘汰策略有哪些?
- redis 常见的性能问题有哪些?该如何解决?
十九、JVM
- 说一下 jvm 的主要组成部分?及其作用?
- 说一下 jvm 运行时数据区?
- 说一下堆栈的区别?
- 队列和栈是什么?有什么区别?
- 什么是双亲委派模型?
- 说一下类加载的执行过程?
- 怎么判断对象是否可以被回收?
- java 中都有哪些引用类型?
- 说一下 jvm 有哪些垃圾回收算法?
- 说一下 jvm 有哪些垃圾回收器?
- 详细介绍一下 CMS 垃圾回收器?
- 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
- 简述分代垃圾回收器是怎么工作的?
- 说一下 jvm 调优的工具?
- 常用的 jvm 调优的参数都有哪些?
项目经验的问题
考官通过看你的简历或者你的介绍来了解你所做的项目,那么考官肯定想更详细的了解您的项目,看是不是与你的简历写的项目经验一致。也就是考核你是否具有真实的项目经验。一般来说,在你的简历至少有一个重点项目,放在简历项目经验栏的第一位。把项目的业务功能描述清楚。在这里你就是重点谈一个项目就可以了。从下面几个方面来进行陈述
1. 用一句话简述项目
2. 详细的列出项目实现的功能
3. 说出项目实现的技术和架构,能说出项目的不寻常之处,比如采用了某项新技术,采用了良好的架框等
4. 能让别人感觉出项目的规模
5. 说出你在项目中的责任
通过这些来证明你是的确开发过了这个项目,并且这个项目是一个真实的。还有就是你是真正具有项目经验的。乎合企业的用人需要。
特别注意要把项目所实现的功能描述得越详细越好。当然用词要简洁,表达要流利。其次要尽可能采用专业术语,显得你的专业。不要犯低级错误。
请记住,你要描述的是整个项目而不仅仅是你做的那一个模块。有些项目你只参与了其中一个模块,但是你要把整个项目描述出来,不要仅仅描述你参与的那一个模块。
说出你项目采用的技术及架构,还要能说明你在项目中的责任。
你在项目中的职责,是否能够胜任之前的任务安排
在项目中遇到的问题,你是怎么解决的(一般这样的问题,可以说是自己解决,但是要讲明解决过程,一定要突出解决思路的灵活。也可以回答与同事讨论解决,这样可
以让面试官觉察到自己善于利用团队资源,会给自己的团队意识加分)
是怎么对这个项目进行开发的?
这个问题是考核你是否熟悉软件开发的流程,同时也是考核你的项目经验,你的专业素养,从这里可以判断出你参与过多少项目,可以判断你对软件工程的理解和熟悉程度。这个问题是十分关键的,你需要准备的知识点有:软件项目的生命周期、软件项目的开发模型、面向对象的分析和设计、软件质量保证等。
软件项目的生命周期:
- 项目计划
- 需求分析
- 设计(概要设计和详细设计)
- 编码
- 测试
- 发布
- 维护
项目计划阶段:走访客户,进行交流沟通,获得客户原始需求。
对客户的需求和市场等进行调研,分析,编写可行性分析报告。
通过不断的与客户沟通,找客户不同环节的用户进行交流来获取需求。召开评审会议,报告可行性分析,报告用户原始需求,报告项目远景规化。
需求分析阶段:
在客户原始需求的基础上不断与客户沟通,充分的熟悉和深入客户业务,获得充分的业务需求,完善用户需求和功能性需求,了解客户的相关约束而获得非功能性需求。最终编写《需求规格说明书》;召开需求评审会议,客户确定需求,并签定合同;编写项目计划说明书;编写测试计划;召开项目启动会议,项目正式启动。
概要设计阶段:根据《需求分析说明书》,进行用例分析,获得充分而有效的用例。编写界面原型,编写编码规范和界面风格规范,数据库设计规范。用uml工具画用例图,编写有效的用例规约文档。划分项目功能模块.评审用例及用例规约文档。
详细设计阶段:根据完整的用例及需求进行分析,获得数据库所需的相关信息,画数据库E-R图,编写数据设计说明书.进行数据库建模。进行详细的分析,用uml工具画类图,确定每个功能模块的子功能,抽取项目的公共部分成为一个公共模块。确定项目的架构基础。确定需要用到的类及类成员和方法。确定一些辅助类及方法。对每一个用例都用uml工具画出顺序图。编写详细设计说明书,评审详细设计说明书, 进行基础框架搭建。列出任务清单,进行任务分配。
编码阶段:以小组的形式进行代码编写,编写单元测试用例,每完成一个类都要进行单元测试。每完成一个功能点和模块都要进行集成测试。确保每一个功能点和模块完成后都是一个可以看得见、摸得着的产品。而不是等到最后才进行统一的调试和搭配。每天都要对代码进行检查和优化,也就是所谓的重构。
测试阶段:根据测试计划对项目进行系统测试,以及用户的验收测试
产品发布:交付完整的产品和设计文档。把产品布署到客户的计算机上,确保产品的正常运行。客户签收。
维护阶段:为客户提供技术保障,对产品进行相应的维护和升级工作