阿里云面试题

转自:https://yq.aliyun.com/articles/6656html

今天为你们分享的是《阿里巴巴常考面试题及汇总答案(上篇)》java

原文以下:程序员


1、String,StringBuffer, StringBuilder 的区别是什么?String为何是不可变的?web

答:面试

1String是字符串常量,StringBufferStringBuilder都是字符串变量。后二者的字符内容可变,而前者建立后内容不可变。sql

2String不可变是由于在JDKString类被声明为一个final类。数据库

3StringBuffer是线程安全的,而StringBuilder是非线程安全的。编程

ps:线程安全会带来额外的系统开销,因此StringBuilder的效率比StringBuffer高。若是对系统中的线程是否安全很掌握,可用StringBuffer,在线程不安全处加上关键字Synchronize设计模式

 

2、Vector,ArrayList, LinkedList的区别是什么?数组

答:

1VectorArrayList都是以相似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。

2List中的元素有序、容许有重复的元素,Set中的元素无序、不容许有重复元素。

3Vector线程同步,ArrayListLinkedList线程不一样步。

4LinkedList适合指定位置插入、删除操做,不适合查找;ArrayListVector适合查找,不适合指定位置的插入、删除操做。

5ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,所以ArrayList更节省空间。

详见:连接

 

3、HashTable, HashMapTreeMap区别?

答:   

1HashTable线程同步,HashMap非线程同步。

2HashTable不容许<,>有空值,HashMap容许<,>有空值。

3HashTable使用EnumerationHashMap使用Iterator

4HashTablehash数组的默认大小是11,增长方式的old*2+1HashMaphash数组的默认大小是16,增加方式必定是2的指数倍。

5TreeMap可以把它保存的记录根据键排序,默认是按升序排序。

详见:连接


小编注:为何没有第四题不要问我...学姐没写


5、TomcatApacheJBoss的区别?

答:   

1ApacheHttp服务器,Tomcatweb服务器,JBoss是应用服务器。

2Apache解析静态的html文件;Tomcat可解析jsp动态页面、也可充当servlet容器。

详见:连接

 

6、GETPOST区别?

答:   

基础知识:Http的请求格式以下。

<request line>   主要包含三个信息:1、请求的类型(GETPOST),2、要访问的资源(如\res\img\a.jif),3Http版本(http/1.1

<header>        用来讲明服务器要使用的附加信息

<blank line>      这是Http的规定,必须空一行

[<request-body>]   请求的内容数据

区别:

1Get是从服务器端获取数据,Post则是向服务器端发送数据。

2、在客户端,Get方式经过URL提交数据,在URL地址栏能够看到请求消息,该消息被编码过;Post数据则是放在Html header内提交。

3、对于Get方式,服务器端用Request.QueryString获取变量的值;对用Post方式,服务器端用Request.Form获取提交的数据值。

4Get方式提交的数据最多1024字节,而Post则没有限制。

5Get方式提交的参数及参数值会在地址栏显示,不安全,而Post不会,比较安全。

详见:连接

 

7、Session, Cookie区别

答:  

1Session由应用服务器维护的一个服务器端的存储空间;Cookie是客户端的存储空间,由浏览器维护。

2、用户能够经过浏览器设置决定是否保存Cookie,而不能决定是否保存Session,由于Session是由服务器端维护的。

3Session中保存的是对象,Cookie中保存的是字符串。

4SessionCookie不能跨窗口使用,每打开一个浏览器系统会赋予一个SessionID,此时的SessionID不一样,若要完成跨浏览器访问数据,可使用 Application

5SessionCookie都有失效时间,过时后会自动删除,减小系统开销。

详见:连接

 

8、Servlet的生命周期

答: 

大体分为4部:Servlet类加载-->实例化-->服务-->销毁

下图是TomcatServlet时序图。

066a9be145a35a948ef24567cd19f5c15fe35fca

1Web ClientServlet容器(Tomcat)发出Http请求。

2Servlet容器接收Client端的请求。

3Servlet容器建立一个HttpRequest对象,将Client的请求信息封装到这个对象中。

4Servlet建立一个HttpResponse对象。

5Servlet调用HttpServlet对象的service方法,把HttpRequest对象和HttpResponse对象做为参数传递给HttpServlet对象中。

6HttpServlet调用HttpRequest对象的方法,获取Http请求,并进行相应处理。

7、处理完成HttpServlet调用HttpResponse对象的方法,返回响应数据。

8Servlet容器把HttpServlet的响应结果传回客户端。


其中的3个方法说明了Servlet的生命周期:

1init():负责初始化Servlet对象。

2service():负责响应客户端请求。

3destroy():当Servlet对象推出时,负责释放占用资源。

详见:连接

 

9、HTTP 报文包含内容

答:   

主要包含四部分:

1request line

2header line

3blank line

4request body

详见:连接

 

10、StatementPreparedStatement的区别,什么是SQL注入,如何防止SQL注入

答:  

1PreparedStatement支持动态设置参数,Statement不支持。

2PreparedStatement可避免如相似 单引号 的编码麻烦,Statement不能够。

3PreparedStatement支持预编译,Statement不支持。

4、在sql语句出错时PreparedStatement不易检查,而Statement则更便于查错。

5PreparedStatement可防止Sql助于,更加安全,而Statement不行。

 详见:连接

 

什么是SQL注入: 经过sql语句的拼接达到无参数查询数据库数据目的的方法。

 将要执行的sql语句为 select * from table where name = "+appName+",利用appName参数值的输入,来生成恶意的sql语句,如将['or'1'='1'] 传入可在数据库中执行。

 所以能够采用PrepareStatement来避免Sql注入,在服务器端接收参数数据后,进行验证,此时PrepareStatement会自动检测,而Statement行,须要手工检测。


11、sendRedirect, foward区别

答:   

1foward是服务器端控制页面转向,在客户端的浏览器地址中不会显示转向后的地址;sendRedirect则是彻底的跳转,浏览器中会显示跳转的地址并重新发送请求连接。

原理:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而后再将这些内容返回给浏览器,浏览器根本不知道服务器发送的这些内容是从哪来的,因此地址栏仍是原来的地址。

redirect是服务器端根据逻辑,发送一个状态码,告诉浏览器从新去请求的那个地址,浏览器会用刚才的全部参数从新发送新的请求。

详见:连接

 

12、关于JAVA内存模型,一个对象(两个属性,四个方法)实例化100次,如今内存中的存储状态,几个对象,几个属性,几个方法。

答:   

因为JAVAnew出来的对象都是放在堆中,因此若是要实例化100次,将在堆中产生100个对象,通常对象与其中的属性、方法都属于一个总体,但若是         属性和方法是静态的,就是用static关键字声明的,那么属于类的属性和方法永远只在内存中存在一份。

详见:连接

 

十3、谈谈Hibernate的理解,一级和二级缓存的做用,在项目中Hibernate都是怎么使用缓存的。

答:

Hibernate是一个开发的对象关系映射框架(ORM)。它对JDBC进行了很是对象封装,Hibernate容许程序员采用面向对象的方式来操做关系数据库。

Hibernate的优势:

1、程序更加面向对象

2、提升了生产率

3、方便移植

4、无入侵性。

缺点:

1、效率比JDBC略差

2、不适合批量操做

3、只能配置一种关联关系

Hibernate有四种查询方式:

1getload方法,根据id号查询对象。

2Hibernate query language

3、标准查询语言

4、经过sql查询

Hibernage工做原理:

1、配置hibernate对象关系映射文件、启动服务器

2、服务器经过实例化Configuration对象,读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表以及表之间的映射关系。

3、经过实例化的Configuration对象创建SeesionFactory实例,经过SessionFactory实例建立Session对象。

4、经过Seesion对象完成数据库的增删改查操做。

Hibernate中的状态转移

临时状态(transient

1、不处于session缓存中

2、数据库中没有对象记录

java是如何进入临时状态的:1、经过new语句建立一个对象时。2、刚调用sessiondelete方法时,从seesion缓存中删除一个对象时。

持久化状态(persisted)

1、处于session缓存中

2、持久化对象数据库中没有对象记录

3seesion在特定的时刻会保存二者同步

java如何进入持久化状态:1seesionsave()方法。2seesionload().get()方法返回的对象。3seesionfind()方法返回的list集合中存放的对象。4Sessionupdate().save()方法。

流离状态(detached

1、再也不位于session缓存中

2、游离对象由持久化状态转变而来,数据库中尚未相应记录。

java如何进入流离状态:1Sessionclose()Sessionevict()方法,从缓存中删除一个对象。

具体以下图所示:

76b1792dc71a9761216a0547c0d156aa8a4ecd43

Hibernate中的缓存主要有Session缓存(一级缓存)和SessionFactory缓存(二级缓存,通常由第三方提供)。

详见:连接1     连接2

 

十4、反射讲一讲,主要是概念,都在哪须要反射机制,反射的性能,如何优化

答:  

反射机制的定义:

是在运行状态中,对于任意的一个类,都可以知道这个类的全部属性和方法,对任意一个对象都可以经过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制。

反射的做用:

1、动态地建立类的实例,将类绑定到现有的对象中,或从现有的对象中获取类型。

2、应用程序须要在运行时从某个特定的程序集中载入一个特定的类

详见:连接

 

十5、谈谈HibernateIbatis的区别,哪一个性能会更高一些

答:   

1Hibernate偏向于对象的操做达到数据库相关操做的目的;而ibatis更偏向于sql语句的优化。

2Hibernate的使用的查询语句是本身的hql,而ibatis则是标准的sql语句。

3Hibernate相对复杂,不易学习;ibatis相似sql语句,简单易学。

性能方面:

1、若是系统数据处理量巨大,性能要求极为苛刻时,每每须要人工编写高性能的sql语句或存错过程,此时ibatis具备更好的可控性,所以性能优于Hibernate

2、一样的需求下,因为hibernate能够自动生成hql语句,而ibatis须要手动写sql语句,此时采用Hibernate的效率高于ibatis
详见:连接1     连接2

 

十6、对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理

答:  

Spring是一个开源框架,处于MVC模式中的控制层,它能应对需求快速的变化,其主要缘由它有一种面向切面编程(AOP)的优点,其次它提高了系统性能,由于经过依赖倒置机制(IOC),系统中用到的对象不是在系统加载时就所有实例化,而是在调用到这个类时才会实例化该类的对象,从而提高了系统性能。这两个优秀的性能使得Spring受到许多J2EE公司的青睐,如阿里里中使用最多的也是Spring相关技术。

Spring的优势:

1、下降了组件之间的耦合性,实现了软件各层之间的解耦。

2、可使用容易提供的众多服务,如事务管理,消息服务,日志记录等。

3、容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。

SpringAOP技术是设计模式中的动态代理模式。只需实现jdk提供的动态代理接口InvocationHandler,全部被代理对象的方法都由InvocationHandler接管实际的处理任务。面向切面编程中还要理解切入点、切面、通知、织入等概念。

SpringIOC则利用了Java强大的反射机制来实现。所谓依赖注入即组件之间的依赖关系由容器在运行期决定。其中依赖注入的方法有两种,经过构造函数注入,经过set方法进行注入。

详见:连接1   连接2

 

十7、线程同步,并发操做怎么控制 

答:   

Java中可在方法名前加关键字syschronized来处理当有多个线程同时访问共享资源时候的问题。syschronized至关于一把锁,当有申请者申请该

资源时,若是该资源没有被占用,那么将资源交付给这个申请者使用,在此期间,其余申请者只能申请而不能使用该资源,当该资源被使用完成后将释放该资源上的锁,其余申请者可申请使用。

并发控制主要是为了多线程操做时带来的资源读写问题。若是不加以空间可能会出现死锁,读脏数据、不可重复读、丢失更新等异常。

并发操做能够经过加锁的方式进行控制,锁又可分为乐观锁和悲观锁。

悲观锁:

悲观锁并发模式假定系统中存在足够多的数据修改操做,以至于任何肯定的读操做均可能会受到由个别的用户所制造的数据修改的影响。也就是说悲观锁假定冲突总会发生,经过独占正在被读取的数据来避免冲突。可是独占数据会致使其余进程没法修改该数据,进而产生阻塞,读数据和写数据会相互阻塞。

乐观锁:

乐观锁假定系统的数据修改只会产生很是少的冲突,也就是说任何进程都不大可能修改别的进程正在访问的数据。乐观并发模式下,读数据和写数据之间不会发生冲突,只有写数据与写数据之间会发生冲突。即读数据不会产生阻塞,只有写数据才会产生阻塞。

详见:连接1      连接2

 

十8、描述struts的工做流程

答:   

1、在web应用启动时,加载并初始化ActionServletActionServletstruts-config.xml文件中读取配置信息,将它们存放到各个配置对象中。

2、当ActionServlet接收到一个客户请求时,首先检索和用户请求相匹配的ActionMapping实例,若是不存在,就返回用户请求路径无效信息。

3、若是ActionForm实例不存在,就建立一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。

4、根据配置信息决定是否须要验证表单,若是须要,就调用ActionFormvalidate()方法,若是ActionFormvalidate()方法返回null或返回一个不包含ActionMessageActionErrors对象,就表示表单验证成功。

5ActionServlet根据ActionMapping实例包含的映射信息决定请求转发给哪一个Action,若是相应的Action实例不存在,就先建立一个实例,而后调用Actionexecute()方法。

6Actionexecute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。

7ActionForward对象指向的JSP组件生成动态网页,返回给客户。


天哪噜,Java方向的面试题还有不少呢。不过放在同一篇里你们容易看累了吧,好了,欲知后事,请你们看《阿里巴巴常考面试题及汇总答案(Java方向)下篇》。



阿里云技术专场招聘会-Java已经启动,特邀数位Java大牛担任面试官,两个工做日内高效回复。欢迎感兴趣的同窗们来报名!连接点这里!!!