`

alibaba面试题参考答案

阅读更多

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

二、ArrayList、Vector、LinkedList之间的区别

Vector类和ArrayList类的主要不同之处在于同步。除了两个只用于串行化的方法,没有一个ArrayList的方法具有同步执行的能力;相反,Vector的大多数方法具有同步能力,或直接或间接。因此,Vector是线程安全的,ArrayList不是。这使得ArrayList要比Vector快速。对于一些最新的JVM,两个类在速度上的差异可以忽略不计:严格地说,对于这些JVM,这两个类在速度上的差异小于比较这些类性能的测试所显示的时间差异。

通过索引访问和更新元素时,Vector和ArrayList的实现有着卓越的性能,因为不存在除范围检查之外的其他开销。除非内部数组空间耗尽必须进行扩展,否则,向列表的末尾添加元素或者从列表的末尾删除元素时,都同样有着优秀的性能。插入元素和删除元素总是要进行数组复制(当数组先必须进行扩展时,需要两次复制)。被复制元素的数量和[size-index]成比例,即和插入/删除点到集合中最后索引位置之间的距离成比例。对于插入操作,把元素插入到集合最前面(索引0)时性能最差,插入到集合最后面时(最后一个现有元素之后)时性能最好。随着集合规模的增大,数组复制的开销也迅速增加,因为每次插入操作必须复制的元素数量增加了。

从内部实现机制来讲ArrayList和Vector都是使用Objec的数组形式来存储的。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。

在ArrayList的前面或中间插入数据时,必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;

而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。

ArrayList的查询效率比较高,增删动作的效率比较差,适用于查询比较频繁,增删动作较少的元素管理的集合。LinkedList的查询效率低,但是增删效率很高。适用于增删动作的比较频繁,查询次数较少的元素管理集合。

    三、HASHTABLE, HashMap,TreeMap区别
java 为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类。Map是将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射一个一个值。

Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力.

Hashtable 与 HashMap类似,但是主要有6点不同。

1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

2.HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许 key值只能由一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。

3.HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。

4.HashTable使用Enumeration,HashMap使用Iterator。

5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

6.哈希值的使用不同,HashTable直接使用对象的hashCode。

 

package com.taobao.ms; import java.util.Map; import java.util.HashMap; import java.util.Set; import java.util.HashSet; import java.util.Iterator; import java.util.Hashtable; import java.util.TreeMap; class HashMaps { public static void main(String[] args) { Map map=new HashMap(); map.put(“a”, “aaa”); map.put(“b”, “bbb”); map.put(“c”, “ccc”); map.put(“d”, “ddd”); Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { Object key = iterator.next(); System.out.println(“map.get(key) is :”+map.get(key)); } Hashtable tab=new Hashtable(); tab.put(“a”, “aaa”); tab.put(“b”, “bbb”); tab.put(“c”, “ccc”); tab.put(“d”, “ddd”); Iterator iterator_1 = tab.keySet().iterator(); while (iterator_1.hasNext()) { Object key = iterator_1.next(); System.out.println(“tab.get(key) is :”+tab.get(key)); } TreeMap tmp=new TreeMap(); tmp.put(“a”, “aaa”); tmp.put(“b”, “bbb”); tmp.put(“c”, “ccc”); tmp.put(“d”, “ddd”); Iterator iterator_2 = tmp.keySet().iterator(); while (iterator_2.hasNext()) { Object key = iterator_2.next(); System.out.println(“tmp.get(key) is :”+tmp.get(key)); } } }

四、ConcurrentMap和HashMap的区别

五、Tomcat,apache,jboss的区别

Apache:全球应用最广泛的http服务器,免费,出自apache基金组织?
Tomcat: Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目

JBoss:开源的J2EE应用服务器?,JBoss不包括serverlers/JSP page 的WEB容器,但可以和Tomcat或Jetty绑定使用
六、GET POST区别

(1 )get是从服务器上获取数据,post是向服务器传送数据。

(2) 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。

(3) 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

(4) GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

(5) 安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
七、SESSION, COOKIE区别

Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间;

Cookie是客户端的存储空间,由浏览器来维持,具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
八、Servlet的生命周期

 servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet.
九、HTTP 报文包含内容

请求消息 = 请求行(实体头信息)CRLF[实体内容]
请求行 = 方法 URL HTTP版本号 CRLF
方法 = GET|HEAD|POST|扩展方法
URL = 协议名称 + 宿主名 + 目录与文件名

 

十、Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注

PreparedStatement相对Statement有以下优点:

1.防注入攻击

2.多次运行速度快

3.防止数据库缓冲区溢出

4.代码的可读性可维护性好

select count(*) from usertable where name=' ' and pswd=' '
如果在 名字段 ' or '1'='1' or '1'='1
或是在 字段 1' or '1'='1
绕过验证 ,但 这种 手段只 Statement有效, PreparedStatement 无效。


十一、redirect, foward区别

1) 共同点:
都实现了根据自己的条件实现的页面得跳转
(2) 区别

Redirect: URL重新定向,可以是任意的URL; 不能共享request里面的数据 ;一般用于用户注销登录时返回主页面和跳转到其它的网站等等

Forward: 页面的转发,只能是同一个Web应用程序的其他Web组件;转发页面和转发到的页面可以共性request里面的数据;一般用于用户登录的时候根据角色转发到相应的模块等等。

 

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

关键字new出来的东西都是存放在heap segment;100个对象

程序中的局部变量存放在stack segment,这些局部变量是在具体方法执行结束之后,系统自动释放内存资源(而heap segment中的资源需要java垃圾回收机制来处理);属性得看是否都是static,如果都是static,内存中只有2个

程序中的方法,是内存中的code segment中的,而且是多个对象 共享一个代码空间区域;所以内存中方法还是4个

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

一 Hibernate的一级缓存(session内置缓存)。
Hibernate的一级缓存是Hibernate内置的缓存,意思是必须使用的,不可以卸载的。Hibernate的一级缓存实际上就是session级别的缓存,其实现方式是在session的生命周期内缓存访问过的对象,通过key-value这样的数据结构保存在内存中,比如每个session,对同一个id, load两次,只会发送一条sql语句到数据库,第二次直接从一级缓存中找。由于一级缓存只是在session周期范围内有效,因此效果不是很理想。
二 Hibernate的二级缓存(包括sessionFactory内置缓存和外置缓存)

Hibernate的二级缓存,是sessionFactory级别的缓存,也就是进程级别的缓存,跟应用的生命周期一致,Hibernate的二级缓存是可选的缓存配置,缺省状态下,sessionFactory外置缓存是没有开启的,如果需要配置,则用户需要自己进行相关配置.


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

Reflection(反射) 是Java 被视为动态语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。先来解释一下反射,反射是一个生涩的名词,通俗的说反射就是根据给出的类名(字符串)、方法名、属性等信息来生成对象、方法、属性;

一般使用的情况:

1. 得到某个对象的属性
2. 得到某个类的静态属性
3. 执行某对象的方法?
4. 执行某个类的静态方法
5. 新建实例?
6. 判断是否为某个类的实例?

7. 得到数组中的某个元素

反射是一种强大的工具,但也存在一些不足。一个主要的缺点是对性能有影响,二是许多应用更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。

十五、谈谈Hibernate与Ibatis的区别,哪个性能会更高一些

1.ibatis非常简单易学,hibernate相对较复杂,门槛较高。
2.二者都是比较优秀的开源产品
3.当系统属于二次开发,无法对数据库结构做到控制和修改,那ibatis的灵活性将比hibernate更适合
4.系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的sql语句(或存储过程)才能达到系统性能设计指标。在这种情况下ibatis会有更好的可控性和表现。
5.ibatis需要手写sql语句,也可以生成一部分,hibernate则基本上可以自动生成,偶尔会写一些hql。同样的需求,ibatis的工作量比hibernate要大很多。类似的,如果涉及到数据库字段的修改,hibernate修改的地方很少,而ibatis要把那些sql mapping的地方一一修改。
6.以数据库字段一一对应映射得到的po和hibernte这种对象化映射得到的po是截然不同的,本质区别在于这种po是扁平化的,不像hibernate映射的po是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。
7.hibernate现在已经是主流o/r mapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于ibatis。


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

aop cglb实现动态代理 可以在执行真实方法前后加上权限控制日志等代码,代码侵入性低,方便维护

ioc 服务器启动后 读取配置文件 根据文件配置 通过反射实例化对象 放于类似于map中 并根据配置把对象注入到配置的对象中
十七、线程同步,并发操作怎么控制
十八、描述struts的工作流程。

  • 客户端提交一个( HttpServletRequest )请求,如上文在浏览器中输入 http://localhost: 8080/bookcode/ch2/Reg.action 就是提交一个( HttpServletRequest )请求。
  • 请求被提交到一系列(主要是 3 层)的过滤器( Filter ),如( ActionContextCleanUp 、其他过滤器( SiteMesh 等)、 FilterDispatcher )。注意:这里是有顺序的,先 ActionContext CleanUp ,再其他过滤器( Othter Filters SiteMesh 等),最后到 FilterDispatcher
  • FilterDispatcher 是控制器的核心,就是 MVC Struts 2 实现中控制层( Controller )的核心。
  • FilterDispatcher 询问 ActionMapper 是否需要调用某个 Action 来处理这个( HttpServlet Request )请求,如果 ActionMapper 决定需要调用某个 Action FilterDispatcher 则把请求的处理交给 ActionProxy
  • ActionProxy 通过 Configuration Manager struts.xml )询问框架的配置文件,找到需要调用的 Action 类。例如,用户注册示例将找到 UserReg 类。
  • ActionProxy 创建一个 ActionInvocation 实例,同时 ActionInvocation 通过代理模式调用 Action 。但在调用之前, ActionInvocation 会根据配置加载 Action 相关的所有 Interceptor (拦截器)。
  • 一旦 Action 执行完毕, ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果 result

Struts 2 的核心控制器是 FilterDispatcher ,有 3 个重要的方法: destroy() doFilter() Init() ,可以在 Struts 2 的下载文件夹中找到源代码 .

doFilter() 方法中,将调用 dispatcher.serviceAction ,该方法如果找到相应的 Action ,将把用户请求交给 ActionProxy serviceAction() 代码在 Dispatcher.java .

从上面代码中可以看出来, Struts 2 用于处理用户请求的 Action 实例,并不是用户实现的业务控制器,而是 Action 代理。关于 Action 代理相关内容,读者可以参考拦截器章节的介绍。

前面一直在说 Action 可以是一个普通的 Java 类,与 Servlet API 完全分离,但是为了实现业务逻辑, Action 需要使用 HttpServletRequest 内容。

Struts 2 设计的精巧之处就是使用了 Action 代理, Action 代理可以根据系统的配置,加载一系列的拦截器,由拦截器将 HttpServletRequest 参数解析出来,传入 Action 。同样, Action 处理的结果也是通过拦截器传入 HttpServletResponse ,然后由 HttpServletRequest 传给用户。

其实,该处理过程是典型的 AOP (面向切面编程)的方式。 Struts 2 处理过程模型如图所示

拦截器是 Struts 2 框架的核心,通过拦截器,实现了 AOP (面向切面编程)。使用拦截器,可以简化 Web 开发中的某些应用,例如,权限拦截器可以简化 Web 应用中的权限检查。

业务控制器 Action
业务控制器 Action 是由开发者自己编写实现的, Action 类可以是一个简单的 Java 类,与 Servlet API 完全分离。 Action 一般都有一个 execute() 方法,也可以定义其他业务控制方法,详细内容将在后面介绍。

Action
execute() 返回一个 String 类型值,这与 Struts 1 返回的 ActionForward 相比,简单易懂。 Struts 2 提供了一个 ActionSupport 工具类,该类实现了 Action 接口和 validate() 方法,一般开发者编写 Action 可以直接继承 ActionSupport 类。编写 Action 类后,开发者还必须在配置文件中配置 Action 。一个 Action 的配置应该包含下面几个元素:

  • 1 、该 Action name ,即用户请求所指向的 URL
  • 2 Action 所对应的 class 元素,对应 Action 类的位置。
  • 3 、指定 result 逻辑名称和实际资源的定位。

 

Action 是业务控制器,笔者建议在编写 Action 的时候,尽量避免将业务逻辑放到其中,尽量减少 Action 与业务逻辑模块或者组件的耦合程度。

 


十九、Tomcat的session处理,如果让你实现一个tomcatserver,如何实现session机制

cookie中存放jsessionid 服务器解析 以key-value 将session对象存放与服务器线程同步的map

开启一个线程轮训map中发现超时对象就删除

添加监听器来检测session产生和销毁
二十、关于Cache(Ehcache,Memcached)
二一、sql的优化相关问题

二二、oracle中 rownum与rowid的理解,一千条记录我查200到300的记录怎么查?
二三、如何分析ORACLE的执行计划?

二四、 DB中索引原理,种类,使用索引的好处和问题是什么?

索引类似于书的目录,主要用于提高查询效率,也就是按条件查询的时候,先查询索引,再通过索引找到相关的数据,索引相当于记录了对某个关键词,指定到不同的文件,或者文件里的不同位置,当然索引自身也是通过文件来保存的。

有两种基本的索引结构,也就是索引文件的保存方式,一个是顺序索引,就是根据值的顺序排序的(这个文件里面的值,也就是为其建索引的字段值,是顺序的放在索引文件里面),另外一个是散列索引,就是将值平均分配到若干散列桶中,通过散列函数定位的。

好处:1、能够提高数据检索的效率,降低数据库的IO成本2、降低数据的排序成本

问题:索引是完全独立于基础数据之外的一部分数据,某表建立索引后,之后添加数据等都会更新索引的数据,所以索引会带来存储空间资源消耗的增加
二五、JVM垃圾回收实现原理。垃圾回收的线程优先级。

垃圾回收机制
1.没有用且被应用程序占用的内存空间。
2.java中把垃圾称为无用内存。
3.java当中的无用内存指的是无用对象,所谓的无用对象也就是没有引用的对象。也就是在程序用通过任何方式都没有办法访问到的对象。
4.java中提供一个垃圾回收线程对应用程序中的无用对象进行自动回收。
进程:在操作系统的范畴之内,指的是独立的任务。在软件开发中,进程指的是一个是独立的应用程序。
线程:一个完整的进程被合理的分割成可以独立运行的不能再分的小任务,这些可以独立运行的小任务称为线程。线程是可以"同时"运行的。5.垃圾回收的算法(应用范围:c/c++/java)

(1)标记-清扫(mark-swap)
垃圾收集线程对应用程序所占用的内存空间做周期性的扫描,扫描到某一内存节点的时候会遍历所有的可访问路径,如果通过任何路径都不能到达应用程序,将对本节做标记,当满足垃圾收集条件的时候一次性的把做标记的节点进行回收。
(2)内存挪移法:(from-to)
在from和to区之间做数据的整批拷贝和整理
java的垃圾收集线程在垃圾收集的时候会根据当前的内存情况做相应的判断,以确定用最适合的算法。

6.垃圾收集的优先级是非常低的。几乎低于所有的线程。因此大部分时间都处于等待状态。只有两种情况下启动:(1)内存紧张(2)系统闲置

7.评价垃圾收集的线程:
优点:自动内存回收,程序员可以从内存管理的代码中彻底解放出来。
缺点:(1)不知道什么时候开始回收 (2) 也无法控制它回收到什么程度。从某种意义上来讲,程序员根本      无法控制垃圾收集线程。

8.System.gc();仅仅起到通知垃圾收集器进行回收的作用,至于垃圾收集器是否回收仍然取决于"问题6"所列出的垃圾回收的条件。因此,System.gc()方法对是否垃圾收集起不到任何作用。


二六、jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。

如二五题

 

 

二七、事务的特性

 

1、一致性:将事务中所做的操作捆绑成一个原子单元,即对于事务所进行的数据修改等操作,要么全部执行,要么全部不执行。

2、原子性:事务在完成时,必须使所有的数据都保持一致状态,而且在相关数据中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构都应该是正确的。

3、隔离性:由并发事务所做的修改必须与任何其他事务所做的修改相隔离。事务查看数据时数据所处的状态,要么是被另一并发事务修改之前的状态,要么是被另一并发事务修改之后的状态,即事务不会查看由另一个并发事务正在修改的数据。这种隔离方式也叫可串行性。

4、持久性:事务完成之后,它对系统的影响是永久的,即使出现系统故障也是如此。

 

 

 

 

 JVM什么时候会触发GC、Hashmap是什么结构储存数据的、IOC和DI有什么区别

 

  • 大小: 24 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics