阿⾥巴巴常考⾯试题及汇总答案
原⽂地址:
⼀、String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?
答: 1、String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后两者的字符内容可变,⽽前者创建后内容不可变。
2、String不可变是因为在JDK中String类被声明为⼀个final类。
3、StringBuffer是线程安全的,⽽StringBuilder是⾮线程安全的。
ps:线程安全会带来额外的系统开销,所以StringBuilder的效率⽐StringBuffer⾼。如果对系统中的线程是否安全很掌握,可⽤StringBuffer,在线程不安全处加上关键字Synchronize。
⼆、Vector,ArrayList, LinkedList的区别是什么?
答: 1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进⾏存储。
2、List中的元素有序、允许有重复的元素,Set中的元素⽆序、不允许有重复元素。
3、Vector线程同步,ArrayList、LinkedList线程不同步。
4、LinkedList适合指定位置插⼊、删除操作,不适合查;ArrayList、Vector适合查,不适合指定位置的插⼊、删除操作。
5、ArrayList在元素填满容器时会⾃动扩充容器⼤⼩的50%,⽽Vector则是100%,因此ArrayList更节省空间。
三、HashTable, HashMap,TreeMap区别?
答: 1、HashTable线程同步,HashMap⾮线程同步。
2、HashTable不允许<;键,值>有空值,HashMap允许<;键,值>有空值。
3、HashTable使⽤Enumeration,HashMap使⽤Iterator。
4、HashTable中hash数组的默认⼤⼩是11,增加⽅式的old*2+1,HashMap中hash数组的默认⼤⼩是16,增长⽅式⼀定是2的指数倍。
5、TreeMap能够把它保存的记录根据键排序,默认是按升序排序。
五、Tomcat,Apache,JBoss的区别?
答: 1、Apache是Http服务器,Tomcat是web服务器,JBoss是应⽤服务器。
2、Apache解析静态的html⽂件;Tomcat可解析jsp动态页⾯、也可充当servlet容器。
六、GET,POST区别?
答:基础知识:Http的请求格式如下。
<request line> 主要包含三个信息:1、请求的类型(GET或POST),2、要访问的资源(如\res\img\a.jif),3、Http版本(http/1.1)
<header> ⽤来说明服务器要使⽤的附加信息
<blank line> 这是Http的规定,必须空⼀⾏
[<request-body>] 请求的内容数据
区别:
1、Get是从服务器端获取数据,Post则是向服务器端发送数据。
2、在客户端,Get⽅式通过URL提交数据,在URL地址栏可以看到请求消息,该消息被编码过;Post数据则是放在Html header内提交。
3、对于Get⽅式,服务器端⽤Request.QueryString获取变量的值;对⽤Post⽅式,服务器端⽤Request.Form获取提交的数据值。
4、Get⽅式提交的数据最多1024字节,⽽Post则没有限制。
5、Get⽅式提交的参数及参数值会在地址栏显⽰,不安全,⽽Post不会,⽐较安全。
七、Session, Cookie区别
答: 1、Session由应⽤服务器维护的⼀个服务器端的存储空间;Cookie是客户端的存储空间,由浏览器维护。
2、⽤户可以通过浏览器设置决定是否保存Cookie,⽽不能决定是否保存Session,因为Session是由服务器端维护的。
3、Session中保存的是对象,Cookie中保存的是字符串。
4、Session和Cookie不能跨窗⼝使⽤,每打开⼀个浏览器系统会赋予⼀个SessionID,此时的SessionID不同,若要完成跨浏览器访问数据,可以使⽤
Application。
5、Session、Cookie都有失效时间,过期后会⾃动删除,减少系统开销。
⼋、Servlet的⽣命周期
答:⼤致分为4部:Servlet类加载-->实例化-->服务-->销毁
下图是Tomcat中Servlet时序图。
1、Web Client向Servlet容器(Tomcat)发出Http请求。
2、Servlet容器接收Client端的请求。
3、Servlet容器创建⼀个HttpRequest对象,将Client的请求信息封装到这个对象中。
4、Servlet创建⼀个HttpResponse对象。
5、Servlet调⽤HttpServlet对象的service⽅法,把HttpRequest对象和HttpResponse对象作为参数传递给HttpServlet对象中。
6、HttpServlet调⽤HttpRequest对象的⽅法,获取Http请求,并进⾏相应处理。
7、处理完成HttpServlet调⽤HttpResponse对象的⽅法,返回响应数据。
8、Servlet容器把HttpServlet的响应结果传回客户端。
其中的3个⽅法说明了Servlet的⽣命周期:
1、init():负责初始化Servlet对象。
2、service():负责响应客户端请求。
3、destroy():当Servlet对象推出时,负责释放占⽤资源。
九、HTTP 报⽂包含内容
答:主要包含四部分:
2、header line
3、blank line
4、request body
⼗、Statement与PreparedStatement的区别,什么是SQL注⼊,如何防⽌SQL注⼊
答: 1、PreparedStatement⽀持动态设置参数,Statement不⽀持。
2、PreparedStatement可避免如类似单引号的编码⿇烦,Statement不可以。
3、PreparedStatement⽀持预编译,Statement不⽀持。
4、在sql语句出错时PreparedStatement不易检查,⽽Statement则更便于查错。
5、PreparedStatement可防⽌Sql助于,更加安全,⽽Statement不⾏。
什么是SQL注⼊:
通过sql语句的拼接达到⽆参数查询数据库数据⽬的的⽅法。
如将要执⾏的sql语句为 select * from table where name = "+appName+",利⽤appName参数值的输⼊,来⽣成恶意的sql语句,如将['or'1'='1'] 传⼊可在数据库中执⾏。
因此可以采⽤PrepareStatement来避免Sql注⼊,在服务器端接收参数数据后,进⾏验证,此时PrepareStatement会⾃动检测,⽽Statement不⾏,需要⼿⼯检测。
⼗⼀、sendRedirect, foward区别
答: 1、foward是服务器端控制页⾯转向,在客户端的浏览器地址中不会显⽰转向后的地址;sendRedirect则是完全的跳转,浏览器中会显⽰跳转的地址并重新发送请求链接。
原理:forward是服务器请求资源,服务器直接访问⽬标地址的URL,把那个URL的响应内容读取过来,然后再将这些内容返回给浏览器,浏览器根本不知道服务器发送的这些内容是从哪来的,所以地址栏还是原来的地址。
redirect是服务器端根据逻辑,发送⼀个状态码,告诉浏览器重新去请求的那个地址,浏览器会⽤刚才的所有参数重新发送新的请求。
⼗⼆、关于JAVA内存模型,⼀个对象(两个属性,四个⽅法)实例化100次,现在内存中的存储状态,⼏个对象,⼏个属性,⼏个⽅法。
答:由于JAVA中new出来的对象都是放在堆中,所以如果要实例化100次,将在堆中产⽣100个对象,⼀般对象与其中的属性、⽅法都属于⼀个整体,但如果属性和⽅法是静态的,就是⽤static关键字声明的,那么属于类的属性和⽅法永远只在内存中存在⼀份。
⼗三、谈谈Hibernate的理解,⼀级和⼆级缓存的作⽤,在项⽬中Hibernate都是怎么使⽤缓存的。
答: Hibernate是⼀个开发的对象关系映射框架(ORM)。它对JDBC进⾏了⾮常对象封装,Hibernate允许程序员采⽤⾯向对象的⽅式来操作关系数据库。
1、程序更加⾯向对象
2、提⾼了⽣产率
3、⽅便移植
4、⽆⼊侵性。
缺点:
1、效率⽐JDBC略差
2、不适合批量操作
3、只能配置⼀种关联关系
Hibernate有四种查询⽅式:
1、get、load⽅法,根据id号查询对象。
2、Hibernate query language
3、标准查询语⾔
4、通过sql查询
Hibernage⼯作原理:
多表查询sql语句面试题
1、配置hibernate对象关系映射⽂件、启动服务器
2、服务器通过实例化Configuration对象,读取l⽂件的配置内容,并根据相关的需求建好表以及表之间的映射关系。
3、通过实例化的Configuration对象建⽴SeesionFactory实例,通过SessionFactory实例创建Session对象。
4、通过Seesion对象完成数据库的增删改查操作。
Hibernate中的状态转移
临时状态(transient)
1、不处于session缓存中
2、数据库中没有对象记录
java是如何进⼊临时状态的:1、通过new语句创建⼀个对象时。2、刚调⽤session的delete⽅法时,从seesion缓存中删除⼀个对象时。
持久化状态(persisted)
1、处于session缓存中
2、持久化对象数据库中没有对象记录
3、seesion在特定的时刻会保存两者同步
java如何进⼊持久化状态:1、seesion的save()⽅法。2、seesion的load().get()⽅法返回的对象。3、seesion的find()⽅法返回的list集合中存放的对象。4、Session的update().save()⽅法。
流离状态(detached)
1、不再位于session缓存中
2、游离对象由持久化状态转变⽽来,数据库中还没有相应记录。
java如何进⼊流离状态:1、Session的close()。Session的evict()⽅法,从缓存中删除⼀个对象。
具体如下图所⽰:
Hibernate中的缓存主要有Session缓存(⼀级缓存)和SessionFactory缓存(⼆级缓存,⼀般由第三⽅提供)。
⼗四、反射讲⼀讲,主要是概念,都在哪需要反射机制,反射的性能,如何优化
答:反射机制的定义:
是在运⾏状态中,对于任意的⼀个类,都能够知道这个类的所有属性和⽅法,对任意⼀个对象都能够通过反射机制调⽤⼀个类的任意⽅法,这种动态获取类信息及动态调⽤类对象⽅法的功能称为java的反射机制。
反射的作⽤:
1、动态地创建类的实例,将类绑定到现有的对象中,或从现有的对象中获取类型。
2、应⽤程序需要在运⾏时从某个特定的程序集中载⼊⼀个特定的类
⼗五、谈谈Hibernate与Ibatis的区别,哪个性能会更⾼⼀些
答: 1、Hibernate偏向于对象的操作达到数据库相关操作的⽬的;⽽ibatis更偏向于sql语句的优化。
2、Hibernate的使⽤的查询语句是⾃⼰的hql,⽽ibatis则是标准的sql语句。
3、Hibernate相对复杂,不易学习;ibatis类似sql语句,简单易学。
性能⽅⾯:
1、如果系统数据处理量巨⼤,性能要求极为苛刻时,往往需要⼈⼯编写⾼性能的sql语句或存错过程,此时ibatis具有更好的可控性,因此性能优于Hibernate。
⼗六、对Spring的理解,项⽬中都⽤什么?怎么⽤的?对IOC、和AOP的理解及实现原理
答: Spring是⼀个开源框架,处于MVC模式中的控制层,它能应对需求快速的变化,其主要原因它有⼀种⾯向切⾯编程(AOP)的优势,其次它提升了系统性能,因为通过依赖倒置机制(IOC),系统中⽤到的对象不是在系统加载时就全部实例化,⽽是在调⽤到这个类时才会实例化该类的对象,从⽽提升了系统性能。这两个优秀的性能使得Spring受到许多J2EE公司的青睐,如阿⾥⾥中使⽤最多的也是Spring相关技术。
Spring的优点:
1、降低了组件之间的耦合性,实现了软件各层之间的解耦。
2、可以使⽤容易提供的众多服务,如事务管理,消息服务,⽇志记录等。
3、容器提供了AOP技术,利⽤它很容易实现如权限拦截、运⾏期监控等功能。
Spring中AOP技术是设计模式中的动态代理模式。只需实现jdk提供的动态代理接⼝InvocationHandler,所有被代理对象的⽅法都由InvocationHandler接管实际的处理任务。⾯向切⾯编程中还要理解切⼊点、切⾯、通知、织⼊等概念。
Spring中IOC则利⽤了Java强⼤的反射机制来实现。所谓依赖注⼊即组件之间的依赖关系由容器在运⾏期决定。其中依赖注⼊的⽅法有两种,通过构造函数注⼊,通过set⽅法进⾏注⼊。
⼗七、线程同步,并发操作怎么控制
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论