面试题汇总

来源:日本留学 发布时间:2021-02-25 点击:

 零、各种数据库的分页 sql Mysql: select * from table limit start,pageNum 比如从 10 取 20 个数据 select * from table limit 10,20 Oracle:

 select * from (select rownum,name from table where rownum <=endIndex ) where rownum > startIndex 例如从表 Sys_option(主键为 sys_id)中从 10 条记录还是检索 20 条记录,语句如下:

 SELECT *FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2 Where t2.R >= 10 sql server: 分页方案一:(利用 Not In 和 SELECT TOP 分页) 语句形式:

 SELECT TOP 10 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 20 id FROM TestTable ORDER BY id)) ORDER BY ID

 SELECT TOP 页大小 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 页大小*页数 id FROM 表 ORDER BY id)) ORDER BY ID ------------------------------------- 分页方案二:(利用 ID 大于多少和 SELECT TOP 分页)

 语句形式:

 SELECT TOP 10 * FROM TestTable WHERE (ID > (SELECT MAX(id) FROM (SELECT TOP 20 id FROM TestTable ORDER BY id) AS T)) ORDER BY ID

 SELECT TOP 页大小 * FROM TestTable WHERE (ID > (SELECT MAX(id)

 FROM (SELECT TOP 页大小*页数 id FROM 表 ORDER BY id) AS T)) ORDER BY ID ------------------------------------- 分页方案三:(利用 SQL 的游标存储过程分页) create procedure XiaoZhengGe @sqlstr nvarchar(4000), --查询字符串 @currentpage int, --第 N 页 @pagesize int --每页行数 as set nocount on declare @P1 int, --P1 是游标的 id @rowcount int exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 set @currentpage=(@currentpage-1)*@pagesize+1 exec sp_cursorfetch @P1,16,@currentpage,@pagesize exec sp_cursorclose @P1 set nocount off

 其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。

 建议优化的时候,加上主键和索引,查询效率会提高。

 通过 SQL 查询分析器,显示比较:我的结论是: 分页方案二:(利用 ID 大于多少和 SELECT TOP 分页)效率最高,需要拼接 SQL 语句 分页方案一:(利用 Not In 和 SELECT TOP 分页) 效率次之,需要拼接 SQL 语句 分页方案三:(利用 SQL 的游标存储过程分页) 效率最差,但是最为通用 一、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 更节省空间。

 详见:http://www.cnblogs.com/mgod/archive/2007/08/05/844011.html

 1)每个结点要么是红的,要么是黑的。

 2)根结点是黑的。

 3)每个叶结点,即空结点(NIL)是黑的。

 4)如果一个结点是红的,那么它的俩个儿子都是黑的。

 5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

 时间复杂度为 O(lgn)。

 三、HashTable, HashMap,TreeMap 区别?ConcurrentHashMap 答:

 Map Collections.synchronizedMap(Map M); 1、HashTable 线程同步,HashMap 非线程同步。

 2、HashTable 不允许<键,值>有空值,HashMap 允许<键,值>有空值。

 3、HashTable 使用 Enumeration,HashMap 使用 Iterator。

 4、HashTable 中 hash 数组的默认大小是 11,增加方式的 old*2+1,HashMap 中 hash 数组的默认大小是16,增长方式一定是 2 的指数倍。

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

 详见:http://www.zlmind.com/?p=679

 五、Tomcat,Apache,JBoss 的区别? 答:

  1、Apache 是 Http 服务器,Tomcat 是 web 服务器,JBoss 是应用服务器。

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

 详见:http://foohsinglong.iteye.com/blog/1195780

 六、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 不会,比较安全。

 详见:http://www.cnblogs.com/wxf0701/archive/2008/08/17/1269798.html

 七、Session, Cookie 区别 答:

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

 2、用户可以通过浏览器设置决定是否保存 Cookie,而不能决定是否保存 Session,因为 Session 是由服务器端维护的。

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

 4、Session 和 Cookie 不能跨窗口使用,每打开一个浏览器系统会赋予一个 SessionID,此时的 SessionID 不同,若要完成跨浏览器访问数据,可以使用

  Application。

 5、Session、Cookie 都有失效时间,过期后会自动删除,减少系统开销。

 详见:http://www.chinahtml.com/1007/128010707619425.html

 八、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://sunnylocus.iteye.com/blog/342996

 九、HTTP 报文包含内容

 答:

  主要包含四部分:

 1、request line 2、header line 3、blank line 4、request body 详见:http://blog.csdn.net/heruiup/article/details/6072961

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

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

 2、PreparedStatement 可避免如类似 单引号 的编码麻烦,Statement 不可以。

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

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

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

 详见:http://blog.163.com/xiaokangzhijia@126/blog/static/1659548562010927222912/

 什么是 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 是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求的那个地址,浏览器会用刚才的所有参数重新发送新的请求。

 详见:http://dubaopeng.iteye.com/blog/1056564

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

 象,几个属性,几个方法。

 答:

  由于 JAVA 中 new 出来的对象都是放在堆中,所以如果要实例化 100 次,将在堆中产生 100 个对象,一般对象与其中的属性、方法都属于一个整体,但如果

  属性和方法是静态的,就是用 static 关键字声明的,那么属于类的属性和方法永远只在内存中存在一份。

 详见:http://wenwen.soso.com/z/q252323203.htm?sp=4000

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

 答:

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

 Hibernate 的优点:

 1、程序更加面向对象 2、提高了生产率 3、方便移植 4、无入侵性。

 缺点:

 1、效率比 JDBC 略差 2、不适合批量操作 3、只能配置一种关联关系 Hibernate 有四种查询方式:

 1、get、load 方法,根据 id 号查询对象。

 2、Hibernate 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、刚调用 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 缓存(二级缓存,一般由第三方提供)。

 详见:http://wxg6203.iteye.com/blog/766947

  http://jyjiao2007.iteye.com/blog/760554

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

  反射机制的定义:

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

 反射的作用:

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

 2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类 详见:http://blog.csdn.net/p785810989/article/details/6495956

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

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

 2、Hibernate 的使用的查询语句是自己的 hql,而 ibatis 则是标准的 sql 语句。

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

 性能方面:

 1、如果系统数据处理量巨大,性能要求极为苛刻时,往往需要人工编写高性能的 sql 语句或存错过程,此时ibatis 具有更好的可控性,因此性能优于 Hibernate。

 2、同样的需求下,由于 hibernate 可以自动生成 hql 语句,而 ibatis 需要手动写 sql 语句,此时采用 Hibernate的效率高于 ibatis。

 详见:http://blog.csdn.net/cdh1213/article/details/5967405

  http://wenku.baidu.com/view/06c4486aaf1ffc4

 ffe47acfb.html

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

 答:

  Spring 是一个开源框架,处于 MVC 模式中的控制层,它能应对需求快速的变化,其主要原因它有一种面向切面编程(AOP)的优势,其次它提升了系统性能,因为通过

 依赖倒置机制(IOC),系统中用到的对象不是在系统加载时就全部实例化,而是在调用到这个类时才会实例化该类的对象,从而提升了系统性能。这两个优秀的性能

 使得 Spring 受到许多 J2EE 公司的青睐,如阿里里中使用最多的也是 Spring 相关技术。

 Spring 的优点:

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

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

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

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

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

 详见:http://www.360doc.com/content/08/0113/20/7635_970484.shtml

 http://www.zlmind.com/?p=694

 十七、线程同步,并发操作怎么控制

 答:

  Java 中可在方法名前加关键字 syschronized 来处理当有多个线程同时访问共享资源时候的问题。syschronized 相当于一把锁,当有申请者申请该 资源时,如果该资源没有被占用,那么将资源交付给这个申请者使用,在此期间,其他申请者只能申请而不能使用该资源,当该资源被使用完成后将释放该资源上的锁,其他申请者可申请使用。

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

 并发操作可以通过加锁的方式进行控制,锁又可分为乐观锁和悲观锁。

 悲观锁:

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

 乐观锁:

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

 详见:http://www.cnblogs.com/ego/articles/1514350.html

 http://blog.csdn.net/niu870781892/article/details/6140755

 十八、描述 struts 的工作流程 答:

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

 2、当 ActionServlet 接收到一个客户请求时,首先检索和用户请求相匹配的 ActionMapping 实例,如果不存

 在,就返回用户请求路径无效信息。

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

 4、根据配置信息决定是否需要验证表单,如果需要,就调用 ActionForm 的 validate()方法,如果 ActionForm的 validate()方法返回 null 或返回一个不包含 ActionMessage 的 ActionErrors 对象,就表示表单验证成功。

 5、ActionServlet 根据 ActionMapping 实例包含的映射信息决定请求转发给哪个 Action,如果相应的 Action实例不存在,就先创建一个实例,然后调用 Action 的 execute()方法。

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

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

 二一、sql 的优化相关问题 答:

 以下是性能要求设计阶段需要注意的:

 1、 数据库逻辑设计的规范化 数据库逻辑设计的规范化就是我们一般所说的范式,我们可以这样来简单理解范式:

 第 1 规范:没有重复的组或多值的列,这是数据库设计的最低要求。

 第 2 规范: 每个非关键字段必须依赖于主关键字,不能依赖于一个组合式主关键字的某些组成部分。消除部分依赖,大部分情况下,数据库设计都应该达到第二范式。

 第 3 规范: 一个非关键字段不能依赖于另一个非关键字段。消除传递依赖,达到第三范式应该是系统中大部分表的要求,除非一些特殊作用的表。

 更高的范式要求这里就不再作介绍了,个人认为,如果全部达到第二范式,大部分达到第三范式,系统会产生较少的列和较多的表,因而减少了数据冗余,也利于性能的提高。

 2、 合理的冗余 完全按照规范化设计的系统几乎是不可能的,除非系统特别的小,在规范化设计后,有计划地加入冗余是必要的。

 冗余可以是冗余数据库、冗余表或者冗余字段,不同粒度的冗余可以起到不同的作用。

 冗余可以是为了编程方便而增加,也可以是为了性能的提高而增加。从性能角度来说,冗余数据库可以分散数据库压力,冗余表可以分散数据量大的表的并发压力,也可以加快特殊查询的速度,冗余字段可以有效减少数据库表的连接,提高效率。

 二二、oracle 中 rownum 与 rowid 的理解,一千条记录我查 200 到 300 的记录怎么查?

 答:

  详见:http://www.sunxin.org/article/242.html 如何查 200 到 300 行的记录,可以通过 top 关键字辅助:select top 100 * from table where id is not in (select top 200 id from table); 查询 n 到 m 行记录的通用公式:select top m * from table where id is not in (select top n * from table)

推荐访问:汇总 面试题
上一篇:第六单元检测-2020-2021学年八年级上学期语文(部编版)
下一篇:汽车买卖合同(样式二)

Copyright @ 2013 - 2018 优秀啊教育网 All Rights Reserved

优秀啊教育网 版权所有