作为一个初中级程序员,你到底掌握了什么技能?

最近一直在面试,结合蚂蚁课堂的材料,对以前所学的java做了下总结:

    JAVA基础部分

            JAVA多线程

            集合框架

             JAVAWEB

             HTTP通信

             J2EE框架

             设计模式

             项目讲解

             项目中遇到的问题,如何解决,亮点

             项目发布环境

             项目人员分配

             最近学的新技术

             以后的打算

             HADOOP,HDFS,MAPREDUCE,LINUX

 

一.Java初中级程序员必备技能

 

1.熟悉java基础、面向对象、jvmio流、多线程、集合框架

2.熟悉jspservletSpringHibernateSpringMvc

3.熟悉Http协议、SocketwebService及网络编程

4.Mavenlinux常用命令

5.项目相关知识

 

二.面试官会问到那些问题

1.java基础方面:

 

使用final修饰对象

是指对象的内存地址不变,而其内容可以被改变

 

静态变量与实例变量区别

运行时区别,前者类加载完成时,其变量就已分配内存地址,而后者需在类实例化后,才会被分配空间

 

==”与equals的区别

数据为基本数据类型时没区别,都是比较变量值内容相等,而当数据类型为引用数据类型时,前者比较的是引用数据的内存地址,而后者仍比较的是值。

 

Intinteger的区别

一个是基本数据类型,一个是引用数据类型,前者默认值为0.后者为null

 

重载与重写的区别

前者是在一个类中,方法名相同,但参数个数or类型不同时称为方法的重载。后者是在有继承关系的两个类中,子类方法与父类方法相同的情况。

 

接口与抽象类的区别

定义的关键字不同;接口中不能有普通方法,抽象类中可以有普通方法。

 

String字符串常量StringBuffer字符串变量,线程安全;Stringbuilder字符串变量,线程不安全;

 

数组没有length()方法,但有length属性;Stringlength()方法。

运行时异常与一般异常有何区别?前者是运行时出现的异常,后者是在编译期出现的异常。

 

2.Java多线程方面:

1什么是多线程?

在一个应用程序中,同时,有多个不同的执行路径。多线程的作用是提升程序效率。

2线程和进程有什么区别?:线程是进程的一条执行路径,而进程是线程的集合。

3什么是线程同步、异步?

线程同步表示,当前线程执行完后下一个线程接着执行。

线程异步表示,  在一个应用程序中,同时,有多个不同的执行路径。例如javaweb ajax android handler

4线程之间如何同步:线程之间同步使用 synchronizedwaitnotify

5什么是线程不安全?如何解决?(重点):就是在多个线程共享同一个数据会受到其他线程的干扰。如何解决:使用线程同步技术, 用上锁(synchronized)。 让一个线程执行完了,在让另一个线程执行。

6如何创建一个线程?有几种方法:继承thread类, 重写run方法、实现Runnalbe接口,重新run方法 , 启动一个线程用start();

7是使用Runnalbe接口好?还是继承Thread类好:是实现Runnalbe接口好,因为实现的接口还可以继续继承。如果继承了Thread类不能在继承。

 

3.集合框架方面

List SetMap 区别:都是接口,它们有各自的实现类。Set的实现类主要有HashSetTreeSetList的实现类主要有ArrayListLinkedListMap的实现类主要有HashMapTreeMap

Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对象按特定方式排序,例如TreeSet类。

List中的对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,如通过list.get(i)方式来获得List集合中的元素。

Map中的每一个元素包含一个键对象和值对象,它们成对出现。键对象不能重复,值对象可以重复。

 

说出 ArrayList,Vector, LinkedList 的存储性能和特性 

ArrayListVector都是使用数组方式存储数据,查询数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,插入速度较快而查询慢。

 

HashSetTreeSet有什么区别:

 HashSet中的元素不能重复,没有顺序

TreeSet中的元素不能重复,但有顺序

 

HashMap  Hashtable 的区别

  前者允许有空的键和值,而后者不允许;后者线程安全,而前者不安全。

 

比较下集合和数组的优缺点

 集合是多个对象的容器,可以将不同数据类型的多个对象组织在一起

数组类型是有相同数据类型的数据集合,数组是很多语言都支持的底层数据结构,性能上是最高的

 

List里面怎么去掉重复的数:通过把List里面的数据放入HashSet可以去除重复

 

4.Http协议

getpost请求区别?(初级程序员必备问题)

区别一:

  get重点在从服务器上获取资源,post重点在向服务器发送数据;

区别二:

   get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin这个过程用户是可见的;

post传输数据通过Httppost机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;

区别三:

   Get传输的数据量小,因为受URL长度限制,但效率较高;

Post可以传输大量数据,所以上传文件时只能用Post方式;

区别四:

   get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;

postget安全性较高;

区别五:

   get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。

post支持标准字符集,可以正确传递中文字符。

 

httpshttp有什么区别:前者在后者的基础上进行了加密,传输更安全。

 

5.javaWeb方面

讲下Servlet的执行流程。doGetdoPost的区别

  Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始,然后通过init()方法初始化servlet,再根据不同请求调用doGetdoPost方法,最后再通过destroy()方法进行销毁。

doGetdoPost都是接受用户请求的方法,doGet处理get请求,doPost处理post请求,doGet用于地址栏提交,doPost用于表单提交,在页面提交数据时,get的数据大小有限制4kpost没有限制,get请求提交的数据会在地址栏显示,post不显示,所以postget安全.

 

如何处理servlet的线程不安全问题

线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全,所以可以在Servlet的线程里面加上同步方法或同步块。(Synchronized)可以保证在同一时间只有一个线程访问,(其实就是把一个全局变量改为局部变量)

 

Jsp的九大内置对象,三大指令,七大动作的具体功能

JSP九大内置对象:

pageContext :只对当前jsp页面有效,里面封装了基本的requestsession的对象
Request :对当前请求进行封装
Session :浏览器会话对象,浏览器范围内有效
Application :应用程序对象,对整个web工程都有效
Out :页面打印对象,在jsp页面打印字符串
Response :返回服务器端信息给用户
Config :单个servlet的配置对象,相当于servletConfig对象
Page :当前页面对象,也就是this
Exception :错误页面的exception对象,如果指定的是错误页面,这个就是异常对象

三大指令:

Page :指令是针对当前页面的指令
Include :用于指定如何包含另一个页面
Taglib :用于定义和指定自定义标签

七大动作:

Forward,执行页面跳转,将请求的处理转发到另一个页面
Param :用于传递参数
Include :用于动态引入一个jsp页面
Plugin :用于下载javaBeanapplet到客户端执行
useBean :使用javaBean
setProperty :修改javaBean实例的属性值
getProperty :获取javaBean实例的属性值

4)获取页面的元素和值有几种方式,分别说一下

request.getParameter() 返回客户端的请求参数的值

 

6.Java框架部分

说说Spring

Spring是对j2EE诸多功能进行封装了的一个工具集;它的核心就是提供了一种新的机制来管理业务对象及依赖关系;具体就是控制反转、依赖注入,Aop(面向切面)

 

Spring的底层实现机制是什么?

使用Demo4j(解析XML)+Java反射机制

Demo4j 其实就是解析XML。使用反射机制实例化bean。

 

SpringIOCSpringAOP?

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.

 

说一下ormjdbc的区别?

jdbc只是一个java操作数据库的规范接口而已

orm不过是一种思想,对象关系映射。

ORM:是对象关系模型,如hibernate,让你以面向对象的方式去编程。封装了JDBC.

JDBC:是从底层访问数据库服务器。一般银行,金融行业为了安全起见,直接用JDBC访问

Hibernategetload有什么不同之处

load :找不到数据的话会抛出org.hibernate.ObjectNotFoundException异常。此时hibernate会使用延迟加载加载机制

 get找不到的话会返回null。 

如果查询不到数据,get 会返回 null,但是不会报错, load 如果查询不到数据,则报错ObjectNotFoundException

使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(select ...), 如果你使用的是 load查询数据,(先到一级、二级))即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用查询结果的时候才真的发出select ,这个现象我们称为懒加载(lazy)

 

什么是Mybatis

Mybatis的前生是ibatis,最后升级版本后名称叫mybatis。mybatis是以纯sql操作数据。

MybatisHibernate区别?

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工程师,三年走向人生巅峰,迎娶白富美(不切实际)。

 


你可能感兴趣的:(工作面试)