2022年JEE面试题 .pdf
Alibaba= Interview = 01.自我介绍。02.和工作相关的:项目人数,开发多少人,测试多少人,项目时间。03.你们项目需求是怎么产生的?04.测试输出的两个重要文档是什么?05.测试用例用什么管理?06.回归测试用什么工具?07.你们公司用什么管理测试用例和Bug ?08.看你有参加需求评审,那么你之前的日企你是怎么参加的?09.参与程序评审的时候你看代码吗?10.java和 .net 的区别。11.Tomcat 和 Apache的区别。12.我要上传一个图片,你怎么设计测试用例?13.测试质量报告包括什么?你是怎么写的?14.你会看源代码吗?15.工作当中对Linux 经常用吗?你熟悉多少?16.说下你们公司是如何管理BUG 的?17.回归测试的时候,如果开发人员认为BUG 不是在他的负责模块产生的然后怎么办?返回来的时候bug 被改动了吗?18.上一个公司什么时候离职的?19.你结婚了吗?来杭州家人有什么意见?阿里、淘宝java开发那里,一般期望至少2 年上工作经验,功夫好的一年OK 。= J2SE = 01.string, stringbuffer stringbuilder的区别 , string 不可修改的底层原因String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全)String 类型和StringBuffer 类型的主要性能区别其实在于String 是不可变的对象, 因此在每次对String 类型进行改变的时候其实都等同于生成了一个新的String 对象,然后将指针指向新的String 对象,所以经常改变内容的字符串最好不要用String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,那速度是一定会相当慢的。而如果是使用StringBuffer 类则结果就不一样了,每次结果都会对StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用StringBuffer , 特别是字符串对象经常改变的情况下。而在某些特别情况下,String 对象的字符串拼接其实是被JVM 解释成了StringBuffer 对象的拼接,所以这些时候String 对象的速度并不会比StringBuffer 对象慢,而特别是以下的字符串对象生成中,String 效率是远要比StringBuffer 快的在大部分情况下StringBuffer String 在大部分情况下StringBuilder StringBuffer 02.hashtable 和 hashmap的区别HashMap不是线程安全的hastmap是一个接口是 map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许 null key和 null value,而 hashtable不允许。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - HashTable是线程安全的一个Collection。HashMap是 Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空( null )键值( key ),由于非线程安全,效率上可能高于Hashtable。HashMap允许将 null 作为一个entry的 key 或者 value ,而 Hashtable不允许。HashMap把 Hashtable的 contains方法去掉了,改成containsvalue和 containsKey。因为 contains方法容易让人引起误解。Hashtable继承自 Dictionary类,而 HashMap是 Java1.2引进的 Map interface的一个实现。最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。Hashtable和 HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。03.HASHMAP,TREEMAP 区别HashMap通过 hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用 TreeMap(HashMap中元素的排列顺序是不固定的)。04.ArrayList, Vector和 LinkedList的存储性能和特性arraylist vector 都是通过数组的方式存储数据,数组大小可变,允许所有的为null ,但是 arraylist 没有同步的方法,必须自己实现外部的同步方法,但是vector有同步的方法,所以不要自己实现同步的方法。而 linkedlist使用的是双向链表的方式,按照序号索引元素,需要向前和向后遍历,但是插入只有遍历前后项就行了,所以插入数据快。05.linkedarraylist理解,和上面区别ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于随机访问get 和 set , ArrayList觉得优于LinkedList,因为 LinkedList要移动指针。对于新增和删除操作add 和 remove,LinedList比较占优势,因为ArrayList要移动数据。06.list, set, map区别List 按对象进入的顺序保存对象,不做排序或编辑操作。Set 对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于 Set, 而不关心它的顺序- 否则应该使用List) 。Map同样对每个元素保存一份,但这是基于 键 的, Map也有内置的排序,因而不关心元素添加的顺序。如果添加元素的顺序对你很重要,应该使用LinkedHashSet或者 LinkedHashMap. 07.Comparable与 Comparator区别comparable& Comparator 都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。Comparable是一个对象本身就已经支持自比较所需要实现的接口(如 String Integer自己就可以完成比较大小操作)而 Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。08.ConcurrentMap和 HashMap的区别。09.Conncurrent的包理解。10.Interface, abstract class区别声明方法的存在而不去实现它的类被叫做抽象类(abstract class) ,它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口( interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。11.jdbc class forname的作用class.forName()是运用反射的原理创建对象名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - 12.序列化 ,反序列化的概念是什么?序列化 就是把一个对象保存到一个文件或数据库字段中去反序列化 就是在适当的时候把这个文件再转化成原来的对象使用13.JAVA 多线程同步控制概念,有几种方式能实现线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作重写重载14.JAVA 异常的理解Java 的异常 处理是通过5 个关键字来实现的:try ,catch ,throw ,throws,finally. 前面提到了complete abruptly(暂且 理解 为“突然中止”或者“ 异常 结束”)15.JAVA 反射的理解 ,何时使用,什么好处,什么问题反射其实就是程序能够自检查自身信息反射可以结合Java 的字节码,使用ASM和 cglib等库,还能动态生成类。hibernate的延迟载入,spring的 AOP 都是这么实现的反射给Java 带来了一些动态性16.Statement 与 PreparedStatement的区别 ,如何防止SQL 注入prepareStatement会先初始化SQL ,先把这个SQL 提交到数据库中进行预处理,多次使用可提高效率createStatement不会初始化,没有预处理,没次都是从0 开始执行SQL PreparedStatement继承于 Statement,通常的JDBC 实现中 PreparedStatement最终还是通过Statement的相关方法来执行SQL 的(可以做少量优化),其最主要的优势在于,可以减少SQL 的编译错误(在JDBC 中就可以捕获部分异常而不是由数据库服务器执行时返回错误代码)、增加 SQL 安全性(减少SQL 注入的机会)。17.XML parser类型和特点= J2EE = 01.J2EE 理解解释,里面包含哪些组件J2EE 典型的四层结构:运行在客户端机器上的客户层组件运行在 J2EE 服务器上的Web层组件运行在 J2EE 服务器上的业务逻辑层组件运行在 EIS 服务器上的企业信息系统(Enterprise information system)层软件J2EE 组件:应用客户端程序和applets是客户层组件。Java Servlet和 JavaServer Pages( JSP)是 web 层组件。Enterprise JavaBeans( EJB)是业务层组件。02.Servlet的生命周期Servlet运行在 Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init() 、service()和 destroy()方法来表示。一般以多线程的方式工作。03.Servlet和 JSP 区别编程方式不同Servlet必须在编译以后才能执行运行速度不同04.GET POST区别名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - get是从服务器上获取数据,post是向服务器传送数据。get安全性非常低,post 安全性较高。但是执行效率却比Post 方法好05.SESSION,COOKIE区别两个都可以用来存私密的东西,同样也都有有效期的说法。区别在于。session是放在服务器上的,过期与否取决于服务期的设定,cookie是存在客户端的,过去与否可以在cookie生成的时候设置进去。06.SESSION实现机制Session一般用来控制会话,与 Cookie标识相配合控制会话时间,而一旦开启了Session 会话 ,只有执行OnEnd才能结束 ,或者 Cookie到期删除 . 也就是说 ,if(session.isNew() 其实是建立了一个空的无限期连接的Cookie值Session对象有 Session_OnStart和 Session_OnEnd 2个事件07.redirect, foward区别使用 forward的时候浏览器不知道它所请求的具体资源来源,所以地址栏不会变;使用 redirect,服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL。forward,转发页面和转发到的页面可以共享request里面的数据 . redirect,不能共享数据. 08.HTTP 报文内容报文是网络中交换与传输的数据单元。报文包含了将要发送的完整的数据信息,其长短很不一致。里面包含有地址信息,网络设备根据地址信息转发报文。09.JMS怎么理解JMS 是一个企业级的组件,当初学EJB 的时候,消息驱动Bean 就是靠JMS 来驱动的,Tomcat只是简单Web容器,应该是不行。另外 JMS 还是一个标准,就像EJB,有很多开源的,商业的实现,开源的我以前用过的有一个叫OpenJMS的,用起来比较简单,还有个简单的Swing图像化管理工具,JMS 的规范都支持,可能性能不是很好。= Framework = 01.MVC理解MVC 方式通常在Smalltalk中用于建立用户接口。通过对MVC 中蕴藏的设计模式可以帮你理解我们所说的“模式”的含义。MVC 包括三类对象,Model是应用对象、View 为其屏幕表示、Controller定义了对用户输入的处理(反应)方式。在应用MVC 方式以前,通常将这三个对象的功能合到了一起,应用MVC 分离了它们,为设计提供了灵活性和可重用性。02.STRUTS理解解释, struts执行过程,struts2的 Action就具备了struts1中 ActionForm的功能; ActionForm的功能无非三个:初始化数据; 封装数据; 验证数据格式;对于 struts2 ,都有相应的解决方式:通过Action实现 Preparable接口,实现对数据初始化;Action继承 ActionSupport,重写validate(),显示数据的验证,在 Action中配置属性以及对应的getter和 setter方法,实现数据封装。而且类型转换方面,struts2通过 OGNL实现的效果要比ActionForm更灵活。03.struts的执行过程1)用户的请求以HTTP 方式传输到服务器上,接受请求的是ActionServlet. (2) ActionServlet接收到请求后,会查找Struts-config.xml文件来确定服务器上是否有用户请求的操作,此处用户请求操作应为登陆操作。如果没有,则返回一个用户请求无效的出错信息。(3)当 ActionServlet请求找到用户请求的Action后,首先将用户输入的表单参数打包成一个ActionFrom对象,这个ActionFrom对象其实也就是一个JavaBean, 里面包含两个字段,分别是用户名和密码。接着ActionServlet再根据struts-config.xml中的配置信息决定是否要执行ActionFrom对象中的Validate方法。若Validate方法执行有错,则返回。否则,继续下一步。(4)系统生成一个用户所请求的Action的实例对象,将前面的ActionFrom对象传递给它,运行它的Execute() 方法。这一步其实就是用户登陆的控制器,在执行exectue()方法时,可以调用后台模型验证登陆名和密码是否正确等信息。(5) execute()执行结束前会生成以和ActionForward类型的对象并将之返回给ActionServlet,该对象的作用是告诉ActionFroward就代表跳转名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - 到一个登陆成功的页面。ActionServlet将对之进行分析,其实就相当于接收到一个新的请求,重复(2) ( 5)的过程,直到将某个界面返会给用户为止!04.struts 1 2 区别Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)Servlet 依赖 : Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和 response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。可测性: 测试 Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展Struts TestCase 提供了一套Struts1的模拟对象(来进行测试)。Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。捕获输入: Struts1 使用 ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态 Bean (DynaBeans)可以作为创建传统ActionForm的选择, 但是,开发者可能是在重新描述(创建 )已经存在的JavaBean(仍然会导致有冗余的javabean) 。Struts 2 直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子 )属性的 rich对象类型。 Action属性能够通过 web 页面上的taglibs访问。Struts2也支持 ActionForm模式。rich对象类型, 包括业务对象, 能够用作输入/输出对象。 这种 ModelDriven 特性简化了taglib对 POJO 输入对象的引用05.STRUTS中 ACTIONFORM里的数值如何传递保存也不是 Action保存信息, 是在 Action里通过这个方法把信息存在内存的request对象和 Errors对象里,这样别的组件可以直接调用,ActionForm保存的信息也是通过一个Form的对象保存在内存中的,因为Action连接页面和Form ,所以由Action来做这个工作比较合适,方法在ActionServlet里实现的06.HIBERNATE理解解释.Hibernate延迟加载2.Hibernate中类之间的关联关系3.Hibernate的缓存机制4.Hibernate的查询方式关于它的映射,其实就是数据库中的表和javabean的一个映射,这样我们可以根据数据库中建好的表来自动生成映射文件,再根据映射文件自动生成 javabean,可以帮我们省下很多事07.HIBERNATE的底层实现机制它对底层的事务接口做了封装,底层事务接口包括:JDBC API 、 JTA ( JavaTransactionAPI) 、 CORBA ( CommonObjectRequestBroker Architecture) API 08.Hibernate中 1, 2 级缓存概念,理解级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session (一定要同一个 session )又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据。二级缓存就是SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库。09.ibatis理解iBATIS 一词来源于“internet”和“ abatis ”的组合,是一个由Clinton Begin在 2001年发起的开放源代码项目。最初侧重于密码软件的开发,现在是一个基于Java 的持久层框架10.Hibernate与 Ibatis的区别hibernate 它是全封闭式的ibatis 它是半封闭式的11.spring理解解释1) 开源框架名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - 2)IoC (控制反转),将类的创建和依赖关系写在配置文件里,由配置文件注入,实现了松耦合3)AOP 将安全,事务等于程序逻辑相对独立的功能抽取出来,利用spring的配置文件将这些功能插进去,实现了按照方面编程,提高了复用性12.Spring的 IOC 与 AOP 及理解与底层实现机制主要应用了java 的反射技术,很酷 ; 可以根据给定的参数(主要是字符串) 创建相应的bean, 访问相应的方法或构造器以及成员变量; 13.spring mvc理解Spring MVC按植物分类学属于Martin Flower企业应用模式里的静态配置型Front Controler,使用 DispatchServlet截获所有 *.do 的请求,按照 xml 文件的配置,调用对应的Command对象的handleRequest(request,response)函数,同时进行依赖对象的注入。14.SPRING中事务的理解事务具有原子性事务中包含的添加、删除、更新等操作要么全部做完要么全部都不做,以保证数据库的一致性和正确性15.SPRING BEAN作用域理解Spring的 Singleton主要是针对一个 IoC 容器维持一个Bean 实例 而言的。与设计模式上谈到的Singleton不同,设计模式上谈到的Singleton,是指对每个ClassLoader所载入的类产生一个实例。Spring2.0中 , scope除 了 可 以 设 置 singleton 与 prototype之 外 , 针 对Web应 用 程 序 环 境 , 还 可 以 设 置 request、 session与globalSession,分别表示请求阶段、会话阶段与基于Portlet的 Web应用程序会话阶段。= DataBase = 01.如何书写与测试高效的SQL 语句?02.执行计划如何看和使用?03.索引原理,种类,使用索引的好处和坏处?首先,索引要占用磁盘空间。通常情况下,这个问题不是很突出。但是,如果你创建每一种可能列组合的索引,索引文件体积的增长速度将远远超过数据文件。如果你有一个很大的表,索引文件的大小可能达到操作系统允许的最大文件限制。第二,对于需要写入数据的操作,比如DELETE、UPDATE 以及 INSERT 操作,索引会降低它们的速度。这是因为MySQL 不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。在大型数据库中,索引是提高速度的一个关键因素。不管表的结构是多么简单,一次500000行的表扫描操作无论如何不会快。如果你的网站上也有这种大规模的表,那么你确实应该花些时间去分析可以采用哪些索引,并考虑是否可以改写查询以优化应用。要了解更多信息,请参见MySQLmanual。另外注意,本文假定你所使用的 MySQL 是 3.23版,部分查询不能在3.22版 MySQL 上执行。04.内联,外联,左联,右联05.主键,外键主键是定义一个表中起主要作用的数据项,这些数据项的数据在表中是唯一的,同时系统按主键为表建立索引。外键是定义一个表中的某数据项的数据,要参照另一个表的主键数据。既没有在另一个表的主键数据中出现的数据,不允许在这个表的外键数据项中出现。06.复合索引复合索引能形成索引覆盖,提高 where语句的查询效率复合索引的使用原则是第一个条件应该是复合索引的第一列,依次类推 ,否则复合索引不会被使用所以 ,正常情况下复合索引不能替代多个单一索引07.oracle中 rownum与 rowid的理解08.Oracle的分页处理,ORACLE 中针对一个一千条记录的表如果要查200 到 300 的记录怎么查? 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -