最近一直在面试,结合蚂蚁课堂的材料,对以前所学的java做了下总结:
JAVA基础部分
JAVA多线程
集合框架
JAVAWEB
HTTP通信
J2EE框架
设计模式
项目讲解
项目中遇到的问题,如何解决,亮点
项目发布环境
项目人员分配
最近学的新技术
以后的打算
HADOOP,HDFS,MAPREDUCE,LINUX
一.Java初中级程序员必备技能
1.熟悉java基础、面向对象、jvm、io流、多线程、集合框架
2.熟悉jsp、servlet、Spring、Hibernate、SpringMvc
3.熟悉Http协议、Socket、webService及网络编程
4.Maven及linux常用命令
5.项目相关知识
二.面试官会问到那些问题
1.java基础方面:
使用final修饰对象
是指对象的内存地址不变,而其内容可以被改变
静态变量与实例变量区别
运行时区别,前者类加载完成时,其变量就已分配内存地址,而后者需在类实例化后,才会被分配空间
“==”与equals的区别:
数据为基本数据类型时没区别,都是比较变量值内容相等,而当数据类型为引用数据类型时,前者比较的是引用数据的内存地址,而后者仍比较的是值。
Int与integer的区别
一个是基本数据类型,一个是引用数据类型,前者默认值为0.后者为null。
重载与重写的区别
前者是在一个类中,方法名相同,但参数个数or类型不同时称为方法的重载。后者是在有继承关系的两个类中,子类方法与父类方法相同的情况。
接口与抽象类的区别
定义的关键字不同;接口中不能有普通方法,抽象类中可以有普通方法。
String字符串常量;StringBuffer字符串变量,线程安全;Stringbuilder字符串变量,线程不安全;
数组没有length()方法,但有length属性;String有length()方法。
运行时异常与一般异常有何区别?前者是运行时出现的异常,后者是在编译期出现的异常。
2.Java多线程方面:
1)什么是多线程?
在一个应用程序中,同时,有多个不同的执行路径。多线程的作用是提升程序效率。
2)线程和进程有什么区别?:线程是进程的一条执行路径,而进程是线程的集合。
3)什么是线程同步、异步?
线程同步表示,当前线程执行完后下一个线程接着执行。
线程异步表示, 在一个应用程序中,同时,有多个不同的执行路径。例如javaweb ajax android handler
4)线程之间如何同步:线程之间同步使用 synchronized、wait与 notify
5)什么是线程不安全?如何解决?(重点):就是在多个线程共享同一个数据会受到其他线程的干扰。如何解决:使用线程同步技术, 用上锁(synchronized)。 让一个线程执行完了,在让另一个线程执行。
6)如何创建一个线程?有几种方法:继承thread类, 重写run方法、实现Runnalbe接口,重新run方法 , 启动一个线程用start();
7)是使用Runnalbe接口好?还是继承Thread类好:是实现Runnalbe接口好,因为实现的接口还可以继续继承。如果继承了Thread类不能在继承。
3.集合框架方面
List 和Set、Map 区别:都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList、LinkedList,Map的实现类主要有HashMap和TreeMap。
Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对象按特定方式排序,例如TreeSet类。
List中的对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,如通过list.get(i)方式来获得List集合中的元素。
Map中的每一个元素包含一个键对象和值对象,它们成对出现。键对象不能重复,值对象可以重复。
说出 ArrayList,Vector, LinkedList 的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,查询数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,插入速度较快而查询慢。
HashSet和TreeSet有什么区别:
HashSet中的元素不能重复,没有顺序
TreeSet中的元素不能重复,但有顺序
HashMap 和 Hashtable 的区别
前者允许有空的键和值,而后者不允许;后者线程安全,而前者不安全。
比较下集合和数组的优缺点
集合是多个对象的容器,可以将不同数据类型的多个对象组织在一起
数组类型是有相同数据类型的数据集合,数组是很多语言都支持的底层数据结构,性能上是最高的
在List里面怎么去掉重复的数:通过把List里面的数据放入HashSet可以去除重复
4.Http协议
get与post请求区别?(初级程序员必备问题)
区别一:
get重点在从服务器上获取资源,post重点在向服务器发送数据;
区别二:
get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的;
post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;
区别三:
Get传输的数据量小,因为受URL长度限制,但效率较高;
Post可以传输大量数据,所以上传文件时只能用Post方式;
区别四:
get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;
post较get安全性较高;
区别五:
get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。
post支持标准字符集,可以正确传递中文字符。
https和http有什么区别:前者在后者的基础上进行了加密,传输更安全。
5.javaWeb方面
讲下Servlet的执行流程。doGet和doPost的区别
Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始,然后通过init()方法初始化servlet,再根据不同请求调用doGet或doPost方法,最后再通过destroy()方法进行销毁。
doGet和doPost都是接受用户请求的方法,doGet处理get请求,doPost处理post请求,doGet用于地址栏提交,doPost用于表单提交,在页面提交数据时,get的数据大小有限制4k,post没有限制,get请求提交的数据会在地址栏显示,post不显示,所以post比get安全.
如何处理servlet的线程不安全问题
线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全,所以可以在Servlet的线程里面加上同步方法或同步块。(Synchronized)可以保证在同一时间只有一个线程访问,(其实就是把一个全局变量改为局部变量)
Jsp的九大内置对象,三大指令,七大动作的具体功能
JSP九大内置对象:
pageContext :只对当前jsp页面有效,里面封装了基本的request和session的对象
Request :对当前请求进行封装
Session :浏览器会话对象,浏览器范围内有效
Application :应用程序对象,对整个web工程都有效
Out :页面打印对象,在jsp页面打印字符串
Response :返回服务器端信息给用户
Config :单个servlet的配置对象,相当于servletConfig对象
Page :当前页面对象,也就是this
Exception :错误页面的exception对象,如果指定的是错误页面,这个就是异常对象
三大指令:
Page :指令是针对当前页面的指令
Include :用于指定如何包含另一个页面
Taglib :用于定义和指定自定义标签
七大动作:
Forward,执行页面跳转,将请求的处理转发到另一个页面
Param :用于传递参数
Include :用于动态引入一个jsp页面
Plugin :用于下载javaBean或applet到客户端执行
useBean :使用javaBean
setProperty :修改javaBean实例的属性值
getProperty :获取javaBean实例的属性值
4)获取页面的元素和值有几种方式,分别说一下
request.getParameter() 返回客户端的请求参数的值
6.Java框架部分
说说Spring?
Spring是对j2EE诸多功能进行封装了的一个工具集;它的核心就是提供了一种新的机制来管理业务对象及依赖关系;具体就是控制反转、依赖注入,Aop(面向切面)。
Spring的底层实现机制是什么?
使用Demo4j(解析XML)+Java反射机制
Demo4j 其实就是解析XML。使用反射机制实例化bean。
说SpringIOC、SpringAOP?
SpringIOC ,其实就是依赖注入、控制反转。相当于把每个bean与bean之间的关系交给第三方容器管理。而这个容器就是spring
SpringAOP 面向切面的编程,或AOP,是一种编程技术,允许程序模块化横向切割关注点,或者横切典型的责任划分,主要应用如日志和事务管理。 SpringAop的底层实现机制就是用JDK动态代理:对实现了接口的类生成代理
Spring有那些注解?
@Autowired(按类型注入)
@Service(标示为注入为服务层)
@Resource(按名称注入)
@Controller(标识控制器bean id)
@RequestMapping(表示映射URL路径)
Spring缺点:
使用到了大量反射机制。反射机制非常占内存,
SpringMVC工程流程
1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图
8. 将渲染结果返回给客户端。
SpringMVC工作流程描述
在web.xml文件中配置DispatcherServlet类;SpringMvc工作时主要是通过DispatcherServlet管理接收到的请求并进行处理。
什么是Hibernate?
hibernate是一个基于ORM持久框架,可以让程序员以面向对象的思想操作数据库,提高生产效率.
什么是ORM?
orm不过是一种思想,对象关系映射。是对象关系模型,如hibernate,让你以面向对象的方式去编程。封装了JDBC.
说一下orm与jdbc的区别?
jdbc只是一个java操作数据库的规范接口而已
orm不过是一种思想,对象关系映射。
ORM:是对象关系模型,如hibernate,让你以面向对象的方式去编程。封装了JDBC.
JDBC:是从底层访问数据库服务器。一般银行,金融行业为了安全起见,直接用JDBC访问
Hibernate中get和load有什么不同之处?
load :找不到数据的话会抛出org.hibernate.ObjectNotFoundException异常。此时hibernate会使用延迟加载加载机制
get找不到的话会返回null。
如果查询不到数据,get 会返回 null,但是不会报错, load 如果查询不到数据,则报错ObjectNotFoundException
使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(select ...), 如果你使用的是 load查询数据,(先到一级、二级))即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用查询结果的时候才真的发出select ,这个现象我们称为懒加载(lazy)
什么是Mybatis?
Mybatis的前生是ibatis,最后升级版本后名称叫mybatis。mybatis是以纯sql操作数据。
Mybatis与Hibernate区别?
Hibernate是面向对象的思想操作数据生成Sql语句,而mybatis是以纯sql操作数据
相对于mybatis容易优化.扩展性好,但是移植性差。
MyBatis/Ibatis中#和$的区别
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
3. #方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名.
6.一般能用#的就别用$.
STRUCTS
Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架。
Hibernate
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任
7.设计模式部分
什么是单例?单例有那些写法?
单例分类:懒汉式单例、饿汉式单例
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
①懒汉式单例
1. //懒汉式单例类.在第一次调用的时候实例化自己
2. public class Singleton {
3. private Singleton() {}
4. private static Singleton single=null;
5. //静态工厂方法
6. public static Singleton getInstance () {
7. if (single == null) {
8. single = new Singleton();
9. }
10. return single;
11. }
12. }
②饿汉式单例
13. //饿汉式单例类.在类初始化时,已经自行实例化
14. public class Singleton1 {
15. private Singleton1() {}
16. private static final Singleton1 single = new Singleton1();
17. //静态工厂方法
18. public static Singleton1 getInstance() {
19. return single;
20. }
21. }
懒汉式与饿汉式区别?
从名字上来说,饿汉和懒汉,
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,
而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
另外从以下两点再区分以下这两种方式:
1、线程安全:
饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,
懒汉式本身是非线程安全的,为了实现线程安全有几种写法,分别是上面的1、2、3,这三种实现在资源加载和性能方面有些区别。
2、资源加载和性能:
饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,
而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。
代理模式
工厂模式
8.项目相关
你说说你做的最好的项目?
要重点介绍到①项目是做什么?②用到那些技术?③整个项目中最大的亮点是?核心部分④遇到bug是怎么解决的?
例如: 我认为我做的最好的项目是
.......
使用技术SpringMVC+Mybatis+Spring+Maven,用maven管理jar包,使用tomcat集群减轻单台服务器压力、使用redis缓解高并发请求。
你项目遇到bug?怎么查问题?
例如:首先遇到了bug,会查询日志,通过日志定位到某个类的行数,判断是否有代码问题。
你遇到了什么bug?你是怎么解决?
例如我自己项目中,查询量非常大。通过日志发现了堆内存溢出,最后通过优化代码,减轻new和加大堆内存。
你们项目人员是怎么分配的?
项目分配为:
产品经理(负责提需求)
UI设计师(负责设计样式文件)
Web前端(只做Web页面前端静态文件)
Java工程师(写业务逻辑)
测试人员(负责测试bug)
非技术项目经理(负责项目管理、人员分配)
项目架构师(负责架构项目)
你们项目是怎么发布的?
企业当中项目都是发布在linux环境上
小公司:使用maven编译好通过打war包,放入到tomcat的webapps文件
说说linux常用命令?
Cat 查看某个文件
CP 拷贝
Ls 查看所有列表
Mv 移动文件
Rm 删除文件
Grep 搜索日志
Mkdir 创建目录
9.大数据方面知识
hadoop核心组件有3个:
第一个就 是,GFS(Google File System),一个分布式文件系统,隐藏下层负载均衡,冗余复制等细节,对上层程序提供一个统一的文件系统API接口;
第二个是 MapReduce,Google发现大多数分布式运算可以抽象为MapReduce操作。Map是把输入Input分解成中间的Key/Value 对,Reduce把Key/Value合成最终输出Output。这两个函数由程序员提供给系统,下层设施把Map和Reduce操作分布在集群上运行, 并把结果存储在GFS上;
第三个,BigTable,一个大型的分布式数据库,这个数据库不是关系式的数据库,而是一个巨大的表格,用来存储结构化的数据。
Hadoop组成:
Hadoop框架最核心的设计由两部分组成,分别是分布式文件系统和分布式计算框架。
分布式文件系统Hdfs为海量的数据提供了存储,主要用于大规模数据的分布式存储。
分布式计算框架MapReduce为海量的数据提供了计算,它构建在分布式文件系统之上,对存储在分布式文件系统中的数据进行分布式计算。
Mapreduce设计思想
对付大数据并行处理:分而治之:
一个大数据若可以分为具有同样计算过程的数据块,并且这些数据块之间不存在数据依赖关系,则提高处理速度的最好办法就是采用“分而治之”的策略进行并行化计算。
MapReduce采用了这种“分而治之”的设计思想,对相互间不具有或者有较少数据依赖关系的大数据,用一定的数据划分方法对数据分片,然后将每个数据分片交由一个节点去处理,最后汇总处理结果。
上升到抽象模型:Map与Reduce:
MapReduce借鉴了函数式程序设计语言Lisp的设计思想。
用Map和Reduce两个函数提供了高层的并行编程抽象模型和接口,程序员只要实现这两个基本接口即可快速完成并行化程序的设计。
MapReduce的设计目标是可以对一组顺序组织的数据元素/记录进行处理。
现实生活中,大数据往往是由一组重复的数据元素/记录组成,例如,一个Web访问日志文件数据会由大量的重复性的访问日志构成,对这种顺序式数据元素/记录的处理通常也是顺序式扫描处理。
MapReduce提供了以下的主要功能:
数据划分和计算任务调度:系统自动将一个作业(Job)待处理的大数据划分为很多个数据块,每个数据块对应于一个计算任务(Task),并自动调度计算节点来处理相应的数据块。作业和任务调度功能主要负责分配和调度计算节点(Map节点或Reduce节点),同时负责监控这些节点的执行状态,并负责Map节点执行的同步控制。
数据/代码互定位:为了减少数据通信,一个基本原则是本地化数据处理,即一个计算节点尽可能处理其本地磁盘上所分布存储的数据,这实现了代码向数据的迁移;当无法进行这种本地化数据处理时,再寻找其他可用节点并将数据从网络上传送给该节点(数据向代码迁移),但将尽可能从数据所在的本地机架上寻 找可用节点以减少通信延迟。
MapReduce提供了以下的主要功能2:
系统优化:为了减少数据通信开销,中间结果数据进入Reduce节点前会进行一定的合并处理;一个Reduce节点所处理的数据可能会来自多个Map节点,为了避免Reduce计算阶段发生数据相关性,Map节点输出的中间结果需使用一定的策略进行适当的划分处理,保证相关性数据发送到同一个Reduce节点;此外,系统还进行一些计算性能优化处理,如对最慢的计算任务采用多备份执行、选最快完成者作为结果。
出错检测和恢复:以低端商用服务器构成的大规模MapReduce计算集群中,节点硬件(主机、磁盘、内存等)出错和软件出错是常态,因此 MapReduce需要能检测并隔离出错节点,并调度分配新的节点接管出错节点的计算任务。同时,系统还将维护数据存储的可靠性,用多备份冗余存储机制提 高数据存储的可靠性,并能及时检测和恢复出错的数据
9.以前公司的信息
公司的web服务器什么配置
(1)web服务器由六台服务器组成的weblogic集群,单机配置大约2*8核cpu、64g内存、1T服务器硬盘(可根据情况增加至12台或更多)
(2)数据库单独部署在一个高性能服务器上,和web服务器在一个机房
Mysql版本:5.7.6
Spring版本:4.3.3
基于cs/BS哪个架构:Bs架构
你最近有看什么技术类的书吗:think in java、head first java、java核心技术
职业规划:两年高级java工程师,三年走向人生巅峰,迎娶白富美(不切实际)。