java基础003

m.racktom.com

共享资料网

Java笔试题2016最新版


目录
一. Java 基础部分..........................................................................................................................9 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? ........... 9 2、说说&和&&的区别。...........................................................................................................9 3、在 JAVA 中如何跳出当前的多重嵌套循环?................................................................... 9 4、switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上? .. 10 6、用最有效率的方法算出 2 乘以 8 等於几? .....................................................................10 7、请设计一个一百亿的计算器...........................................................................................10 8、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? ... 10 9、"=="和 equals 方法究竟有什么区别? .........................................................................10 10、静态变量和实例变量的区别?.....................................................................................11 11、是否可以从一个 static 方法内部发出对非static 方法的调用? ......................... 11 12、Integer 与 int 的区别 ..................................................................................................11 13、Math.round(11.5)等于多少?Math.round(-11.5)等于多少?................................. 11 14、请说出作用域 public,private,protected,以及不写时的区别 ........................ 11 15、Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的类型?12 17、写 clone()方法时,通常都有一行代码(不是必须有),是什么?.......................... 12 18、面向对象的特征有哪些方面.........................................................................................12 19、java 中实现多态的机制是什么? ................................................................................12 20、abstract class 和interface 有什么区别?.............................................................. 12 21、abstract 的 method 是否可同时是 static,是否可同时是 native,是否可同时是 synchronized?.......................................................................................................................13 22、什么是内部类?Static Nested Class 和 Inner Class 的不同。 ..........................13 23、内部类可以引用它的包含类的成员吗?有没有什么限制?..................................... 13 24、String 是最基本的数据类型吗?..................................................................................13 27、String 和 StringBuffer 的区别..................................................................................14 28、如何把一段逗号分割的字符串转换成一个数组?....................................................... 14 30、final, finally, finalize 的区别。........................................................................ 14 31、运行时异常(Runtime)与检查异常(Checked)有何异同? ......................................... 15 32、error 和 exception 有什么区别?................................................................................15 33、Java 中的异常处理机制的简单原理和应用。............................................................ 15 34、请写出你最常见到的 5 个 RuntimeException。 ........................................................ 15 35、Java 语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代 表什么意义?在 try 块中可以抛出异常吗?..................................................................... 16 36,Java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和 suspend()方法为何不推荐使用?.......................................................................................16 38、同步和异步有何异同,在什么情况下分别使用他们?举例说明。......................... 17 39. 下面两个方法同步吗?(自己发明)......................................................................... 17 40、多线程有几种实现方法?同步有几种实现方法?......................................................... 18
1


41、启动一个线程是用 run()还是 start()?..................................................................... 18 42、当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对 象的其它方法?.......................................................................................................................18 43、线程的基本概念、线程的基本状态以及状态之间的关系......................................... 18 45、介绍Collection 框架的结构.......................................................................................18 46、ArrayList 和 Vector 的区别........................................................................................19 47、HashMap 和 Hashtable 的区别 ......................................................................................19 48、List 和 Map 区别?.........................................................................................................19 49、List, Set, Map 是否继承自Collection 接口?........................................................ 19 50、List、Map、Set 三个接口,存取元素时,各有什么特点? .................................... 19 51、说出 ArrayList,Vector, LinkedList 的存储性能和特性....................................... 19 51、去掉一个Vector 集合中重复的元素........................................................................... 1953、Collection 和 Collections 的区别。....................................................................... 20 54、Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是 equals()?它们有何区别?.....................................................................................................20 55、你所知道的集合类都有哪些?主要方法?................................................................. 20 56、两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?.......................................................................................................................................20 68、说出一些常用的类,包,接口,请各举 5 个............................................................. 20 59、 Java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出 他们分别是哪些类?.............................................................................................................21 60、字节流与字符流的区别.................................................................................................21 61、什么是 java 序列化,如何实现 java 序列化?或者请解释 Serializable 接口的作 用。.........................................................................................................................................21 62、描述一下 JVM 加载 class 文件的原理机制? ............................................................... 2163、heap 和 stack 有什么区别。 ........................................................................................21 64、 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动 通知虚拟机进行垃圾回收?.................................................................................................21 65、什么时候用 assert。....................................................................................................22 66、能不能自己写个类,也叫 java.lang.String? ........................................................ 22 67、SSH 集成方式..................................................................................................................22 二.算法与编程...............................................................................................................................23 1、编写一个程序,将 a.txt 文件中的单词与b.txt 文件中的单词交替合并到 c.txt 文 件中,a.txt文件中的单词用回车符分隔,b.txt 文件中用回车或空格进行分隔。 ... 23 2、编写一个程序,将 d:\java 目录下的所有.java 文件复制到 d:\jad 目录下,并将原 来文件的扩展名从.java 改为.jad。..................................................................................24 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字 符串,但要保证汉字不被截取半个,如“我 ABC”,4,应该截取“我 AB”,输入“我 ABC 汉 DEF”,6,应该输出“我 ABC”,而不是“我 ABC+汉的半个”。..................... 25 4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字 符的个数。.............................................................................................................................25 5、说明生活中遇到的二叉树,用 java 实现二叉树......................................................... 26 8、递归算法题1....................................................................................................................27 9、递归算法题 2....................................................................................................................28
2


10、排序都有哪几种方法?请列举。用 JAVA 实现一个快速排序。 ............................... 28 11、有数组a[n],用 java 代码将数组元素顺序颠倒...................................................... 30 12 不使用递归遍历二叉树...................................................................................................30 三.前端页面部分...........................................................................................................................32 3.当 service 有一个实例变量,doGet 和 doPost 去调用这个变量,会出现什么问 题,你是如何解决的。.................................................................................................32 4.有三台服务器,如果在一台服务器上登陆了这个用户,其他两台就不能再登陆 这个用户,使用 session共享,你是怎么做的。 .....................................................32 5.写一个自定义标签要继承什么类.............................................................................32 6.Jsp 如何处理 json.....................................................................................................32 7.Jsp 的重定向和转发的流程有什么区别.................................................................. 32 8.Jsp 和 servlet 的区别..............................................................................................32 9.jsp 可以操作窗口吗?..............................................................................................32 10.session 的主要几个方法的区别............................................................................ 3311.jsp 的三大指令,七大动作的具体功能................................................................ 33 12.获取页面的元素和值有几种方式,分别说一下 ................................................... 33 13.servlet 和 javaScript 的区别,他们分别是什么作用...................................... 33 14.jsp 的执行原理........................................................................................................34 16.HTML 和 Servlet 的异同..........................................................................................34 17.会话跟踪有哪些,他们的区别是什么................................................................... 3418.session 和 application 的作用............................................................................ 3419.request ,response,session 和 application 是怎么用的.......................... 34 20.有几种方式将页面的值传到后台........................................................................... 3421.一个 form 表单的值如何获取.................................................................................34 22.传递参数到后台有几种方式...................................................................................35 23.Jsp 中父页面中怎么拿到子页面的表单元素,不是拿值怎么拿........................ 35 24.定义一个 String 类型的字符串,如果重定向之后还能不能获得这个数据 ..... 35 25.404 和 500 是什么意思............................................................................................35 26.写出 5 种 JSTL 常用标签 .........................................................................................35 28.Jsp 页面把一个元素隐藏的方法............................................................................ 3529.Session,application,cookie 的区别 .............................................................. 3530.我们在 web 应用开发过程中经常遇到输出某种编码的字符,如 ISO-8859-1,如 何输出一个某种编码的字符串.....................................................................................35 32.怎么判断用户请求时是第一次,如果客户端和服务端断开怎么连到上一次操作.........................................................................................................................................35 33.如果创建 servlet 实例不用构造方法,怎么创建一个 servlet 实例 ............... 35 34.Servlet 是安全的吗?当 service 有一个实例变量,doGet 和 doPost 去调用这 个变量,会出现什么问题,你是如何解决的............................................................. 36 36.说明一下 jsp 中<jsp: include page..>和<%@ include file%>的区别 ......... 36<jsp:include page=""/> 动态导入........................................................................... 3637. pageContext 有什么作用......................................................................................36 39.Filter 与拦截器怎么执行的..................................................................................36 40.Jsp 中如何进行分页,项目中如何进行分页?.................................................... 36 41,关于 Ajax 的技术组成与核心原理 ...............................................................................37
3


43.Xhtml 和 html 有什么区别。..........................................................................................38 44.css 的引入方式有哪些?link 和@import的区别是? ................................................38 45.css 选择符有哪些?哪些属性可以继承?优先级如何计算?内联和 important 哪个优先级高?.............................................................................................................................38 46.前端页面由哪三层构成,分别是什么?作用是什么?............................................... 38 47.你曾经在哪些浏览器测试过兼容?这些浏览器的内核分别是什么? ....................... 38 48.<img>标签上 title 与 alt 属性的区别是什么? ......................................................... 38 49.写出几种 IE6 BUG 的解决方法?...................................................................................38 50.描述 css reset 的作用和用途。...................................................................................39 51.你如何对网站的文件和资源进行优化?期待的解决方案包括:................................. 39 52.什么是语义化的 html? ..................................................................................................39 53.清除浮动有几种方式?各自的优缺点是?................................................................... 39 54.解释下 CSS sprites,以及你要如何在页面或网站中使用它?............................... 39 55, html5 有哪些新特性、移除了那些元素?如何处理 HTML5 新标签的浏览器兼容问题? 如何区分HTML 和 HTML5??................................................................................................40 56.javascript 的同源策略。..............................................................................................40 57、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字?否则的话提示用户 并终止提交?...........................................................................................................................40 59. jsp 有哪些内置对象?作用分别是什么?分别有什么方法? ...................................... 40 60. jsp 有哪些动作?作用分别是什么?..............................................................................41 61、JSP 的常用指令..............................................................................................................41 62. JSP 中动态 INCLUDE 与静态INCLUDE 的区别?.......................................................... 41 63、页面间对象传递的方法.................................................................................................42 三. Java web 部分........................................................................................................................42 1、Tomcat 的优化经验..........................................................................................................42 2、HTTP 请求的 GET 与 POST 方式的区别 ............................................................................42 3、解释一下什么是 servlet;..............................................................................................42 4、说一说 Servlet 的生命周期?.........................................................................................42 5、Servlet 的基本架构........................................................................................................42 6、Servlet API 中 forward()与 redirect()的区别?.................................................... 42 7、Request 对象的主要方法:............................................................................................43 8、request.getAttribute()和request.getParameter()有何区别? ...........................43 9、MVC 的各个部分都有那些技术来实现?如何实现? ........................................................ 43 10、我们在 web 应用开发过程中经常遇到输出某种编码的字符,如 iso-8859-1 等,如何输出一个某种编码的字符串?.........................................................................................44 四.数据库部分...............................................................................................................................44 1、用两种方式根据部门号从高到低,工资从低到高列出每个员工的信息。 ............... 442、ORACLE 和 MySQL 的区别。..............................................................................................44 3、存储过程和函数的区别。 ...............................................................................................45 4、Oracle 导入和导出方式..................................................................................................45 5、Oracle 分页方法..............................................................................................................45 6、mysql 的分页方法............................................................................................................45 7、解释什么是死锁,如何解决 Oracle 中的死锁?......................................................... 46 8、列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序46
4


9、存储过程与触发器必须讲,经常被面试到?................................................................. 46 10、数据库三范式是什么? ...................................................................................................48 11、说出一些数据库优化方面的经验?...............................................................................49 12、union 和 union all 有什么不同?................................................................................49 13.用一条 SQL 语句查询出每门课都大于 80 分的学生姓名 ............................................. 49 14.所有部门之间的比赛组合...............................................................................................50 15.显示文章标题,发帖人、最后回复时间....................................................................... 50 16.删除除了 id 号不同,其他都相同的学生冗余信息....................................................... 50 18.求出发帖最多的人:.......................................................................................................50 19、一个用户表中有一个积分字段,假如数据库中有 100 多万个用户,若要在每年第一 天凌晨将积分清零,你将考虑什么,你将想什么办法解决? ........................................... 51 21、注册 Jdbc 驱动程序的三种方式...................................................................................51 22、用 JDBC 如何调用存储过程...........................................................................................51 23、JDBC 中的 PreparedStatement相比 Statement 的好处............................................ 51 24、Class.forName的作用?为什么要用?.......................................................................... 5125、大数据量下的分页解决方法。.....................................................................................52 26、用 JDBC 查询学生成绩单,把主要代码写出来(考试概率极大). .......................... 52 27、说出数据连接池的工作机制是什么? ...........................................................................52 28、为什么要用 ORM? 和 JDBC 有何不一样?.................................................................... 53 29. 数据库大数据处理.........................................................................................................53 30. 如何写出一个快排.........................................................................................................53 31. 什么是事务?什么是锁?.............................................................................................54 32. 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么? . 54 33. 什么是内存泄漏?.........................................................................................................54 34.触发器的作用?...............................................................................................................54 触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束, 来维护数据的完整性和一致性, 可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又 会导致该表触发器被触发。.................................................................................................54 35. 常用的 oracle 操作的命令...........................................................................................54 36, 索引的优缺点.............................................................................................................55 37.使用 oracle 伪列删除表中重复记录:?..................................................................... 55 五. XML 部分..................................................................................................................................55 1、xml 有哪些解析技术?区别是什么? ................................................................................55 2、你在项目中用到了 xml 技术的哪些方面?如何实现的? ............................................... 55 4、XML 文档定义有几种形式?它们之间有何本质区别?解析 XML 文档有哪几种方式?................................................................................................................................................56 六.流行的框架与新技术...............................................................................................................56 1、 谈谈你对 Struts 的理解。...................................................................................56 2、Struts 优缺点..................................................................................................................56 3、STRUTS 的应用(如 STRUTS 架构)....................................................................................57 4、谈谈你对 Hibernate 的理解。.......................................................................................57 5、你对 Spring 的理解。.....................................................................................................58 6.Spring 由哪些模块组成?..................................................................................................58
5


7. 核心容器模块。.......................................................................................................58 9、写 Hibernate 的一对多和多对一双向关联的orm 配置? .............................................58 10、在 DAO 中如何体现 DAO 设计模式?...............................................................................59 11、spring+Hibernate 中委托方案怎么配置? ..................................................................59 12. hibernate 进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有 一个实体类与之对应如何解决;.........................................................................................59 13.介绍一下 Hibernate 的二级缓存...................................................................................59 14、Jdo 是什么?....................................................................................................................60 16. IOC 的优点是什么?........................................................................................61 18. 什么是 Spring 的依赖注入?.............................................................................61 19. 有哪些不同类型的 IOC(依赖注入)方式?................................................ 61 20. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter 方法注入? .. 61 21. Spring 对 DAO 的支持..........................................................................................61 22. 解释 AOP............................................................................................................61 23. Aspect 切面.......................................................................................................61 24. 在 Spring AOP 中,关注点和横切关注的区别是什么? ............................ 62 25. 连接点...................................................................................................................62 26. 通知.......................................................................................................................62 29 SpringMvc 怎么和 AJAX 相互调用的...................................................................... 62 30 当一个方法向 AJAX 返回特殊对象,譬如Object,List 等,需要做什么处理 ...... 6231 SpringMvc 里面拦截器是怎么写的........................................................................ 62 32 讲下 SpringMvc 的执行流程....................................................................................63 33 解释 Spring 支持的几种 bean 的作用域。 ............................................................ 63 34,Spring 框架中的单例 bean 是线程安全的吗? .................................................... 63 35. 解释 Spring 框架中 bean 的生命周期。 ........................................................... 63 36.哪些是重要的 bean 生命周期方法? 你能重载它们吗?................................. 64 38. 什么是基于 Java 的 Spring 注解配置? 给一些注解的例子. ....................... 64 39. 什么是基于注解的容器配置? .............................................................................64 40. 怎样开启注解装配?...........................................................................................64 41. 使用 Spring 通过什么方式访问Hibernate? ...................................................... 64 42. Spring支持的 ORM ...............................................................................................64 43.如何通过 HibernateDaoSupport 将 Spring 和 Hibernate 结合起来? ............. 64 44. Spring 支持的事务管理类型..............................................................................65 45. Spring 框架的事务管理有哪些优点?.............................................................. 65 49. 什么是 Spring MVC 框架的控制器?............................................................... 65 50. 讲下 SpringMvc 的核心入口类是什么,Struts1,Struts2 的分别是什么 ........ 65 51. SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决............ 65 52. SpingMvc 中的控制器的注解一般用那个,有没有别的注解可以替代 .............. 65 53. 如果在拦截请求中,我想拦截 get 方式提交的方法,怎么配置......................... 65 54. 如果在拦截请求中,我想拦截提交参数中包含"type=test"字符串,怎么配置65 55. SpringMvc 中函数的返回值是什么. ....................................................................66 56. SpringMVC 怎么样设定重定向和转发的.............................................................. 66 57. SpringMvc用什么对象从后台向前台传递数据的.............................................. 66 58. SpringMvc 中有个类把视图和数据都合并的一起的,叫什么 ............................ 66
6


59. 怎么样把 ModelMap 里面的数据放入Session 里面 ...........................................66 61. 当一个方法向 AJAX 返回特殊对象,譬如 Object,List 等,需要做什么处理 ... 66 63. 讲下 SpringMvc 的执行流程 .................................................................................66 64,Hibernate 是如何延迟加载?................................................................................66 66,如何优化 Hibernate?..........................................................................................67 67,在数据库中条件查询速度很慢的时候,如何优化?............................................. 67 69,Hibernate的主键生成机制..................................................................................68 69,Mybatis 比 IBatis 比较大的几个改进是什么? ................................................ 68 70,什么是 MyBatis 的接口绑定,有什么好处........................................................... 69 71,接口绑定有几种实现方式,分别是怎么实现的?................................................. 69 72,什么情况下用注解绑定,什么情况下用 xml 绑定............................................... 69 73,MyBatis实现一对一有几种方式?具体怎么操作的............................................ 69 74,MyBatis实现一对多有几种方式,怎么操作的.................................................... 69 75,MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?...................................... 69 78,讲下 MyBatis的缓存.............................................................................................69 七.软件工程与设计模式...............................................................................................................70 1、j2ee 常用的设计模式?说明工厂模式。...................................................................... 70 2、开发中都用到了那些设计模式?用在什么场合?........................................................... 70 八. j2ee 部分................................................................................................................................71 2、应用服务器与 WEB SERVER 的区别?.............................................................................71 3、应用服务器有那些?.......................................................................................................71 4、J2EE 是什么?..................................................................................................................71 5、J2EE 是技术还是平台还是框架?什么是 J2EE............................................................. 71 6、如何给 weblogic 指定大小的内存?...............................................................................71 7、如何设定的 weblogic 的热启动模式(开发模式)与产品发布模式? ........................... 71 8、如何启动时不需输入用户名与密码?.............................................................................71 9、在 weblogic 管理制台中对一个应用域(或者说是一个网站,Domain)进行 jms 及 ejb或连接池等相关信息进行配置后,实际保存在什么文件中?............................................. 71 10、在weblogic 中发布 ejb 需涉及到哪些配置文件....................................................... 71 11、如何在 weblogic 中进行 ssl 配置与客户端的认证配置或说说 j2ee(标准)进行 ssl 的配置?...................................................................................................................................72 九,项目功能实现技术问题(附带源码).................................................................................72 1, java 实现 excel 模板导出: http://www.cnblogs.com/Mr-kevin/p/5793276.html.........................................................................................................................................72 2,java 中生成验证码:http://www.cnblogs.com/syscn/p/5794391.html........................ 72 3,Java-->实现群聊功能(C/S 模式--TCP 协议): http://www.cnblogs.com/xmcx1995/p/5793879.html............................................................. 72 4,Activiti 工作流学习-----基于 5.19.0 版本(4):.................................................... 72 5,Java 关于 IO 流的介绍:................................................................................................72 6,MVC 权限管理的实现流程:............................................................................................72 7,批量数据上传的 sql.xml:............................................................................................72 8, struts—文件的上传和下载:.........................................................................................72 十. 其他问题.................................................................................................................................72 1,svn 的使用和搭建?........................................................................................................72
7


2,git 命令总结?...............................................................................................................74 3.tomcat 给你你怎样去调优?..............................................................................................75 4,Tomcat 有几种部署方式..................................................................................................76 第一种方法:.................................................................................................................76 5,eclipse 中 server location 灰色,如何修改? ........................................................ 77 7,如何加大 tomcat 可以使用的内存?.............................................................................77 8,如何加大 tomcat 连接数?.............................................................................................78

8


一. Java 基础部分
1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个 public 的类,并且public 的类名必须与文件名相一致。 一个文件中可以只有非 public 类,如果只有一个非 public 类,此类可以跟文件名不同

2、说说&和&&的区别。
&和&&都可以用作逻辑与的运算符,&&为短路与,&不是短路与。 另外&可以做为整数的位运算符 例1:对于 if(str != null&&!str.equals(“”))表达式,当 str 为null 时,后面的表达 式不会执行,所以不会出现 NullPointerException 如果将&&改为&,则会抛出 NullPointerException 异常。 例2:If(x==33 &++y>0) y 会增长,If(x==33&& ++y>0)不会增长

3、在 JAVA 中如何跳出当前的多重嵌套循环?
1. Break + 标签 2. 使用多个条件判断 3. 使用方法的 return 在 Java 中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的 break 语句,即可跳出外层循环。例如,
ok: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) {System.out.println("i=" + i + ",j=" + j); if (j == 5) breakok; } }

另外, 我个人通常并不使用标号这种方式, 而是让外层的循环条件表达式的结果可以受到里 层循环体代码的控制,例如,要在二维数组中查找到某个数字。
int arr[][] ={{1,2,3},{4,5,6,7},{9}}; boolean found = false; for(inti=0;i<arr.length&& !found;i++) { for(intj=0;j<arr[i].length;j++){ System.out.println("i=" + i +",j=" + j); if(arr[i][j] break; } } } ==5) { found = true;

第三种,使用方法的 return
private static int test() { int count = 0;
9


for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { count++;System.out.println("i=" + i + ",j=" + j); if (j == 5) {return count; } } } return 0; }

4、switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
作用在 byte, short, char, int, enum 封装类对象,其它基本数据类型及引用数据类型都不能做为 case 的条件

6、用最有效率的方法算出 2 乘以 8 等於几?
2 << 3 因为将一个数左移 n 位,就相当于乘以了2的 n 次方,那么,一个数乘以8只要将其左移3位 即可,而位运算 cpu 直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2<< 3。

7、请设计一个一百亿的计算器
如果只是大整数运算,使用 BigInteger 就可以 如果有浮点数据参与去处,需要使用 BigDecimal 进行运算 Java 中基本类型的浮点数运算是不精确的,需要使用 BigDecimal 运算,尤其是金融、会计 方向的软件

8、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能 变?
引用变量不能重新赋值,但是引用指向的对象的内容可以变化 例1:finalStringBuffer a=new StringBuffer("immutable"); a=newStringBuffer(""); 有编译错 例2: final StringBuffer a=new StringBuffer("immutable");a.append(“123”); 正确

9、"=="和 equals 方法究竟有什么区别?
他们的区别主要存在在引用数据类型上 ==为比较两侧的对象是否同一对象,是用内存地址来比较的 equals 是方法,默认是用内存地址比较,重写后,主要是用来比较两侧的对象的值是否相 同,和 equals 方法中的实现有关 ==可以两侧都为 null,但 equals 左侧的引用指向的对象不能空,不然有 NullPointerException 除非需要比较两个引用指向的对象是同一对象,一般都使用 equals 方法进行比较。尤其是
10


String 之类的值对象,另外,常量尽量放在比较的左侧

10、静态变量和实例变量的区别?
在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类, 所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。 总之, 实例变量必须创建对象后才可以通过这个对象来使用, 静态变量则可以直接使用类名 来引用。

11、是否可以从一个 static 方法内部发出对非static 方法的调用?
不可以。因为非 static 方法(实例方法)是要与对象关联在一起的,必须创建一个对象后, 才可以在该对象上进行方法调用,而 static 方法调用时不需要创建对象,可以直接调用。 也就是说, 当一个static 方法被调用时, 可能还没有创建任何实例对象, 如果从一个 static 方法中发出对非 static 方法的调用, 那个非 static 方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个 static 方法内部发出对非 static 方法的调用。

12、Integer 与 int 的区别
int 是 java 提供的 8 种原始数据类型之一,意思整型,占用 4 字节。 Integer 是java 为 int 提供的封装类,是引用数据类型。 int 的默认值为 0,而 Integer 的默认值为null,即 Integer 可以区分出未赋值和值为 0 的区别,int 则无法表达出未赋值的情况。 例如,要想表达出没有参加考试和考试成绩为 0 的区别,则只能使用 Integer 在 JSP 开发中,Integer 的默认为 null,所以用 el 表达式在文本框中显示时,值为空白字 符串, 而 int 默认的默认值为 0, 所以用el 表达式在文本框中显示时, 结果为 0,所以,int 不适合作为 web 层的表单数据的类型。 在 Hibernate 中, 如果将 OID 定义为 Integer 类型, 那么 Hibernate 就可以根据其值是否为 null 而判断一个对象是否是临时的,如果将 OID 定义为了 int 类型,还需要在 hbm 映射文 件中设置其 unsaved-value 属性为 0。 另外, Integer 提供了多个与整数相关的操作方法, 例如, 将一个字符串转换成整数, Integer 中还定义了表示整数的最大值和最小值的常量。

13、Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
Math 类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的 英文名称的含义相对应,例如,ceil 的英文意义是天花板,该方法就表示向上取整, Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor 的英文意义是地板, 该方法就表示向下取整,Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;最 难掌握的是 round 方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数 字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果 为-11。

14、请说出作用域 public,private,protected,以及不写时的区别
这四个作用域的可见范围如下表所示。 说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly/default。
11


作用域 public protected friendly private

当前类 √ √ √ √

同 package √ √ √ ×

子孙类 √ √ × ×

其他 package √ × × ×

备注:只要记住了有4种访问权限,4个访问范围,然后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。

15、Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值的 类型?
Overload 是重载的意思,Override 是覆盖的意思,也就是重写。 Overload 和 Override 有共同之处,两个方法的方法名都必须相同,如果不同,既不构成 Overload,也不构成 Override。 1. Override 必须发生在父子类之间,Overload 可以不在父子类之间 2. Override 的特点: a) 参数列表完全相同:个数相同、类型相同、顺序相同 b) 子类的返回值不能比父类的返回值范围大 c) 子类方法抛出的异常不能比父类方法抛出的异常范围大 d) 修饰符只能为 public、protected、friendly,不能为 private e) 父子类方法不能使用 static 修饰 3. 重载发生在同一个类或父子类之间,重写中参数列表至少满足个数不同、类型不同、顺序不同中的一个条件,不包含父子类之间的 static 方法

17、写 clone()方法时,通常都有一行代码(不是必须有),是什么?
clone 有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。

18、面向对象的特征有哪些方面
1. 2. 3. 4. 封装,隐藏内部实现,只暴露公共行为 继承,提高代码的重用性 多态,体现现实生活中相似对象的差异性 抽象,抽取现实世界中相似对象的共同点

19、java 中实现多态的机制是什么?
通过继承父类或实现接口。 不同子类或实现类对同一父类方法有不同的实现。 根据对象调用 相应的实现方法。另外对于相似的方法,可以使用重载。

20、abstract class 和 interface 有什么区别?
含有 abstract 修饰符的 class 即为抽象类, abstract 类不能创建的实例对象。 含有 abstract 方法的类必须定义为 abstract class, abstract class 类中的方法不必是抽象的。 abstract class 类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型。 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接 口中的方法定义默认为 public abstract 类型, 接口中的成员变量类型默认为 publicstatic final。 下面比较一下两者的语法区别: 1.抽象类可以有构造方法,接口中不能有构造方法。 2.抽象类中可以有普通成员变量,接口中没有普通成员变量
12


3.抽象类中可以包含非抽象的普通方法, 接口中的所有方法必须都是抽象的, 不能有非抽象 的普通方法。 4. 抽象类中的抽象方法的访问类型可以是 public,protected 和(默认类型,虽然 eclipse 下不报错,但应该也不行) ,但接口中的抽象方法只能是 public 类型的,并且默认 即为 public abstract 类型。 5. 抽象类中可以包含静态方法,接口中不能包含静态方法 6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是 public static final 类型,并且默认即为 public static final 类型。 7. 一个类可以实现多个接口,但只能继承一个抽象类。下面接着再说说两者在应用上的区别: 接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约; 而抽象类在代码实现方面发挥作用,可以实现代码的重用。

21、abstract 的 method 是否可同时是 static,是否可同时是 native,是否可同 时是 synchronized?
abstract 的 method 不可以是 static 的,因为抽象的方法是要被子类实现的,而 static 与 子类扯不上关系! native 方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与 abstract 混用。synchronized 和 abstract 合用的问题不能共用, abstract 方法只能存在于抽象类或接口中, 它不能直接产生对象,而默认synchronized 方法对当前对象加锁,没有对象是不能加锁。 另外 synchronized 不能被继承,子类继承时,需要另加修改符。

22、什么是内部类?Static Nested Class 和Inner Class 的不同。
内部类就是在一个类的内部定义的类。 内部可以定义在除参数位置上的任意位置。 印象中有 四种方式。 1. 静态内部类需要使用 static 修饰,而普通内部类不能使用 static 修饰 2. 静态内部类只能定义在和属性同级,普通内部类可以定义在除参数位置以外的任意位置3. 静态内部类必需有名称,而普通内部类可以是匿名的 4. 静态内部类没有 this 引用, 只此只能访问外部类的静态成员, 而普通内部类可以访问外 部类的全部成员 5. 静态内部类访问外部类的同名函数时,使用“外部类名.方法名”即可,而普通内部类需 要使用“外部类名.this.外部方法” 6. 静态内部类可以定义静态方法,而普通内部类不能定义静态方法

23、内部类可以引用它的包含类的成员吗?有没有什么限制?
1. 如果内部类为静态内部类,只能调用外部类的静态成员;如果有重名成员,需要用“外 部类名.成员名”访问;不能调用外部类的对象成员。 2. 如果内部类为非静态内部类,则可以调用外部类的所有成员;如果有重名成员,需要使 用“外部类名.this.外部方法”

24、String 是最基本的数据类型吗?
基本数据类型包括 byte、int、char、long、float、double、boolean 和short。 String 是引用数据类型。java.lang.String 类是 final 类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用 StringBuffer/StringBuilder 类

13


27、String 和 StringBuffer 的区别
这两个类都实现了 CharSequence 接口。 1. 类型不同,因为不是一个类,也没有继承关系,做参数时不能共用 2. String 对象是不可变对象,不能修改值。而 StringBuffer 是可变对象,能修改值。 3. 拼接字符串时,String 会产生新对象,而 StringBuffer 只是增加新字符,不产生新对 象,因此效率高。 4.String 覆盖了 equals 方法和 hashCode 方法,而 StringBuffer 没有覆盖 equals 方法和 hashCode 方法,所以,将 StringBuffer 对象存储进 Java 集合类中时会出现问题。

28、如何把一段逗号分割的字符串转换成一个数组?
如果不查 jdk api,我很难写出来!我可以说说我的思路:1. 用正则表达式,代码大概为:String [] result = orgStr.split(“,”,-1); 2. 用 StingTokenizer ,代码为:
StringTokenizer tokener = new StringTokenizer(s, ","); String[]result = new String[tokener.countTokens()]; Integer i = 0; while (tokener.hasMoreTokens()){ result[i++] = tokener.nextToken(); } 3. 最笨的办法,用String.indexOf()int index = -1; int oldIndex = 0; List<String> ss = newArrayList<String>(); while ((index = s.indexOf(',', index + 1)) != -1) {ss.add(s.substring(oldIndex, index)); oldIndex = index + 1; } if(s.charAt(s.length() - 1) == ',') { ss.add(""); } String[] array =ss.toArray(new String[ss.size()]); System.out.println(Arrays.toString(array));

30、final, finally, finalize 的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 内部类要访问局部变量,局部变量必须定义成 final 类型
final int[] number = { 20 }; new Thread() { @Override public void run() { for(int k = 0; k < 20; k++) { number[0]++; } } }.start();
14


Thread.sleep(10); System.out.println(number[0]);

finally 是异常处理语句结构的一部分,表示总是执行,用来释放资源。 finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法, 可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被 调用

31、运行时异常(Runtime)与检查异常(Checked)有何异同?
异常表示程序运行过程中可能出现的非正常状态, 运行时异常表示虚拟机的通常操作中可能 遇到的异常,是一种常见运行错误。java 编译器要求方法必须声明抛出可能发生的非运行 时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

32、error 和 exception 有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。 比如说内存溢出, 不可能指 望程序能处理这样的情况。exception 表示一种设计或实现问题,也就是说,它表示如果程 序运行正常,从不会发生的情况。

33、Java 中的异常处理机制的简单原理和应用。
异常是指 java 程序运行时(非编译)所发生的非正常情况或错误。 Java 使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对 象中,该对象中包含有异常的信息。 Java 可以自定义异常类,所有异常的根类为 java.lang.Throwable,Throwable 下面又派生 了两个子类:Error 和 Exception。 1. Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有退的份了,例如说内存溢出和线程死锁等系统问题。 2. Exception 表示程序还能够克服和恢复的问题,其中又分为运行时异常和检查异常,运行时异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题, 软件使用者无法克服和恢复这种问题, 但在这种问题下还可以让软件系统继续运行或者 让软件死掉。例如,数组越界(ArrayIndexOutOfBoundsException) ,空指针异常 (NullPointerException)、类转换异常(ClassCastException) ;检查异常是运行环境 的变化或异常所导致的问题, 是用户能够克服的问题,例如, 网络断线, 硬盘空间不够, 发生这样的异常后,程序不应该死掉。 Java 为运行时异常和检查异常提供了不同的解决方案,编译器强制检查异常必须 try..catch 处理或用 throws 声明继续抛给上层调用方法处理,所以检查异常也称为 checked 异常, 而运行异常可以处理也可以不处理, 所以编译器不强制用 try..catch 处理或用 throws 声明,所以运行异常也称为 Runtime 异常。 提示答题者:就按照三个级别去思考:虚拟机必须宕机的错误,程序可以死掉也可以不死掉 的错误,程序不应该死掉的错误

34、请写出你最常见到的 5 个RuntimeException。
NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、 IllegelArgumentException、SecurityException。
15


35、Java 语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在 try 块中可以抛出异常吗?
1. Java 语言如何进行异常处理见 43 题 2.throws 为向上抛异常 throw 程序出错时,手工抛出异常 try 尝试执行,里面的语句可能出现异常,如出现异常需要处理 catch 处理 try 中出现的异常 finally 在 try 后执行清理操作,用于释放资源 3. 在 try 中可以抛出异常

36, Java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop() 和 suspend()方法为何不推荐使用?

java5以前,有如下两种: 第一种: new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法,new Thread(){}表示一 个 Thread 的匿名子类的实例对象,子类加上 run 方法后的代码如下:
new Thread() { public void run() { } }.start();

第二种: new Thread(new Runnable(){}).start();这表示调用 Thread 对象接受的 Runnable 对象的 run 方法,new Runnable(){}表示一个 Runnable 的匿名子类的实例对象,runnable 的子类加 上 run 方法后的代码如下:
new Thread(new Runnable() { public void run() { } }).start();

从 Java5开始,还有如下一些线程池创建多线程的方式:
ExecutorService pool = Executors. newFixedThreadPool(3);
16


for (int i = 0; i < 10; i++) { pool.execute(new Runable() { public voidrun() { } }); } Executors.newCachedThreadPool().execute(new Runable() { publicvoid run() { } }); Executors.newSingleThreadExecutor().execute(new Runable() {public void run() { } });

有两种实现方法,分别使用 new Thread()和 newThread(runnable)形式,第一种直接调用 thread 的 run 方法,所以,我们往往使用 Thread 子类,即 new SubThread()。第二种调用 runnable 的 run 方法。 1. 有两种实现方法,分别是继承 Thread 类与实现 Runnable 接口。可以的话使用线程池 2. 用 synchronized 关键字修饰同步方法 3. 反对使用 stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态, 那么其他线程能在那种状态下检查和修改它们。 结果很难检查出 真正的问题所在。suspend()方法容易发生死锁。调用 suspend()的时候,目标线程会 停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资 源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用 suspend(),而应在 自己的 Thread 类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该 挂起,便用 wait()命其进入等待状态。若标志指出线程应当恢复,则用一个 notify() 重新启动线程。

38、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
同步是指所有操作串行化执行,顺序不能改变,前一操作未完成,后个操作不执行。 异步是指所有操作可以并行执行,顺序无关。 例如寄信 同步:如果没有寄完,不能吃饭,邮递员10天后送到,发送人被饿死 异步:寄出后可以立即吃饭,邮递员送完后,通知发送人送信结果。 如果强调执行顺序的话,用同步。如果顺序无关,则可以用异步。异步执行效率比同步高。

39. 下面两个方法同步吗?(自己发明)
class Test { synchronized static void sayHello3() { } synchronized void getX(){ } }
17


40、多线程有几种实现方法?同步有几种实现方法?
多线程有两种实现方法,分别是继承 Thread 类与实现Runnable 接口 同步的实现方面有五种,分别是 synchronized、wait 与 notify、sleep、suspend、join synchronized: 一直持有锁,直至执行结束 wait():使一个线程处于等待状态,并且释放所持有的对象的 lock,需捕获异常。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,需捕获异常,不释放锁。 notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤 醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且不是按优先级。 notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁, 而 是让它们竞争。

41、启动一个线程是用 run()还是 start()?
启动一个线程是调用 start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线 程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。

42、当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进 入此对象的其它方法?
如果其它方法中使用当前对象作为锁对象,则不能; 如果其它方法中没有使用当前对象作为锁对象,则能。

43、线程的基本概念、线程的基本状态以及状态之间的关系
在多任务操作系统中,为了提高 CPU 的利用率,可以使用多进程编程。但对进程通信比较困 难,进程间数据不能共享,因此可以使用多线程编程。一个进程至少包含一个主入口线程。单个 CPU,在同一时间只能处理一个线程的数据,但是操作系统的任务调度非常快,人眼无 法识别,感觉上是多个线程同时执行。有的线程可以已经用完 CPU,正在作磁盘操作,此时 并不使用 CPU,可以让出 CPU 资源给其它线程使用,提高效率。 线程有生命周期及相关关系和对应方法如下图:

45、介绍 Collection 框架的结构
Iterable ->Collection ->List ->ArrayList ->LinkedList ->Vector->Stack ->Set ->HashSet ->TreeSet Map ->Hashtable ->HashMap->LinkedHashMap Collections,不属于集合,是集合类的工具类
18


Arrays,不属于集合类,是数据对象的工具类

46、ArrayList 和 Vector 的区别
1. 线程同步,Vector 线程安全,ArrayList 线程不安全 2. 效率问题,Vector 效率低,ArrayList效率高 3. 增长数量,Vector 以 1.5 倍增长,ArrayList 以2 倍增长

47、HashMap 和 Hashtable 的区别
1. 线程同步,Hashtable 线程安全,HashMap 线程不安全 2. 效率问题,Hashtable 效率低,HashMap 效率高 3. HashMap 可以使用 null 作为 key,Hashtable不可以使用 null 为 key 4. HashMap 使用的是新实现,继承 AbstractMap,而 Hashtable 是继承 Dictionary 类,实 现比较老 5. Hash 算不同,HashMap 的 hash 算法比Hashtable 的 hash 算法效率高 6.HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsValue 和 containsKey。 因为 contains 方法容易让人引起误解。 7. 取值不同,HashMap 用的是 Iterator 接口,而 Hashtable 中还有使用 Enumeration 接口

48、List 和 Map 区别?
一个是存储单列数据的集合,另一个是存储键和值的双列数据的集合,List 中存储的数据 是有顺序,并且允许重复;Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是 可以有重复的。 1.List 有重复值,Map 没有重复 key,但可以有重复值 2. List 有序,Map 不一定有序 3. List 只能存单列值,Map 可以存双列值

49、List, Set, Map 是否继承自Collection 接口?
List,Set 是,Map 不是

50、List、Map、Set 三个接口,存取元素时,各有什么特点?
List 使用 get(index)取值,也可以使用Iterator、toArray 取值 Set 只能通过 Iterator、toArray 取值Map 取值使用 get(key)取值,也可以使用keySet 取键值集合,也可使用 values 取值集合,entrySet 取全部映射。

51、说出 ArrayList,Vector, LinkedList 的存储性能和特性
1. ArrayList 和 Vector 使用数组存储元素;LinkedList使用链表存储元素 2. ArrayList 和 Vector 插入删除数据时,需要搬运数据, 效率较差; LinkedList 使用链表, 不需要搬运数据,效率高 3. ArrayList 和 Vectory 查询时,按数组下标查询,不需要遍历,效率高;LinkedList 需 要遍历,查询效率底 4. ArrayList 和 Vector 的区别见 59 条

51、去掉一个 Vector 集合中重复的元素
1. 自行遍历,用另外一个 Vector 来判断是否有重复2. 用 Set(TreeSet 或 HashSet)来去重 3. 用 Apache 的CollectionUtil 工具类去重
Vector newVector = new Vector(); for (int i = 0; i < vector.size(); i++) {Object obj = vector.get(i);
19


if (!newVector.contains(obj)) newVector.add(obj); }

还有一种简单的方式,HashSet set = new HashSet(vector);

53、Collection 和 Collections 的区别。
Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List. Collections 是针对集合类的一个工具类,他提供一系列静态方法实现对各种集合的搜索、 排序、线程安全化等操作。

54、Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还 是 equals()?它们有何区别?
Set 里的元素是不能重复的,元素重复与否视具体情况而定: 1. HashSet 使用 equals 比较 2. TreeSet 使用 compareTo 进行比较

55、你所知道的集合类都有哪些?主要方法?
最常用的集合类接口是 List 和 Map。 List 的具体实现包括 ArrayList、Vector、LinkedList,它们是可变大小的列表,比较适合 构建、存储和操作任何类型对象的元素列表。List 适用于按数值索引访问元素的情形。 Set 的具体实现包括 HashSet 和 TreeSet,它们也是可变大小集合,但不适合用索引取值。 Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作"键"和"值") , 其中每个键映射到一个值。 ArrayList/Vector、LinkedList HashSet/TreeSetàSet Properties/HashTable/TreeMap/HashMapList 的主要方法有: add、get、remove、set、iterator、contains、addAll、removeAll、indexOf、toArray、clear、isEmpty Set 的主要方法有: add、remove、iterator、contains、addAll、removeAll、toArray、clear、isEmpty Map 的主要方法有: put、get、keySet、values、entrySet、clear、remove、isEmpty

56、两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这 句话对不对?
1. 2. 3. 4. 5. equals 等,hashCode 同,因此重写 equals 方法必须重写 hashCode hashCode 等,equals 不一定同,但 hashCode 最好散列化 任何对象 equals null 都得 false 没有继承关系的两个类,equals 都得 false 重写equals 方法的类最好是值类,即不可变

68、说出一些常用的类,包,接口,请各举 5 个
要让人家感觉你对 java ee 开发很熟,所以,不能仅仅只列core java 中的那些东西,要多 列你在做 ssh 项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类。常用的类: BufferedReader, BufferedWriter, FileReader, FileWirter, String, Integer,java.util.Date,System,Class,List,HashMap
20


常用的包:java.lang,java.io,java.util,java.sql,javax.servlet, org.apache.strtuts.action,org.hibernate 常用的接口: List,Map,Document,NodeList,Servlet,HttpServletRequest, HttpServletResponse,Transaction(Hibernate) ,Session(Hibernate),HttpSession

59、Java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流, 字符流。 字节流继承于 InputStream、OutputStream, 字符流继承于 Reader、Writer。 在 java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。 FileInputStream、 FileReader、 BufferedInputStream、 BufferedReader、 ZipInputStream、 PrintStream、StringReader、ObjectInputStream、RandomAccessFile(不属于流,但像流)

60、字节流与字符流的区别
字节流是按字节读取或写入设备,但字符流是以字符为单位读取或写入设备。 如果是二进制文件,需要用字节流读取。一般来说,字符流只处理文本文件。在设备中,大多数情况是以字节形式存储数据的,因此字符流通过需要传入字节流当参数。

61、什么是 java 序列化,如何实现 java 序列化?或者请解释 Serializable 接 口的作用。
序列化是把内存 Java 对象保存到存储介质中,反序列化就是把存储介质中的数据转化为 Java 对象。Java 通过ObjectInputStream 和 ObjectOutputStream 实现序列化和反序列化。需要进行序列化的对象的类必须实现 Serializable 接口,通常情况下需要满足以下条件: 1. 强烈建议手动生成 serialVersionUID 常量 2. 如果需要加解密的话,需要实现两个方法 readObject 和 writeObject 方法 3. 如果使用 Hibernate 二级缓存或其它缓存服务器的话,对象必须是可序列化的 4. 如果需要远程调用对象或传值的话,则对像需要序列化 5. 序列化类的可序列化成员必须也是可序列化的,不需要序列化的属性用transient 修饰

62、描述一下 JVM 加载 class 文件的原理机制?
1. 2. 3. 4. 查找当前 ClassLoader 中是否有此 class 的类对象,有则返回 若没有的话,向上递归所有的父 ClassLoader 中有无此 class 类对象,有则返回 若还没有,查找 BootstrapClassLoader中有无此 class 类对象,有则返回 若还没有的话,使用findClass 或 resolveClass 加载类对象a. 读取 class 二进制文件 b. 根据字节数组生成 Class 对象 c. 缓存到当前ClassLoader 中

JVM 加载 class 对象是懒加载,按需加载

63、heap 和 stack 有什么区别。
Java 的内存分为两类,一类是栈内存,一类是堆内存。 栈中存储的是当前线程的方法调用、基本数据类型和对象的引用,栈是有序的。 堆中存储的是对象的值,堆是无序的。方法中的局部变量使用 final 修饰后,放在堆中,而不是栈中。

64、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么 办法主动通知虚拟机进行垃圾回收?
对于 GC 来说,当程序员创建对象时,GC 就开始监控这个对象的地址、大小以及使用情况。通常,GC 采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对
21


象是"可达的",哪些对象是"不可达的"。当GC 确定一些对象为"不可达"时,GC 就有责任回 收这些内存空间。可以。程序员可以手动执行 System.gc(),通知 GC 运行,但是 Java 语言 规范并不保证 GC 一定会执行。

65、什么时候用 assert。
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。 在实现中,assertion 就是在程序中的一条语句,它对一个 boolean 表达式进行检查,一个正确程序必须保证这个 boolean 表达式的值为 true;如果该值为 false, 说明程序已经处于 不正确的状态下,assert 将给出警告或退出。一般来说,assertion 用于保证程序最基本、 关键的正确性。assertion 检查通常在开发和测试时开启。为了提高性能,在软件发布后, assertion 检查通常是关闭的。

66、能不能自己写个类,也叫 java.lang.String?
可以,如果非要实现 java.lang.String,需要自已写 ClassLoader,不然 JVM 优先加载默认 rt.jar 中的 java.lang.String。 可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载 rt.jar 包中的那个 java.lang.String。由于在 tomcat 的 web 应用程序中, 都是由 webapp 自己的类加载器先自己加载 WEB-INF/classess 目录中的类,然后才委托上级的类加载器加载,如果我们在 tomcat 的 web 应用程序中写一个 java.lang.String,这时候 Servlet 程序 加载的就是我们自己写的 java.lang.String,但是这么干就会出很多潜在的问题,原来所 有用了java.lang.String 类的都将出现问题。 虽然 java 提供了 endorsed 技术,可以覆盖 jdk 中的某些类,但是,能够被覆盖的类是有限制范围,反正不包括 java.lang 这样的包中的类。 (下面的例如主要是便于大家学习理解只用,不要作为答案的一部分,否则,人家怀疑是题目泄露了)例如,运行下面的程序:
package java.lang; public class String { public static void main(String[] args){ System.out.println("string"); } }

报告的错误如下: java.lang.NoSuchMethodError:main Exceptioninthread "main" 这是因为加载了 jre 自带的 java.lang.String,而该类中没有 main 方法。

67、SSH 集成方式
1. 在web.xml中配置struts的servlet或filter入口类,同时在web.xml中配置spring的listener和配置文件路径 2. 引用SSH所需的jar包放在WEB-INF/lib下,需要有struts-spring-plugin.jar 3. 在struts.xml配置中,把Struts的Action类交由Spring托管 4. 把Hibernate所需的DataSource,SessionFactory, Transcation, HibernateTemplate
22


配置在Spring的配置文件中 5. Dao层的类有时需要继承HiberateDaoSupport类,如果有HibernateTemplate时,可以不继承 6. 把Action、Service、Dao等类注册到Spring中管理

二.算法与编程
1、编写一个程序,将 a.txt 文件中的单词与 b.txt 文件中的单词交替合并到 c.txt 文件中,a.txt 文件中的单词用回车符分隔,b.txt 文件中用回车或空格 进行分隔。
答:
package com.bwie.interview; import java.io.IOException; import java.io.InputStreamReader;import java.io.PrintStream; import java.util.StringTokenizer; public classAnswerB01 { public static void main(String[] args) throws IOException {StringTokenizer tokenizer1 = getTokenzer("/a.txt"); StringTokenizertokenizer2 = getTokenzer("/b.txt"); PrintStream out = newPrintStream("C:/c.txt"); while (tokenizer1.hasMoreTokens() &&tokenizer2.hasMoreTokens()) { out.println(tokenizer1.nextToken());out.println(tokenizer2.nextToken()); } out.close(); } private staticStringTokenizer getTokenzer(String fileName) throws IOException {InputStreamReader reader = newInputStreamReader(AnswerB01.class.getResourceAsStream(fileName)); StringBuilderbuilder = new StringBuilder(1000); int length = -1; char[] cs = new char[1024];while ((length = reader.read(cs)) != -1) { builder.append(cs, 0, length); }reader.close(); return new StringTokenizer(builder.toString());
23


} }

2、编写一个程序,将 d:\java 目录下的所有.java 文件复制到 d:\jad 目录下, 并将原来文件的扩展名从.java 改为.jad。
(大家正在做上面这道题, 网上迟到的朋友也请做做这道题, 找工作必须能编写这些简单问 题的代码! ) 答: listFiles方法接受一个 FileFilter 对象, 这个FileFilter 对象就是过虑的策略对象, 不同的人提供不同的 FileFilter 实现,即提供了不同的过滤策略。
import java.io.File; import java.io.FileInputStream; importjava.io.FileOutputStream; import java.io.FilenameFilter; importjava.io.IOException; public class AnswerB02 { public static void main(String[]args) throws IOException { File sourceFolder = new File("D:/java");File[] files = sourceFolder.listFiles(new JavaFileFilter()); for (File file :files) { String absolutePath = file.getName(); String targetFile = "D:/jad/"+ absolutePath.substring(0, absolutePath.length() - 5) + ".jad";

copy(file, new File(targetFile));
} } private static void copy(File source, File target) throws IOException {FileInputStream input = new FileInputStream(source); FileOutputStream out = newFileOutputStream(target); int length = -1; byte[] bs = new byte[1024]; while((length = input.read(bs)) != -1) { out.write(bs, 0, length); } input.close();out.close(); } private static final class JavaFileFilter implementsFilenameFilter { @Override public boolean accept(File dir, String name) {return name.endsWith(".java");
24


} } }

3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节 截取的字符串,但要保证汉字不被截取半个,如“我 ABC”,4,应该截取“我 AB”,输入“我 ABC 汉 DEF”,6,应该输出“我 ABC”,而不是“我 ABC+汉的 半个”。
import java.io.IOException; public class AnswerB03 { public static voidmain(String[] args) throws IOException { String s = "我ABC汉DEF";System.out.println(substring(s, 6)); } public static String substring(String s,int length) { char[] cs = s.toCharArray(); StringBuilder builder = new StringBuilder();int count = 0; for (char c : cs) { if (isAsc(c)) { count++; } else { count +=2; } if (count > length) { break; } builder.append(c); } returnbuilder.toString(); } public static boolean isAsc(char c) { return c < 128;} }

4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印 出各个字符的个数。
答:哈哈,其实包含中文字符、英文字符、数字字符原来是出题者放的烟雾弹。
String content = "中国aadf的111萨bbb菲的zz萨菲";HashMap map = new HashMap(); for (int i = 0; i < content.length; i++) { charc = content.charAt(i); Integer num = map.get(c); if (num == null)
25


num = 1; else num = num + 1; map.put(c, num); } for (Map.EntrySet entry : map){ system.out.println(entry.getkey() + ":" + entry.getValue()); }

估计是当初面试的那个学员表述不清楚,问题很可能是: 如果一串字符如"aaaabbc 中国1512"要分别统计英文字符的数量,中文字符的数量,和数字 字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。
int engishCount; int chineseCount; int digitCount; for (int i = 0; i <str.length; i++) { char ch = str.charAt(i); if (ch >= '0' && ch<= '9') { digitCount++; } else if ((ch >= 'a' && ch <= 'z') ||(ch >= 'A' && ch <= 'Z')) { engishCount++; } else { chineseCount++;} }

5、说明生活中遇到的二叉树,用 java 实现二叉树
这是组合设计模式。 我有很多个(假设10万个)数据要保存起来, 以后还需要从保存的这些数据中检索是否存在某 个数据, (我想说出二叉树的好处,该怎么说呢?那就是说别人的缺点),假如存在数组中, 那么,碰巧要找的数字位于99999那个地方,那查找的速度将很慢,因为要从第1个依次往后 取, 取出来后进行比较。 平衡二叉树 (构建平衡二叉树需要先排序, 我们这里就不作考虑了) 可以很好地解决这个问题,但二叉树的遍历(前序,中序,后序)效率要比数组低很多,原理如下图: 代码如下:
public class AnswerB04 { public static void main(String[] args) { Node root =makeupTree();

traverse(root);
} private static void traverse(Node node) { if (node == null) { return; }
26


traverse(node.left); System.out.println(node.value); traverse(node.right);
} private static Node makeupTree() { Node root = new Node(0); Node node1 = newNode(1); Node node2 = new Node(2); Node node11 = new Node(11); Node node12 =new Node(12); Node node21 = new Node(21); Node node22 = new Node(22); root.left= node1; root.right = node2; node1.left = node11; node1.right = node12;node2.left = node21; node2.right = node22; return root; } public static classNode { public Node left; public Node right; public int value; public Node(intvalue) { this.value = value; } } }

8、递归算法题 1
一个整数,大于0,不用循环和本地变量,按照 n,2n,4n,8n 的顺序递增,当值大于5000 时,把值按照指定顺序输出来。 例:n=1237 则输出为: 1237, 2474, 4948, 9896,
27


9896, 4948, 2474, 1237, 提示:写程序时,先致谢按递增方式的代码,写好递增的以后,再增加考虑递减部分。
public static void doubleNum(int n) { System.out.println(n); if (n <= 5000)

doubleNum(n * 2); System.out.println(n);
} Gaibaota(N) = Gaibaota(N-1) + n

9、递归算法题 2
第1个人10,第2个比第1个人大2岁,依次递推,请用递归方式计算出第8个人多大?
package cn.itcast; import java.util.Date; public class A1 { public static voidmain(String[] args) { System.out.println(computeAge(8)); } public static intcomputeAge(int n) { if (n == 1) return 10; return computeAge(n - 1) + 2; } }public static void toBinary(int n, StringBuffer result) { if (n / 2 != 0)toBinary(n / 2, result); result.append(n % 2); }

10、排序都有哪几种方法?请列举。用 JAVA 实现一个快速排序。
本人只研究过冒泡排序、选择排序和快速排序,下面是快速排序的代码: 冒泡排序:
private static void bubbleSort(int[] array) { for (int i = 1; i <array.length; i++) { for (int j = 0; j < i; j++) {
28


if (array[i] < array[j]) { int temp = array[i]; array[i] = array[j]; array[j]= temp; } } } }

快速排序:
public class QuickSort { public void quickSort(String[] strDate, int left, intright) { String middle, tempDate; int i, j; i = left; j = right; middle =strDate[(i + j) / 2]; do { while (strDate[i].compareTo(middle) < 0&& i < right) i++; // 找出左边比中间值大的数 while(strDate[j].compareTo(middle) > 0 && j > left) j--; // 找出右边比中间值小的数 if (i <= j) { // 将左边大的数和右边小的数进行替换tempDate = strDate[i]; strDate[i] = strDate[j]; strDate[j] = tempDate; i++;j--; } } while (i <= j); // 当两者交错时停止 if (i < right){ quickSort(strDate, i, right); } if (j > left) { quickSort(strDate, left,j); } } public static void main(String[] args) { String[] strVoid = newString[] { "11", "66", "22", "0","55", "22", "0", "32" }; QuickSort sort= new QuickSort(); sort.quickSort(strVoid, 0, strVoid.length - 1); for (int i =0; i < strVoid.length; i++) {
29


System.out.println(strVoid[i] + " "); } } }

11、有数组 a[n],用 java 代码将数组元素顺序颠倒
public class AnswerB11 { public static void main(String[] args) { int[] array ={ 2, 25, 21, 63, 234, 83 };

reverse(array); System.out.println(Arrays.toString(array));
} private static void reverse(int[] array) { for (int i = 0; i <array.length / 2; i++) { int temp = array[i]; array[i] = array[array.length - 1- i]; array[array.length - 1 - i] = temp; } } }

12 不使用递归遍历二叉树
import java.util.Stack; public class AnswerB13 { public static voidmain(String[] args) { Node tree = makeupTree(); Stack<Node> stack = newStack<Node>(); Node currentNode = tree; while (currentNode != null) {System.out.println(currentNode.value); stack.push(currentNode); currentNode =currentNode.left; if (currentNode == null) { Node parent = stack.pop();currentNode = parent.right; if (currentNode == null) { if (stack.isEmpty()) {break; } Node parentParent = stack.pop(); currentNode = parentParent.right; }
30


} } } private static Node makeupTree() { Node root = new Node(0); Node node1 =new Node(1); Node node2 = new Node(2); Node node11 = new Node(11); Node node12= new Node(12); Node node21 = new Node(21); Node node22 = new Node(22);root.left = node1; root.right = node2; node1.left = node11; node1.right =node12; node2.left = node21; node2.right = node22; return root; } public staticclass Node { public Node left; public Node right; public int value; publicNode(int value) { this.value = value; } } }

31


三.前端页面部分
3.当 service 有一个实例变量,doGet 和 doPost 去调用这个变量,会出现什么 问题,你是如何解决的。
会出现线程不安全问题。无论是 doGet 还是 doPost 去调用,服务器端处理的过程都是一样的,那么我们可以把处理过程单独写在另外一个方法 handle 里,让两个方法都去调用 hand le,根据不同请求去调用不同的方法。 4.有三台服务器,如果在一台服务器上登陆了这个用户,其他两台就不能再登

陆这个用户,使用 session 共享,你是怎么做的。
把所有的 session 的数据保存到 Mysql 服务器上,所有 Web 服务器都来这台 Mysql 服务器来 获取 Session 数据。 5.写一个自定义标签要继承什么类 SimpleTagSupport,一般调用 doTag 方法或者实现 SimpleTag 接口

6.Jsp 如何处理 json
在 jsp 中处理 JSON,通常需要配套使用 JQuery 控件,并且导入一些 Common jar 包。使 用 JQuery 控件是因为它能有效的解析并且展示 JSON 数据,导入 Common 则是因为 Java 中的对象并不是纯粹的数据,需要通过这些 Jar 包的处理使之转化成真实数据。 7.Jsp 的重定向和转发的流程有什么区别重定向是客户端行为,转发是服务器端行为 重定向时服务器产生两次请求, 转发产生一次请求, 重定向时可以转发到项目以外的任何网 址,转发只能在当前项目里转发 重定向会导致 request 对象信息丢失。转发则不会 转发的 url 不会变,request.getRequestDispatch()。forward() 重定向的 url 会改变,response.getRedirect(); 8.Jsp 和 servlet 的区别 jsp 的可读性强,容易维护,并且 jsp 在最后会编译成 servlet,servlet 容易调试。 9.jsp 可以操作窗口吗? Jsp 不能够直接调用窗口,只能先 生成打开窗口的 js,再由 js 调用

32


10.session 的主要几个方法的区别 Session 不能通过 new 创建, 需要通过调用 getSession()或者 getSession(true)方法创建, getSession()是自动创建 session,getSession(true)是强制创建 session,setAttribute ()方法可以用于传值,getAttribute()可以用于取值 (第一次创建 session 的时候,就是访问第一次一个 jsp 页面<这个页面的page 指令 没有 设置 session=false>) 销毁 session 调用 invalidate 方法 通过 setMaxInactiveInterval()可以设定 session 的生存时间(web.xml 可以设置 session 的生存时间) 11.jsp 的三大指令,七大动作的具体功能 三大指令: Page :指令是针对当前页面的指令 Include :用于指定如何包含另一个页面 Taglib :用于定义和指定自定义标签七大动作: Forward,执行页面跳转,将请求的处理转发到另一个页面Param :用于传递参数 Include :用于动态引入一个jsp 页面 Plugin :用于下载 javaBean 或 applet 到客户端执行 useBean :使用 javaBean setProperty :修改 javaBean 实例的属性值 getProperty :获取 javaBean 实例的属性值 12.获取页面的元素和值有几种方式,分别说一下request.getParameter() 返回客户端的请求参数与值request.getParameterNames() 返回所有可用属性名的枚举request.getParameterValues() 返回包含参数的所有值的数组 13.servlet 和 javaScript 的区别,他们分别是什么作用 一个是服务端,一个是客户端Servlet 是独立于平台和协议的服务器端的 java 应用程序,可以动态生成 web 页面,并采 用响应--请求的模式提供 web 服务 javaScript 是一种解释性语言,用于向 html 页面提供交互行为,通常被直接嵌入在 html 页面中 servlet 是 java 语言编写的 web 应用 js 是基于 html 上的一种解释语言

33


14.jsp 的执行原理 客户端发出请求(request),jsp引擎将 jsp 页面翻译成 servlet 的 java 源文件,在 Tomc at 中将源文件编译成 class 文件,并加载到内存中执行,把结果返回(response)给客户端。 16.HTML 和 Servlet 的异同 不同: Html 是静态,servlet 是动态 html 页面由服务器直接返回, servlet 是用来处理客户请求,并返回 html 页面 //servlet 需要服务器调用 servlet 方法生成动态 html 页面, 且需要在 web.xml 中配置 url 路径17.会话跟踪有哪些,他们的区别是什么 Cookie,session和 application, Cookie 是 http 对象,客户端与服务端都可以操纵 cookie 是在客户端保持状态,session 是在服务器端保持状态,由于 cookie 是保存在客户 端本地的,所以数据很容易被窃取, 当访问量很多时, 使用 session 则会降低服务器的性能, application 的作用域是整个工程里只有一个,可以在不同浏览器之间共享数据,所有人都 可以共享,因此 application 也是不安全的 18.session 和 application 的作用 Session 用于客户端与服务器之间保持状态的解决方案,数据保存在服务器内存中,底层是有 cookie 实现的 Application 的作用域是整个工程里只有一个,可以在不同浏览器之间共享数据,所有人都可以共享,因此 application 是不安全的。 19.request ,response,session 和application 是怎么用的 Request 是客户端向服务端发送请求 Response 是服务端对客户端请求做出响应 Session 在 servlet 中不能直接使用, 需要通过 getSession()创建,如果没有设定它的生命 周期,或者通过 invildate()方法销毁,关闭浏览器 session 就会消失 Application 不能直接创建,存在于服务器的内存中,由服务器创建和销毁 20.有几种方式将页面的值传到后台 可通过 form 表单的 get 或 post 将值传递到后台,也可通过 setAttribute()方法将值传递 到后台 21.一个 form 表单的值如何获取 在 servlet 中通过 request.getParameter()方法可以获取表单的值 或者是request.getParameterValuse();
34


22.传递参数到后台有几种方式 表单传参,url 传参,jquery.ajax传参 23.Jsp 中父页面中怎么拿到子页面的表单元素,不是拿值怎么拿 通过设置属性 setAttribute(),通过 getAttribute()拿值,getParameter()方法可以做到 24.定义一个 String 类型的字符串,如果重定向之后还能不能获得这个数据 不能 25.404 和 500 是什么意思 404 :找不到url 请求的路径,一般是工程名不对或者拼写错误 500 :服务器内部错误,一般是服务器内部代码编写错误,也有可能是抛异常导致 26.写出 5 种 JSTL 常用标签 <c:if>,<c:item>,<c:foreach>,<c:out>,<c:set> 28.Jsp 页面把一个元素隐藏的方法 通过使用属性hidden 可以将元素隐藏 29.Session,application,cookie 的区别 Session 不能通过 new 创建,要通过调用 getSession()方法创建,数据保存在服务器端,单个客户端 session 是共享的,底层是由 cookie 实现的,大小没有限制 Application 的作用域是整个工程只有共享一个,生命周期比 session 大 Cookie 需要通过 new 创建,数据保存在客户端中,cookie 保存的数据不能超过 4k,不安全 30.我们在 web 应用开发过程中经常遇到输出某种编码的字符,如 ISO-8859-1,如何输出一 个某种编码的字符串 如将 ISO-8859-1 输出为 GBK 格式的字符, 通过 new String(byte[]bytes,String charse t) 构造器设置编码构造一个新的 String(new String("ISO-8859-1","GBK")); 32.怎么判断用户请求时是第一次,如果客户端和服务端断开怎么连到上一次操作 通过session 中的 isNew()可以判断是否是新用户33.如果创建 servlet 实例不用构造方法,怎么创建一个servlet 实例 Web 容器会自动为 servlet 写一个无参的构造器,它使用 class.forName("").newInstance ()反射来创建 servlet 实例的
35


34.Servlet 是安全的吗?当 service 有一个实例变量,doGet 和 doPost 去调用这个变量, 会出现什么问题,你是如何解决的是线程不安全的,因为 servlet 是单例模式,当多个客户端共同访问的时候线程不安全。 尽量用局部变量,同步块,如果当前字段是不会改变的,用 final 修饰 36.说明一下jsp 中<jsp: include page..>和<%@ include file%>的区别 <jsp:includepage=""/> 动态导入 是行为元素、是在请求处理阶段引入的,引入执行页面或servlet 所生成的应答文本 先编译,后包含,就是将每个jsp 页面都单独转化成 html 页面,最后再将所有的html 页面 相加,如果有相同变量不会冲突 <%@ include file=""%> 静态导入 是指令元素 是编译时包含,引入静态文本(html,jsp),在 JSP 页面被转化成 servlet 之前和它融和到一 起。先包含,后编译就是将多个 jsp 一起解析,最后再一起生成 html 页面,如果有相同变量会冲突 37. pageContext 有什么作用 可以使用 pageContext 对象来设定属性,并指定属性的作用范围,提供了对 JSP 页面内所有 的对象及名字空间的访问 39.Filter 与拦截器怎么执行的 首先初始化过滤器,然后服务器组织过滤器链,所有的请求都必须需要先通过过滤器链, 过滤器链是一个栈,遵循先进后出的原则,所有的请求需要经过一个一个的过滤器,执行 顺序要根据 web.xml 里配置的<filter-mapping>的位置前后执行,每个过滤器之间通过 chain.doFilter 连接, 最后抵达真正请求的资源,执行完后再从过滤器链退出 40.Jsp 中如何进行分页,项目中如何进行分页?需要上一页和下一页的超链接(至少需要这两个),通过计算当前页的页码获取下一页数据的起始位置,然后在 MySql 中查询,如果使用 Oracle 则需要另外计算下一页数据的结束位置。 使用 hibernate 框架,它可以针对不同的数据库自动产生为你分页的代码。

36


41,关于 Ajax 的技术组成与核心原理
1、Ajax 特点: 局部刷新、提高用户的体验度,数据从服务器商加载。 2、AJax 的技术组成:不是新技术,而是之前技术的整合 Ajax: Asynchronous Javascript And Xml;(异步的JavaScript 和 XML) 包括的技术:JavaScript、XML、CSS、XMLHttpRequest异步:发送请求以后,不等结果,由回调函数处理。 JavaScript:向服务器发送请求,获得返回结果,更新页面 XML: 用来封装数据 3、Ajax 核心原理 XMLHttpRequst 对象:通过该对象向服务器发送请求。 它是异步请求的技术,所有现代浏览器都支持(Chrome、IE5+) 1)创建 XMLHttpReuest 对象 非 IE 浏览器(Mozilla/Safari): var xhr=newXMLHttpRequest(); IE: xhr=new ActiveXObject("Msxml2.XMLHTTP"); 低版本 IE: xhr=new ActiveXObject("Microsfot.XMLHTTP");2)XMLHttpRequest 对象的属性与方法 a)方法:open("GET/POST",URL,true/false):用来向服务器建立连接 有三个参数: 参数 1:提交方式,post 或 get 参数 2:请求的 URL 参数 3:表示同步或异步请求,true:表示异步请求 false: 表示同步请求 send(data):发送请求 参数:提交的内容。 POST 方式:data 就是提交的参数,send(username=root&password=abc123); GET 方式:send(null) b)属性: onreadystatechange:设置状态改变时的回调函数,回调函数用来获取服务器数据。 onreadystatechange=function(){ }

readyState:服务器状态响应 状态码: 0:未初始化1:正在加载 2:加载完成 3:请求进行中
37


4:请求完成 responseText:服务器返回的数据(文本格式) responseXML:服务器返回的数据(XML 格式)

43.Xhtml 和 html 有什么区别。
Html(超文本标记语言)是标准通用标记语言下的一个应用,也是一种规范,一种标准。 Xhtml(可扩展超文本标记语言)是一种置标语言,表现方式与 html 类似,不过语法上更加 严格,主要不同: 1,所有元素必须被正确嵌套, 2,所有标记必须闭合, 3,标签名,属性名必须小写字母, 4,所有的属性必须用“”括起来, 5,所有非标签一部分的><&都必须以编码形式, 6,所有属性必须要有值, 7,注释中不要有-8,图片必须要有说明文字

44.css 的引入方式有哪些?link 和@import 的区别是?
四种:内联,内嵌,外链,导入 区别: 1,link 属于 xhtml 标签,@import 完全是 css 提供的一种方式,link 除了加载 css 还可以 定义 rss,定义rel 属性等,@import 只能加载 css。 2,加载顺序差别:link 引用的css 是同时被加载的,@import 引用的 css 会等到页面全部被下载完才会再被加载。 3,兼容性差别,@import 是 css2.1 提出,ie5 以上才支持,link 没有兼容问题。 4, 使用dom 控制样式的差别, 当用 javascript 去控制样式的时候, 只能使用 link, @import 不是dom 能控制的。 5,@import 可以在 css 中再次引入其他样式表。

45.css 选择符有哪些?哪些属性可以继承?优先级如何计算?内联和 important 哪个优先级高?
标签选择符,类选择符,id 选择符,继承的不如指定的,id>class>TagnameImportant 优先级高

46.前端页面由哪三层构成,分别是什么?作用是什么?
结构层:html 由 html 或者 xhtml 负责创建,运用标签对网页内容的含义作出描述。 表示层:css 由 css 负责创建,对如何显示有关内容做出回答。 行为层:javascript 由 javascript 负责创建,负责回答应该如何对事件作出反应。

47.你曾经在哪些浏览器测试过兼容?这些浏览器的内核分别是什么?
Ie(ie 内核) ,火狐(Gecko) ,谷歌(webkit) ,opera(presto) 48.<img>标签上 title 与 alt 属性的区别是什么? Alt 是在你的图片因为某种原因不能加载的时候在页面显示的提示信息,它会直接输出在原 本加载图片的地方,title 是在鼠标悬停在图片上的显示的小提示,鼠标离开就没了,绝大 数 html 标签都支持 title。49.写出几种 IE6 BUG 的解决方法? 1.双边距 BUG float 引起的 使用 display 2.3 像素问题 使用 float 引起的 使用 dislpay:inline -3px
38


3.超链接 hover 点击后失效 使用正确的书写顺序link visited hover active 4.Ie z-index 问题 给父级添加position:relative 5.Png 透明 使用 js 代码 改 6.Min-height 最小高度 !Important 解决’ 7.select 在 ie6 下遮盖 使用 iframe 嵌套 8.为什么没有办法定义 1px 左右的宽度容器(IE6 默认的行高造成的,使用 over:hidden,zoom:0.08 line-height:1px) 50.描述 css reset 的作用和用途。 Css reset 重置浏览器的默认 css 样式,浏览器种类不同,默认样式不一样,通过使用 css reset 重置,让他们统一,方便开发。 51.你如何对网站的文件和资源进行优化?期待的解决方案包括: 1,尽可能减少 http 请求数(文件合并) 2,使用CDN(内容分发网络) 3,添加Expire/Cache-Control 头 4,启用 Gzip压缩 5,css 放在页面最上面 6,scrip 放在页面最下面 7,避免在 css 中使用 Expressions 8,把 js 和 css 放在外部文件中 9,减少 dns 查询 10,压缩javascript 和 css 11,避免重定向 12,移除重复脚本 13,配置实体标签 14,使用ajax 缓存 52.什么是语义化的 html?根据内容的结构化(内容语义化) ,选择合式的标签(代码语义化) ,便于开发者的阅读和写 出更加优雅的代码的同时让浏览器的爬虫和机器更好地解析。 53.清除浮动有几种方式?各自的优缺点是? 1,父级定义 height(优点:代码少,简单易掌握;缺点:只适合固定高度元素,无法高度 自适应)2,结尾处使用空标签清除浮动:Clear:both(优点:理论上能清除所有标签的浮动,简代 码少浏览器支持好;缺点:增加了无意义的标签) 3,父级定义伪类 after 和zoom(优点:浏览器支持好;缺点:代码多,两句代码结合使用 才能让主流浏览器都支持) 4, 父级定义 overflow:hidden (优点: 代码少, 简单, 浏览器支持好; 缺点: 必须定义 width 或者 zoom,同时不能定义 height,不能和 position 配合使用) 5,父级定义 overflow:auto(优点:代码少,简单,浏览器支持好;缺点:必须定义 width 或者 zoom,同时不能定义 height,内部元素高度超过父级会出现滚动条 还有,父级一起浮动,父级定义display:table,结尾加 br 的 clear:both 等 54.解释下 CSSsprites,以及你要如何在页面或网站中使用它? 是一种网页图片应用处理方式。 它允许你将一个页面涉及到的所有零星图片都包含到一张大 图中去,这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢慢显示出来了。页面 icon 很多的情况下使用合适。
39


55,html5 有哪些新特性、移除了那些元素?如何处理HTML5 新标签的浏览器兼容问 题?如何区分 HTML 和HTML5?? HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。绘画 canvas 用于媒介回放的 video 和 audio 元素本地离线存储 localStorage 长期存 储数据,浏览器关闭后数据不丢失;sessionStorage 的数据在浏览器关闭后自动删除 语意化更好的内容元素,比如article、footer、header、nav、section 表单控件,calendar、date、time、email、url、search 新的技术webworker, websockt, Geolocation 移除的元素 纯表现的元素:basefont,big,center,font, s,strike,tt,u; 对可用性产生负面影响的元素:frame,frameset,noframes;支持 HTML5 新标签: IE8/IE7/IE6 支持通过 document.createElement 方法产生的标签, 可以利用这一特性让这些浏览器支持 HTML5 新标签, 浏览器支持新标签后,还需要添加标签默认的样式: 当然最好的方式是直接使用成熟的框架、使用最多的是 html5shim 框架 <!--[if lt IE 9]><script>src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script><![endif]--> 如何区分: DOCTYPE 声明\新增的结构元素\功能元素56.javascript 的同源策略。 一段脚本只能读取来自于同一来源的窗口和文档的属性, 这里的同一来源指的是主机名、 协 议和端口号的组合

57、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字?否则的话提 示用户并终止提交?
<form οnsubmit='chkForm(this)'> <input type="text"name="d1" /> <input type="submit" /> </form><script type="text/javascript"> function chkForm(this){ varvalue1 = this.d1.value; var len =value1.length; for(var i=0;i<len;i++){if(value1.charAt(i)>"9"|| value1.charAt(i)<"0"){alert("含有非数字字符"); return false; } } returntrue; } </script>

59. jsp 有哪些内置对象?作用分别是什么?分别有什么方法?
JSP 共有以下9个内置的对象:
40


request 用户端请求,此请求会包含来自 GET/POST 请求的参数 response 网页传回用户端的回应 pageContext 网页的属性是在这里管理 session 与请求有关的会话期 application servlet 正在执行的内容 out 用来传送回应的输出 config servlet 的构架部件 page JSP 网页本身 exception 针对错误网页,未捕捉的例外 request 表示 HttpServletRequest 对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取 cookie, header,和 session 数据的有用的方法。 response 表示 HttpServletResponse 对象,并提供了几个用于设置送回浏览器的响应的方法(如 cookies,头信息等) out 对象是 javax.jsp.JspWriter 的一个实例,并提供了几个方法使你能用于向浏览器回送 输出结果。 pageContext 表示一个 javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围 的名字空间、servlet 相关的对象的 API,并且包装了通用的 servlet 相关功能的方法。 session 表示一个请求的javax.servlet.http.HttpSession 对象。 Session 可以存贮用户的状态信息 applicaton 表示一个javax.servle.ServletContext 对象。这有助于查找有关 servlet 引擎和 servlet 环境的信息 config 表示一个 javax.servlet.ServletConfig 对象。该对象用于存取servlet 实例的初 始化参数。 page 表示从该页面产生的一个 servlet 实例

60. jsp 有哪些动作?作用分别是什么?
(这个问题似乎不重要,不明白为何有此题) 答:JSP 共有以下6种基本动作 jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个 JavaBean。 jsp:setProperty:设置 JavaBean 的属性。 jsp:getProperty:输出某个 JavaBean 的属性。 jsp:forward:把请求转到一个新的页面。 jsp:plugin:根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记

61、JSP 的常用指令
isErrorPage(是否能使用 Exception 对象),isELIgnored(是否忽略表达式)

62. JSP 中动态 INCLUDE 与静态 INCLUDE的区别?
<jsp:include page=included.jsp flush=true />它总是会检查所含文件中的变化,适合用 于包含动态页面,并且可以带参数静态 INCLUDE 用 include 伪码实现,不会检查所含文件的变化,适用于包含静态页面 <%@include file=included.htm %> 标签不同执行的时机不同, 动态 include 是在运行时把两个 JSP 合并,静态 include 是在编译期合并 动态 include 在页面发生改变时,能及时更新,而静态页面,不会再次重新编译
41


63、页面间对象传递的方法
1. 2. 3. 4. 5. request session application cookie URL 地址

三. Java web 部分
1、Tomcat 的优化经验
1. 2. 3. 4. 内存优化-Xms 增加线程数maxThreads="150" 修正 server.xml 中的中文编码 BIO 改 NIO

2、HTTP 请求的 GET 与 POST 方式的区别
答: 1. URL 地址长度不同, GET 支持的字符少 2. GET 的密码是明文,安全问题,容易受到黑客攻击 3. GET 只传输文本,不支持文件传输 4. GET 方式通常用来查询,不用来修改数据,是幂等操作,修改数据用 POST

3、解释一下什么是 servlet;
答: 通常 Servlet 特指 HttpServlet,用来接受浏览器的访问请求,浏览器最常用的请求为 GET 和 POST 方式,还有其它五种,而 HttpServlet 分别有七个方法(PUT、DELETE、HEADER、 TRACE、OPTION)处理这些类型的请求,另有一个是 J2EE 不支持的,是 CONNECT。Servlet 是 J2EE 规范中的重要成员,是构成 WEB 的重要组件

4、说一说 Servlet 的生命周期?
1. 2. 3. 4. 5. 1. 2. 3. 4. 5. 加载 Servlet 类 实例化 初始化 init 处理请求 service ? 进一步调用 doGet/doPost 方法 销毁 destory 定义一个 Servlet 类,继承 HttpServlet 抽象类 在 web.xml 中定义一个 servlet 标签,配置类名和 servlet 名 配置 servlet 处理的 URL 请求连接,可以用模糊匹配 在 J2EE 生命周期中,一个 Servlet 只有一个实例 一个 Servlet 可以为多个请求服务,每个请求在独立的线程中执行

5、Servlet 的基本架构

6、Servlet API 中 forward()与 redirect()的区别?
Forward: 服务器端内部跳转,URL 地址不变,属于单次请求 Redirect: 服务器通知浏览器中转,URL 地址发生改变,是两次跳转
42


Forward 不能跨域跳转 Redirect 可以跨域跳转Forward 在两个页面传值可以通过 parameter,也可以通过 attribute,能传递 Java 对象 Redirect 在两个页面传值只能通过 parameter,在 URL 中传参

7、Request 对象的主要方法:
setAttribute(String name,Object):设置名字为 name 的 request 的参数值 getAttribute(String name):返回由 name 指定的属性值 getAttributeNames():返回 request 对象所有属性的名字集合,结果是一个枚举的实例 getCookies():返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组 getCharacterEncoding():返回请求中的字符编码方式getContentLength():返回请求的 Body 的长度 getHeader(String name):获得 HTTP 协议定义的文件头信息 getHeaders(String name):返回指定名字的 requestHeader 的所有值,结果是一个枚举的 实例 getHeaderNames():返回所以 request Header 的名字,结果是一个枚举的实例getInputStream():返回请求的输入流,用于获得请求中的数据 getMethod():获得客户端向服务器端传送数据的方法 getParameter(String name):获得客户端传送给服务器端的有name 指定的参数值 getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例 getParametervalues(String name):获得有name 指定的参数的所有值 getProtocol():获取客户端向服务器端传送数据所依据的协议名称 getQueryString():获得查询字符串 getRequestURI():获取发出请求字符串的客户端地址 getRemoteAddr():获取客户端的 IP 地址 getRemoteHost():获取客户端的名字getSession([Boolean create]):返回和请求相关 SessiongetServerName():获取服务器的名字 getServletPath():获取客户端所请求的脚本文件的路径 getServerPort():获取服务器的端口号removeAttribute(String name):删除请求中的一个属性

8、request.getAttribute()和request.getParameter()有何区别?
1. getParameter 是表单数据或 URL 参数,不能在 server 端修改 getAttribute 是两个页面或 servlet 之间内部跳转传递对象参数,可以修改 2. getParameter 的类型只能是 String getAttribute 的类型可以是任意 Java 对象 3. forward 跳转时才有 attribute,redirect 时,attribute 全部为 null

9、MVC 的各个部分都有那些技术来实现?如何实现?
MVC 是 Model-View-Controller 的简写。 Model 代表的是应用的业务逻辑(通过 JavaBean,EJB 组件实现) ,通常是数据访问层。 View 是应用的表示层(由 JSP 页面产生)或模板框架,如 freemarker、velocity Controller 是提供应用的处理过程控制(一般是一个 Servlet) ,负责页面间跳转 通过这种设计模型把应用逻辑, 处理过程和显示逻辑分成不同的组件实现。 这些组件可以进
43


行交互和重用。

Model:JDBC、Hibernate、MyBatis
View:JSP、FreeMarker、Struts Controller:Spring MVC、Struts、Servlet SpringSide 集成 Spring、Struts、Hibernate、WebService、View 展示框架,作者江南白 衣

10、我们在 web 应用开发过程中经常遇到输出某种编码的字符,如 iso-8859-1 等,如何输出一个某种编码的字符串?
public String translate(String str) { try { return newString(str.getBytes("ISO-8859-1"), "GBK").trim(); } catch(Exception e) { System.err.println(e.getMessage()); throw newRuntimeException(e); } }

四.数据库部分
1、用两种方式根据部门号从高到低,工资从低到高列出每个员工的信息。
employee: eid, ename, salary, dept_id select * from employee order by dept_iddesc, salary;

2、ORACLE 和 MySQL 的区别。
1. Oracle 是大型数据库而 Mysql 是中小型数据库,Oracle 市场占有率达40%,Mysql只有 20%左右,同时 Mysql 是开源的而 Oracle 价格非常高 Oracle。 2. Oracle 支持大并发,大访问量,是 OLTP 最好的工具。(OLTP[联机事务处理])(OLAP[数 据仓库处理 有了基础大数据后 根据数据分析市场定位])。 3. 安装所用的空间差别也是很大的,Mysql 安装完后才几百 M 而Oracle 有几 G 左右,且使 用的时候 Oracle 占用特别大的内存空间和其他机器性能。 4.Oracle 和 Mysql 操作上的一些区别【开发人员接触的】 ①主键 Mysql 一般使用自动增长类型, 在创建表时只要指定表的主键为 auto_increment,插 入记录时,不需要再指定该记录的主键值,Mysql 将自动增长;Oracle 没有自动增长类型, 主键一般使用的序列, 插入记录时将序列号的下一个值付给该字段即可; 只是 ORM 框架是只 要是 native 主键生成策略即可。 ②单引号的处理 MYSQL 里可以用双引号包起字符串,ORACLE 里只可以用单引号包起字符串。 在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。 ③翻页的 SQL 语句的处理MYSQL 处理翻页的 SQL 语句比较简单,用 LIMIT 开始位置,记录个 数;ORACLE 处理翻页的SQL 语句就比较繁琐了。每个结果集只有一个 ROWNUM 字段标明它的 位置,并且只能用 ROWNUM<100,不能用 ROWNUM>80 ④ 长字符串的处理长字符串的处理 ORACLE 也有它特殊的地方。INSERT 和 UPDATE 时最大可
44


操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用 CLOB 类 型, 方法借用 ORACLE 里自带的 DBMS_LOB 程序包。 插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。 ⑤空字符的处理 MYSQL 的非空字段也有空的内容,ORACLE 里定义了非空字段就不容许有空的内容。按 MYSQL 的 NOT NULL 来定义 ORACLE 表结构,导数据的时候会产生错误。因此导数 据时要对空字符进行判断,如果为 NULL 或空字符,需要把它改成一个空格的字符串。 ⑥字符串的模糊比较 MYSQL 里用 字段名 like '%字符串%',ORACLE 里也可以用 字段名 like '%字符串%'但这种方法不能使用索引,速度不快。 【like ‘%’开头 无法使用索引 不使用开 头 可以使用索引】 ⑦Oracle 实现了 ANSII SQL 中大部分功能,如,事务的隔离级别、传播特性等而 Mysql 在这方面还是比较的弱

3、存储过程和函数的区别。
1). 可以理解函数是存储过程的一种 ,都是预编译的 【块语句每次运行都会编译 存储 过程块 一次编译多次运行 效率更高】 Plsql 块语句 Begin End 存储过程块 Create procedure prg_add() As Begin End;2). 函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回 值 3). 函数return 返回值没有返回参数模式,存储过程通过 out 参数返回值,如果需要返 回多个参数则建议使用存储过程 【函数 oracle 在函数可以使用 in 和 out mysql 不能 使用 out】 4). 在 sql 数据操纵(DML)语句中只能调用函数而不能调用存储过程

4、Oracle 导入和导出方式
使用 oracle 工具 exp/imp 使用 plsql 相关工具 1. 导入/导出的是二进制的数据, 2.plsql 导入/导出的是 sql语句的文本文件

5、Oracle 分页方法
Oracle 中使用 rownum 来进行分页,这个是效率最好的分页方法,hibernate 也是使用 rownum 来进行 oralce 分页的 select * from ( select rownumr,a from tabName where rownum <= 20 )where r > 10

6、mysql 的分页方法
select * from content order by id desc limit 0, 10 在中小数据量的情况下, 这样的 SQL 足够用了, 唯一需要注意的问题就是确保使用了索引。 随着数据量的增加,页数会越来越多,查看后几页的 SQL 就可能类似: select * from content order byid desc limit 10000, 10 一言以蔽之,就是越往后分页,LIMIT 语句的偏移量就会越大,速度也会明显变慢。此时,我们可以通过 2 种方式:
45


一,子查询的分页方式来提高分页效率,飘易用的 SQL 语句如下: SELECT * FROM `content` WHERE id (SELECT id FROM `content` ORDER BYid desc LIMIT ".($page-1)*$pagesize.", 1) ORDER BY id desc LIMIT$pagesize 为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的, 通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。(via)通过 explain SQL 语句发现:子查询使用了索引! id select_type table type possible_keys key key_len ref rows Extra1 PRIMARY content range PRIMARY PRIMARY 4 NULL 6264 Using where 2 SUBQUERYcontent index NULL PRIMARY 4 NULL 27085 Using index

7、解释什么是死锁,如何解决 Oracle 中的死锁?
简言之就是存在加了锁而没有解锁, 可能是使用锁没有提交或者回滚事务, 如果是表级锁则 不能操作表,客户端处于等在状态,如果是行级锁则不能操作锁定行解决办法: 1). 查找出被锁的表 selectb.owner,b.object_name,a.session_id,a.locked_mode from v$locked_objecta,dba_objects b where b.object_id = a.object_id; selectb.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b wherea.session_id = b.sid order by b.logon_time; 2). 杀进程中的会话alter system kill session "sid,serial#";

8、列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门 号排序
employee: eid, ename, salary, dept_id select count(*), a.dept_id from employeea where a.salary > (select avg(b.salary) from employee b where b.dept_id = '本部门') group by a.dept_id order by a.dept_id

9、存储过程与触发器必须讲,经常被面试到?
create or replace procedure insert_Student (_name varchar, _age int , out_idint) declear a varchar begin insert into studentvalue(null,_name,_age); selectmax(stuId)into _id from student; end; call insert_Student('wfz',23,@id); select@id;
46


mysql> create trigger update_Student BEFORE update on student FOR EACH ROW-> select * from student; 触发器不允许返回结果 create triggerupdate_StudentBEFORE update on student FOR EACH ROW insert into studentvalue(null,'zxx',28); mysql 的触发器目前不能对当前表进行操作 createtrigger update_StudentBEFORE update on student FOR EACH ROW delete fromarticles where id=8; 这个例子不是很好,最好是用删除一个用户时,顺带删除该用户的所有帖子 这里要注意使用 OLD.id 触发器用处还是很多的,比如校内网、开心网、Facebook,你发一个日志,自动通知好友,其实就是在增加日志时做一个后触发,再向通知表中写入条目。因为触发器效率高。而 UCH 没有用触发器,效率和数据处理能力都很低。存储过程的实验步骤: mysql> delimiter | mysql> create procedureinsertArticle_Procedure (pTitle varchar(50),pBid int,out pId int) -> begin-> insert into article1value(null,pTitle,pBid); -> select max(id) intopId fromarticle1; -> end; -> | Query OK, 0 rows affected (0.05sec)mysql> callinsertArticle_Procedure('传智播客',1,@pid);-> | Query OK, 0 rows affected (0.00sec) mysql> delimiter ; mysql>select @pid; @pid 3 1 row in set (0.00 sec) mysql> select * fromarticle1; id1 2 3 title test chuanzhiboke 传智播客 bid 1 1 1 3 rows inset (0.00 sec)
47


触发器的实验步骤: create table board1(id intprimary keyauto_increment,name varchar(50),ar ticleCount int); create table article1(idintprimary key auto_increment,title varchar(50) ,bid int referencesboard1(id));delimiter | create triggerinsertArticle_Trigger after insert on article1 foreach ro w begin -> update board1 setarticleCount=articleCount+1 where id=NEW.bid; -> end; -> | delimiter ; insert into board1value(null,'test',0); insert into article1value(null,'test',1); 还有,每插入一个帖子,都希望将版面表中的最后发帖时间,帖子总数字段进行同步更新,用触发器做效率就很高。下次课设计这样一个案例,写触发器时,对于最后发帖时间可能需 要用 declare 方式声明一个变量,或者是用 NEW.posttime 来生成。

10、数据库三范式是什么?
第一范式(1NF) :字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式。数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一 个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。 第二范式(2NF) :在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先 满足第一范式(1NF) 。 要求数据库表中的每个实例或行必须可以被唯一地区分。通常需要为表加上一个列, 以存储 各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性, 如果存在, 那么这个属性和主关键字的这一部分应该分离出来形成 一个新的实体, 新实体与原实体之间是一对多的关系。 为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。 第三范式的要求如下: 满足第三范式(3NF)必须先满足第二范式(2NF) 。简而言之,第三范式(3NF)要求一个数 据库表中不包含已在其它表中已包含的非主关键字信息。
48


所以第三范式具有如下特征: 1,每一列只有一个值 2,每一行都能区分。 3,每一个表都不包含其他表已经包含的非主关键字信息。 例如,帖子表中只能出现发帖人的id,而不能出现发帖人的 id,还同时出现发帖人姓名, 否则,只要出现同一发帖人 id 的所有记录,它们中的姓名部分都必须严格保持一致,这就 是数据冗余。

11、说出一些数据库优化方面的经验? 1. 程序优化,用PrepareedStatement 进行增删改查 2. 程序优化,尽量批量处理,避免逐条处理,减小 IO 数 3. 查询结果不要用*来查询所有字段,要明确指明结果字段 4. 减少多表连接数,尽量少的表进行连接 5. 表连接时,尽量用主键进行连接或用唯一索引 6. 表的查询多时,一定建立索引 7. 根据查询条件,建立索引,如果查询条件不止一个时,使用组合索引 8. 在查询条件表达式的左侧尽量不要使用函数,否则索引失效 9. 如果不得不用函数,则建立函数索引 10. 使用合适的索引,例如时间索引、哈希索引、聚簇索引 11. 如果有 like 话,尽量避免%xxx%两侧都有%的条件,单侧%可以使用索引,多 侧不可以 12. 尽量不用数据库,使用缓存 13. 可以考虑用 nosql 数据库提高效率 14. SQL 的条件表达式,在 Oracle 中,是按倒序使用索引的 15. 如果用 DDL 改动了数据库表字段,需要重建索引,不然索引失效 16. SQL 尽量不要有多余的空格和换行 17.使用分布式数据库 18. 合理创建表分区表空间 19.建立索引时字段不能有 null 值 20.使用数据库连接池 12、union和 union all 有什么不同?
union 和 union all 都是合并结果集 区别是:1. union 去除两个结果集的重复记录,union all 不去除重复记录,是两个结果集的加和 2. union 效率低,union all 效率高

13.用一条 SQL 语句查询出每门课都大于 80 分的学生姓名
name 张三 张三 李四 李四 王五 王五 王五 kecheng 语文 数学 语文 数学 语文数学 英语 fenshu 81 75 76 90 81 100 90
49


答案: A:select distinct name fromscore where name not in (select distinct name from score where fenshu <=80)B:select distinct name t1 from score where 80< all(select fenshu from score where name=t1);

14.所有部门之间的比赛组合
一个叫 department 的表, 里面只有一个字段name,一共有4条纪录, 分别是 a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条 sql 语句显示所有可能的比赛组合.select a.name, b.name from team a, team b where a.name > b.name

15.显示文章标题,发帖人、最后回复时间
文章表:article_id, title, post_user, post_date 回复表:reply_id, article_id, reply_time, content select a.title,a.post_user, r.reply_time from reply r left join article a on a.article_id =r.article_id where r.reply_id = ( select max(re.reply_id) from reply re wherere.article_id = r.article_id )

16.删除除了 id 号不同,其他都相同的学生冗余信息
学生表(student)如下: id 号 学号 姓名课程编号 课程名称 分数 id sid name cno cname score 1 2005001 张三 0001 数学 69 2 2005002 李四 0001 数学 89 3 2005001 张三 0001 数学 69 A: delete from student where idnot in(select min(id) from student group by sid, name, cno, cname, score)

18.求出发帖最多的人:
select max(post_count), b.post_user_id, u.name from ( select count(*) aspost_count, a.post_user_id from article a group by a.post_user_id
50


) b left join user u on u.user_id = b.post_user_id。

19、一个用户表中有一个积分字段,假如数据库中有 100 多万个用户,若要在 每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?
方案一:update user set score=0; 方案二:假设上面的代码要执行好长时间,超出我们的容忍范围,使用 alter table: drop columnscore;alter tableuser add column score int。 在 Oracle 中,动了表结构,索引失效方案三:使用 Java 程序,for 循环,效率最差 方案四:使用存储过程 loop 循环,效率其次差

21、注册 Jdbc 驱动程序的三种方式
1. Class.forName(driver) 2. ClassLoader.loadClass(driver) 3. new XXXDriver();

22、用 JDBC 如何调用存储过程
Class.forName("com.mysql.jdbc.Driver"); String url ="jdbc:mysql:///test"; Connection cn =DriverManager.getConnection(url, "root", "root"); Stringsql = "{call insert_student(?,?,?)}"; CallableStatement cstmt =cn.prepareCall(sql); cstmt.registerOutParameter(3, Types.INTEGER);cstmt.setString(1, "wangwu"); cstmt.setInt(2, 25); cstmt.execute();// get第几个,不同的数据库不一样,建议不写System.out.println(cstmt.getString(3));

23、JDBC 中的 PreparedStatement 相比 Statement 的好处
一个 sql 命令在数据库执行的步骤为:语法检查,语义分析,编译成内部指令,缓存指令, 执行指令等过程。 1. PrepareStatement 第一次执行某 SQL 时可以把最终结果缓存到数据中,以后再执行同一格式的 SQL 时,不再进行优化,直接使用缓存中的优化结果,效率比较高。2.参数传值,可以防止 SQL 注入

24、Class.forName 的作用?为什么要用?
答: 按参数中指定的字符串形式的类名去搜索并加载相应的类, 如果该类字节码已经被加载 过,则返回代表该字节码的Class 实例对象,否则,按类加载器的委托机制去搜索和加载该 类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。加载完这 个 Class 字节码后, 接着就可以使用 Class 字节码的 newInstance 方法去创建该类的实例对 象了。有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时 才能确定, 这时候就需要使用Class.forName 去动态加载该类, 这个类名通常是在配置文件 中配置的,例如,spring 的 ioc 中每次依赖注入的具体类就是这样配置的,jdbc 的驱动类 名通常也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动 类名。
51


25、大数据量下的分页解决方法。
查询结果集如果记录数比较多时,服务器内存和浏览器内存都可能溢出,另外,数据量太大 客户端的性能会降低,滚动条较小,操作也不方便,需要数据库分页查询。 SQL Server 分页: select top #pageSize# * fromstudents where id not in (select top #pageSize# * (#pageNumber#-1) id fromstudents order by id) order by id My SQL 分页: select *from students order by id limit #pageSize#*(#pageNumber#-1),#pageSize# Oracle 分页: select * from ( select *, rownum rid from ( select * from studentsorder by postime desc ) where rid<=#pagesize#*#pagenumber# ) as t wheret.rid>#pageSize#*(#pageNumber#-1)

26、用 JDBC 查询学生成绩单,把主要代码写出来(考试概率极大).
Connection cn = null; PreparedStatement pstmt =null; Resultset rs = null; try {Class.forname(driveClassName); cn =DriverManager.getConnection(url,username,password); pstmt=cn.prepareStatement(“select score.* fromscore ,student “ + “wherescore.stuId =student.id and student.name = ?”); pstmt.setString(1,studentName); Resultset rs=pstmt.executeQuery(); while(rs.next()) {system.out.println(rs.getInt(“subject”) + “\t”+ rs.getFloat(“score”) ); }}catch(Exception e){e.printStackTrace();} finally{ if(rs != null)try{rs.close(); }catch(exception e){} if(pstmt != null)try{pstmt.close();}catch(exceptione){} if(cn != null) try{cn.close(); }catch(exception e){} }

27、说出数据连接池的工作机制是什么?
J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端
52


程序需要连接时, 池驱动程序会返回一个未使用的池连接并将其表记为忙。 如果当前没有空 闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接标记为空闲,其他调用就可以使用这个连接。 实现方式,返回的 Connection 是原始 Connection 的代理,代理 Connection 的 close 方法 不是真正关连接,而是把它代理的 Connection 对象还回到连接池中。

28、为什么要用 ORM? 和 JDBC 有何不一样?
ORM 是对象和关系型数据库映射,是把 Java 中的JavaBean 对象和数据库表进行映射,使数 据库表中的记录和 JavaBean 对象一一对应,从而大大简化原来直接使用 JDBC 时, 手工拼写 SQL 带来的不便。 ORM 通过配置文件,使数据库表和 JavaBean 类对应起来,提供简便的操作方法,增、删、改、查记录,不再拼写字符串生成 SQL,编程效率大大提高,同时减少程序出错机率,增强 数据库的移植性,方便测试。但是原生的 JDBC 具有更强的灵活性,适合复杂多变的 SQL 应 用。 常用的 ORM 框架有:Hibernate、MyBatis、TopLink、OJB

29. 数据库大数据处理
1. 大数据可以采用分布式数据库和建立分区表(PARTITION) 2. 建立有效索引:主键索引、联合索引、倒序索引、函数索引(INDEX) 3. 使用物化视图(MATERIALIZED VIEW) 4. 使用存储过程(PROCDUDER) 5. 读写分离(golden gate 软件实现) 6. 归档旧数据(新旧数据查询,保证新数据的效率提高),程序做调整,旧数据和新数据查 询页面分离

30. 如何写出一个快排
代码后快排程序如下: [cpp] view plain copy 1. <prename="code" class="cpp">#include<iostream> 2.using namespace std; 3. int partion(int first,int last,int input[]) 4. { 5. intp=input[first]; 6. while(first<last){ 7. while(first<last &&input[last]>=p) last--; 8. input[first]=input[last]; //把小数放 p 左边 9. while(first<last &&input[first]<=p) first++; 10. input[last]=input[first]; //把大数放 p 右边 11. } 12. //此时first=last,返回基准位置即可 13. input[first]=p; 14. returnfirst; 15. } 16. void quickSort(int first,int last,int input[]) 17. { 18.if(first<last){ 19. int p=partion(first,last,input);//用基准划分
53


20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.

quickSort(first,p-1,input); //基准左侧快排quickSort(p+1,last,input); //基准右侧快排 } } int main() {int n,input[20]; cin>>n; for(int i=0;i<n;i++) cin>>input[i];quickSort(0,n-1,input); for(int i=0;i<n;i++)cout<<input[i]<<" "; cout<<endl; system("pause");return 0; }

31. 什么是事务?什么是锁?
答: 事务就是被绑定在一起作为一个逻辑工作单元的 SQL 语句分组, 如果任何一个语句操作 失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过 ACID 测试,即原子性,一致性,隔离性和持久性。锁:在所以的 DBMS 中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现 实生活中锁一样, 它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。 当然锁还分级别的。

32. 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什 么?
我是这样做的,尽可能使用约束,如 check,主键,外键,非空字段等来约束,这样做效率 最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂, 效率低下。

33. 什么是内存泄漏?
答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小 任意的,使用完后要显示释放内存。当应用程序用关键字 new 等创建对象时,就从堆中为它 分配一块内存, 使用完后程序调用 free 或者 delete 释放该内存, 否则就说该内存就不能被 使用,我们就说该内存被泄漏了。

34.触发器的作用?
触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维 护数据的完整性和一致性, 可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可 以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触 发器被触发。

35. 常用的 oracle 操作的命令
操作的命令: Sqlplus 登陆用户 Conn 连接数据库 Disconn 断开数据库连接
54


Exit 或 quit 退出 sql*plus Pass 修改用户口令 Show user 查看当前用户 List 列出 sql 缓冲区的内容 Run 或/ 执行缓冲区中的所有内容 Save 文件名 把缓冲区的内容保存到 sql 脚本文件 Get 文件名 将 sql 脚本文件中的内容加载到缓冲区 Start 或@文件名 将指定 sql脚本文件加载到缓冲区并执行 Edit 编辑缓冲区或 sql 脚本文件的内容 Spool 文件名 把 sql*plus 中的输入结果复制到指定文件中 Spool off 停止 sql*plus 中的输出结果复制,并关闭文件 Help 命令名 查看某个命令的详细帮助信息。

36,

索引的优缺点

优点: 1 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性 2 可以大大加快数据的检索速度,这也是创建索引的最主要的原因 3 可以加速表和表之间的连接, 4 在使用分组和排序子句进行数据检索时,同样可以减少查询中分组和排序的时间。 缺点:1 降低了 dml 操作的速度 2 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加 3 索引需要占据物理空间,创建索引会加大储存空间

37.使用 oracle 伪列删除表中重复记录:?
Delete table t where t.rowid!=(select where t1.name=t.name) max(t1.rowid) fromtable t1

五. XML 部分
1、xml 有哪些解析技术?区别是什么?
答:有 DOM,SAX,STAX 等 DOM:处理大型文件时其性能下降的非常厉害。 这个问题是由 DOM 的树结构所造成的,这种结 构占用的内存较多,而且 DOM 必须在解析文件之前把整个文档装入内存,适合对 XML 的随机 访问 SAX:不现于DOM,SAX 是事件驱动型的 XML 解析方式。它顺序读取XML 文件,不需要一 次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触 发一个事件, 用户通过在其回调事件中写入处理代码来处理 XML 文件, 适合对 XML 的顺序访 问 STAX:Streaming API for XML (StAX) 讲解这些区别是不需要特别去比较, 就像说传智播客与其他培训机构的区别时,我们只需说 清楚传智播客有什么特点和优点就行了,这就已经间接回答了彼此的区别。

2、你在项目中用到了 xml 技术的哪些方面?如何实现的?
答:用到了数据存贮,信息配置两方面。在做数据交换平台时,将不能数据源的数据组装成 XML 文件,然后将 XML 文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同 XML 文件中还原相关信息进行处理。在做软件配置时,利用 XML 可以很方便的进行,软件
55


的各种配置参数都存贮在 XML 文件中。

4、XML 文档定义有几种形式?它们之间有何本质区别?解析XML 文档有哪几种 方式?
a: 两种形式 dtd schema,b:本质区别:schema 本身是 xml 的,可以被 XML 解析器解析(这 也是从 DTD上发展 schema 的根本目的),c:有 DOM,SAX,STAX 等DOM:处理大型文件时其性能下降的非常厉害。这个问题是由 DOM 的树结构所造成的,这 种结构占用的内存较多,而且 DOM 必须在解析文件之前把整个文档装入内存,适合对 XML 的 随机访问 SAX:不现于DOM,SAX 是事件驱动型的 XML 解析方式。 它顺序读取XML 文件, 不需要一次全部 装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个 事件,用户通过在其回调事件中写入处理代码来处理 XML 文件,适合对 XML 的顺序访问 STAX:Streaming API forXML (StAX)

六.流行的框架与新技术
1、 谈谈你对 Struts 的理解。
1. struts 是一个按 MVC 模式设计的 Web 层框架,实质是一个强大的 Servlet。负责处理请 求转发和路由。 2. struts 的基本配置文件为 struts-config.xml,里面配置了很多 Action、ActionForm 及中转规则,这个文件通过 web.xml 中的 ActionServlet 进行加载和初始化。 3. 当用户请求发送到服务器端时,ActionServlet 会接收到此请求,然后根据 struts.xml 中的配置找到相应的 Action,同时根据 ActionForm 的配置,创建 ActionForm 的实例并进 行赋值,当做参数交给 Action 进行业务处理,返回 ActionMapping 对象。 4. ActionServlet 根据 struts.xml 中 action 的配置,forward 到指定的页面,把结果以 JSP 处理过的 HTML 返回给客户的浏览器。 5.可以继续谈一谈 struts1 和 struts2 的区别

2、Struts 优缺点 优点:
1. 实现 MVC 模式,结构清晰,使开发者只关注业务逻辑的实现. 2.有丰富的 tag 可以用,Struts 的标记库(Taglib),如能灵活动用,则能大大提高开发效 率 3. 页面导航 使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于 后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时, 这种优势体现得更加 明显。 4. 提供Exception 处理机制 . 5. 数据库链接池管理 6.支持 I18N 缺点 一、转到展示层时,需要配置forward,如果有十个展示层的 jsp,需要配置十次struts, 而且还不包括有时候目录、文件变更,需要重新修改 forward,注意,每次修改配置之后,要求重新部署整个项目,而 tomcate 这样的服务器,还必须重新启动服务器 二、Struts 的 Action 必需是thread-safe 方式,它仅仅允许一个实例去处理所有的请求。
56


所以 action 用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。 三、测试不方便. Struts 的每个 Action 都同 Web 层耦合在一起,这样它的测试依赖于 Web 容器,单元测试也很难实现。不过有一个 Junit 的扩展工具 Struts TestCase 可以实现它的 单元测试。四、类型的转换. Struts 的 FormBean 把所有的数据都作为 String 类型,它可以使用工具 Commons-Beanutils 进行类型转化。但它的转化都是在 Class 级别,而且转化的类型是不可 配置的。类型转化时的错误信息返回给用户也是非常困难的。 五、对 Servlet 的依赖性过强. Struts 处理 Action 时必需要依赖 ServletRequest 和 ServletResponse,所有它摆脱不了 Servlet 容器。 六、前端表达式语言方面.Struts 集成了 JSTL,所以它主要使用 JSTL 的表达式语言来获取 数据。可是 JSTL 的表达式语言在 Collection 和索引属性方面处理显得很弱。 七、对 Action 执行的控制困难. Struts 创建一个 Action,如果想控制它的执行顺序将会非 常困难。甚至你要重新去写 Servlet 来实现你的这个功能需求。 八、 对 Action 执行前和后的处理. Struts 处理 Action 的时候是基于 class 的 hierarchies, 很难在 action 处理前和后进行操作。 九、对事件支持不够.在 struts 中,实际是一个表单 Form 对应一个 Action 类(或DispatchAction),换一句话说:在 Struts 中实际是一个表单只能对应一个事件,struts 这种事件方式称为 application event,application event 和 component event 相比是一种粗粒度的事件。

3、STRUTS 的应用(如 STRUTS 架构)
Struts 是采用 Java Servlet/JavaServer Pages 技术,开发 Web 应用程序的开放源码的 framework。采用 Struts 能开发出基于 MVC(Model-View-Controller)设计模式的应用构架。 Struts 有如下的主要功能:一.包含一个 controller servlet,能将用户的请求发送到相应 的 Action 对象。二.JSP 自由 tag 库,并且在controller servlet 中提供关联支持,帮助 开发员创建交互式表单应用。三.提供了一系列实用对象:XML 处理、通过 Java reflection APIs 自动处理 JavaBeans 属性、国际化的提示和消息

4、谈谈你对 Hibernate 的理解。
它是 ORM 思想的一个实现, 对 JDBC 进行了很好的封装,它通过配置使 JavaBean 对象和数据 库表之间进行映射,并提供对增、删、改、查便利的操作方法,同时支持事务处理,它对数据库记录还提供了缓存机制,提高效率,它可以使程序员不用书写 SQL,也不用关心数据库 SQL 之间的差异,它通过方言对数据库进行了很好的适配。 1. Hiberante 的主配置文件为 hibernate.cfg.xml,其中定义了数据源、连接池、缓存、事 务、表生成策略等配置 2. 通过*.hbm.xml 映射配置文件,定义了 JavaBean 对象和数据库表之间的映射关系,还定 了对象和对象之间的映射关系,包括:一对一、多对一、一对多、多对多 3. 对于复杂查询和修改,Hiberante 提供了 Query 对象进行支持,它可以使用 HQL 语句处 理查询、修改、删除和分页。如果需要处理针对数据库相关的 SQL,可以 SQLQuery 对象处 理。 4. Hibernate 可以集成到 Spring 中,通过 Spring 进行事务处理,事务的配置通常分两类, 一种是 AOP 方式,一种是注释方式的声明式事务。 5. Hiberante 从 3 版本后,支持 JPA 规范,可以不使用映射文件配置,而全部采用 JPA 注 解方式进行对象和数据库表的映射,Hibernate 还扩容了 JPA 规范。 6. Hibernate 对常用的缓存技术做了封装,可以轻松的调用各种缓存框架

57


5、你对 Spring 的理解。
Spring 实质上讲就是一个 Bean 工厂,主要用来管理Bean 的生命周期和框架集成。 Spring 分为两个部分:1. IOC 控制反转(也叫 DI 依赖注入,此名由 Mardin Fowler 给出)。Spring的顶层容器为 BeanFactory,常用的ApplicationContext 为它的子接口,实现了工厂模式。Spring 需要 加载它的配置文件,通常配置文件名为 applicationContext.xml 或 spring-config.xml,其中 Bean 的定义为<bean id=”beanId”class=”xxx.class” /> 2. Spring 容器负责根据配置文件创建 Bean 对象并进行对其的装载。Bean 有懒加载,属性 配置,自动装载,parent Bean,abstract Bean,FactoryBean(通常用于框架集成,需要了解 BeanFactory 和 FactoryBean 的区别),scope(singleton 单例,prototype 多例)。 3.Spring 2.5 后提供了对注释的支持,更加方便,在重构时作用巨大。 4. Spring 的 IOC 解除了模块间的耦合,可以使项目多模块并行开发。 5. Spring 还提供了 AOP 的支持,方便在切面级开发,例如事务控制、日志、性能、安全等。 Spring 的 AOP 有两种配置方式,都是通过动态代理技术实现的,一种是 JDK 自带的 Proxy 类的实现, 一种是 CGLIB 动态代理实现, 通过<aop:aspect target-class-proxy=”true” /> 开关进行设置。 6. Spring 的重要做用是集成其它框架。 Spring 官方提供了许多类库对其它框架进行了封装,例如通过的事务模块、JMS 框架的调用模块、Email 支持、调试器 Scheduler、JNDI 等,同 时其它框架也提供了针对 Spring 的集成包,例如 Hibernate、MyBatis、Struts 等 。

6.Spring 由哪些模块组成?
以下是 Spring 框架的基本模块:
? ? ? ? ? ? ? ? ? ? ? ? ?

Core module Bean module Context module Expression Language module JDBC moduleORM module OXM module Java Messaging Service(JMS) module Transaction module Webmodule Web-Servlet module Web-Struts module Web-Portlet module

7. 核心容器模块。
这是基本的 Spring 模块,提供 spring 框架的基础功能,BeanFactory 是任何以 spring 为基础的应用的核心。Spring 框架建立在此模块之上,它使 Spring 成为一个容器。

9、写 Hibernate 的一对多和多对一双向关联的 orm配置? hibernate 的 inverse 属性的作用?
解决方案一,按照 Object[]数据取出数据,然后自己组bean 解决方案二,对每个表的 bean 写构造函数,比如表一要查出 field1,field2两个字段,那
58


么有一个构造函数就是 Bean(type1filed1,type2 field2) ,然后在 hql 里面就可以直接生成这个 bean 了。

10、在 DAO 中如何体现 DAO 设计模式?
解决方案一,按照 Object[]数据取出数据,然后自己组bean 解决方案二,对每个表的 bean 写构造函数,比如表一要查出 field1,field2两个字段,那 么有一个构造函数就是Bean(type1filed1,type2 field2) ,然后在 hql 里面就可以直接生成这个 bean 了。

11、spring+Hibernate 中委托方案怎么配置?
解决方案一,按照 Object[]数据取出数据,然后自己组bean 解决方案二,对每个表的 bean 写构造函数,比如表一要查出 field1,field2两个字段,那 么有一个构造函数就是 Bean(type1filed1,type2field2) ,然后在 hql 里面就可以直接生成这个bean 了。

12. hibernate 进行多表查询每个表中各取几个字段,也就是说查询出来的结果 集没有一个实体类与之对应如何解决;
解决方案一,按照 Object[]数据取出数据,然后自己组bean 解决方案二,对每个表的 bean 写构造函数,比如表一要查出 field1,field2两个字段,那 么有一个构造函数就是Bean(type1filed1,type2 field2) ,然后在 hql 里面就可以直接生成这个 bean 了。

13.介绍一下 Hibernate 的二级缓存
按照以下思路来回答: (1)首先说清楚什么是缓存, (2)再说有了 hibernate 的 Session 就是一级缓存, 即有了一级缓存,为什么还要有二级缓存, (3) 最后再说如何配置 Hibernate 的二级缓存。(1) 缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中 (一个数据结构中) , 这个数据结构通常是或类似 Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个 对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。下面是缓存的伪代码: 引出 hibernate 的第二级缓存,用下面的伪代码分析了 Cache 的实现原理 Dao { hashmap map = newmap();User getUser(integerid) { User user =map.get(id) if(user ==null) { user=session.get(id); map.put(id,user); } return user; } } Dao
59


{ Cache cache = null setCache(Cachecache) { this.cache =cache } UsergetUser(int id) { if(cache!=null) { Useruser = cache.get(id); if(user==null) {user= session.get(id); cache.put(id,user); } returnuser; }returnsession.get(id); } } (2)Hibernate的 Session 就是一种缓存,我们通常将之称为Hibernate 的一级缓存,当 想使用 session 从数据库中查询出一个对象时,Session 也是先从自己内部查看是否存在这 个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。由于 Session 代表一次会话过程,一个 Session 与一个数据库连接相关连,所以 Session 最好不 要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关闭。并且 Session 是线 程不安全的, 被多个线程共享时容易出现问题。 通常只有那种全局意义上的缓存才是真正的 缓存应用,才有较大的缓存价值,因此,Hibernate 的 Session 这一级缓存的缓存作用并不 明显,应用价值不大。Hibernate 的二级缓存就是要为 Hibernate 配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存。我们希望的是一个人使用过,其他人也可以使用, session 没有这种效果。(3)二级缓存是独立于 Hibernate 的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache 和 OSCache 等等。在 Hibernate 中使用二级缓存,首先就要 在 hibernate.cfg.xml 配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品 自己的配置文件, 最后要配置 Hibernate 中的哪些实体对象要纳入到二级缓存的管理中。明 白了二级缓存原理和有了这个思路后,很容易配置起 Hibernate 的二级缓存。扩展知识:一 个 SessionFactory 可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中 的数据,当使用 Hibernate 的二级缓存后,注意不要有其他的应用或 SessionFactory来更 改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。

14、Jdo 是什么?
JDO 是 Java 对象持久化的新的规范,为 javadata object 的简称,也是一个用于存取某种
60


数据仓库中的对象的标准化 API。JDO 提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如 JDBC API 的使用) 。这些繁琐的例行工作已经转移到 JDO 产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC 只是面向关系数据库(RDBMS)JDO 更通 用, 提供到任何数据底层的存储功能, 比如关系数据库、文件、 XML 以及对象数据库 (ODBMS) 等等,使得应用可移植性更强。

16.

IOC 的优点是什么?

IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例 和 JNDI 查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC 容器支持加载服 务时的饿汉式初始化和懒加载。

18.

什么是 Spring 的依赖注入?

依赖注入,是 IOC 的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对 象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC 容器)负责把他们组装起来。

19.
? ?

有哪些不同类型的 IOC(依赖注入)方式?
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有 一系列参数,每个参数代表一个对其他类的依赖。 Setter 方法注入:Setter 方法注入是容器通过调用无参构造器或无参 static 工 厂 方法实例化 bean 之后,调用该 bean 的 setter 方法,即实现了基于 setter 的依 赖注入。

20.

哪种依赖注入方式你建议使用,构造器注入,还是

Setter 方法注入?

你两种依赖方式都可以使用,构造器注入和 Setter 方法注入。最好的解决方案是用构造器 参数实现强制依赖,setter 方法实现可选依赖。

21.

Spring 对 DAO 的支持

Spring 对数据访问对象(DAO)的支持旨在简化它和数据访问技术如 JDBC, Hibernate or JDO 结合使用。 这使我们可以方便切换持久层。编码时也不用担心会捕获 每种技术特有的异常。

22.

解释 AOP

面向切面的编程,或 AOP, 是一种编程技术,允许程序模块化横向切割关注点,或横切典 型的责任划分,如日志和事务管理。

23.

Aspect

切面

AOP 核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组 API 提供 横切功能。比如,一个日志模块可以被称作日志的 AOP 切面。根据需求的不同,一个应用程 序可以有若干切面。在 Spring AOP 中,切面通过带有@Aspect 注解的类实现。

61


24.

在 Spring

AOP

中,关注点和横切关注的区别是什么?

关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。 横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

25.

连接点

连接点代表一个应用程序的某个位置, 在这个位置我们可以插入一个 AOP 切面, 它实际上是 个应用程序执行 Spring AOP 的位置。

26.

通知

通知是个在方法执行前或执行后要做的动作, 实际上是程序执行时要通过 SpringAOP 框架触 发的代码段。 Spring 切面可以应用五种类型的通知:
? ? ? ? ?

29

before:前置通知,在一个方法执行前被调用。 after: 在方法执行之后调用的通知,无论方法执行是否成功。 after-returning: 仅当方法成功完成后执行的通知。after-throwing: 在方法抛出异常退出时执行的通知。 around: 在方法执行之前和之后调用的通知。 SpringMvc 怎么和 AJAX 相互调用的

通过 Jackson 框架就可以把 Java 里面的对象直接转化成 Js 可以识别的 Json 对象 具体步骤如下 1.加入 Jackson.jar 2.在配置文件中配置 json 的映射 3.在接受 Ajax方法里面可以直接返回 Object,List 等,但方法前面要加上@ResponseBody 注解 30 当一个方法向 AJAX 返回特殊对象,譬如Object,List 等,需要做什么处理 要加上@ResponseBody注解 31 SpringMvc 里面拦截器是怎么写的 有两种写法,一种是实现接口,另外一种是继承适配器类,然后在 SpringMvc 的配置文件中 配置拦截器即可: <!-- 配置 SpringMvc 的拦截器 --><mvc:interceptors> <!-- 配置一个拦截器的 Bean 就可以了默认是对所有请求都拦截 --> <bean id="myInterceptor"class="com.et.action.MyHandlerInterceptor"></bean>

62

<!-- 只针对部分请求拦截 --> <mvc:interceptor><mvc:mapping path="/modelMap.do" /> <beanclass="com.et.action.MyHandlerInterceptorAdapter" /></mvc:interceptor> </mvc:interceptors> 32 讲下 SpringMvc 的执行流程 系统启动的时候根据配置文件创建 spring 的容器, 首先是发送 http 请求到核心控 制器 disPatherServlet,spring 容器通过映射器去寻找业务控制器,使用适配器找到相应的业务类, 在进业务类时进行数据封装, 在封装前可能会涉及到类型转 换,执行完业务类后使用ModelAndView 进行视图转发,数据放在 model 中,用 map 传递数 据进行页面显示。

33 解释 Spring 支持的几种 bean 的作用域。 Spring 框架支持以下五种 bean 的作用域:
? ? ? ? ?

singleton : bean 在每个 Spring ioc 容器中只有一个实例。 prototype:一个 bean 的定义可以有多个实例。 request:每次 http 请求都会创建一个 bean,该作用域仅在基于 web 的Spring ApplicationContext 情形下有效。 session:在一个 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效。 global-session:在一个全局的 HTTP Session 中,一个 bean 定义对应一个实例。 该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效。

缺省的 Spring bean 的作用域是Singleton. 34,Spring 框架中的单例bean 是线程安全的吗? 不,Spring 框架中的单例 bean 不是线程安全的。 35.
? ? ? ? ?

解释 Spring 框架中 bean 的生命周期。 Spring 容器 从 XML 文件中读取 bean 的定义,并实例化 bean。Spring 根据 bean 的定义填充所有的属性。 如果 bean实现了 BeanNameAware 接口,Spring 传递 bean 的 ID 到setBeanName 方法。 如果 Bean 实现了BeanFactoryAware 接口, Spring 传递beanfactory 给 setBeanFactory 方法。 如果有任何与 bean 相关联的 BeanPostProcessors,Spring 会在postProcesserBeforeInitialization()方法内调用它们。
63


如果 bean 实现 IntializingBean 了,调用它的 afterPropertySet 方法,如果 bean 声明了初始化方法,调用此初始化方法。 ? 如果有 BeanPostProcessors 和 bean 关联,这些 bean 的postProcessAfterInitialization() 方法将被调用。 ? 如果 bean 实现了 DisposableBean,它将调用 destroy()方法。 36.哪些是重要的 bean 生命周期方法? 你能重载它们吗? 有两个重要的 bean 生命周期方法,第一个是 setup , 它是在容器加载 bean 的时候被 调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。 The bean 标签有两个重要的属性(init-method 和 destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct 和@PreDestroy)。 38. 什么是基于 Java 的Spring 注解配置? 给一些注解的例子.

?

基于 Java 的配置,允许你在少量的 Java 注解的帮助下,进行你的大部分 Spring 配置而非 通过 XML 文件。 以@Configuration 注解为例,它用来标记类可以当做一个 bean 的定义,被 Spring IOC 容器使用。另一个例子是@Bean 注解,它表示此方法将要返回一个对象,作为一个 bean 注 册进 Spring 应用上下文。 39. 什么是基于注解的容器配置?

相对于 XML 文件,注解型的配置依赖于通过字节码元数据装配组件,而非尖括号的声明。 开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用 xml 表述 bean 的装配关系。 40. 怎样开启注解装配?

注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在 Spring 配置文件中配 置 <context:annotation-config/>元素。 41. 使用 Spring 通过什么方式访问 Hibernate? 在 Spring 中有两种方式访问 Hibernate:
? ?

42.

控制反转 Hibernate Template 和Callback。 继承 HibernateDAOSupport 提供一个 AOP 拦截器。 Spring 支持的ORM

Spring 支持以下 ORM: Hibernate ?iBatis ? JPA (Java Persistence API) ? TopLink ? JDO (Java Data Objects) ? OJB43.如何通过 HibernateDaoSupport 将Spring 和 Hibernate 结合起来? 用Spring 的 SessionFactory 调用LocalSessionFactory。集成过程分三步:
64

?


? ? ?

44.

配置 the Hibernate SessionFactory。 继承 HibernateDaoSupport 实现一个 DAO。 在 AOP 支持的事务中装配。 Spring 支持的事务管理类型

Spring 支持两种类型的事务管理: 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但 是难维护。 ? 声明式事务管理: 这意味着你可以将业务代码和事务管理分离, 你只需用注解和 XML配置来管理事务。 45. Spring 框架的事务管理有哪些优点? ? 它为不同的事务 API 如 JTA,JDBC,Hibernate,JPA 和 JDO,提供一个不变 的编程模式。 ? 它为编程式事务管理提供了一套简单的 API 而不是一些复杂的事务 API 如 ? 它支持声明式事务管理。 ? 它和Spring 各种数据访问抽象层很好得集成。 49. 什么是Spring MVC 框架的控制器? 控制器提供一个访问应用程序的行为, 此行为通常通过服务接口实现。 控制器解析用户输入 并将其转换为一个由视图呈现给用户的模型。Spring 用一个非常抽象的方式实现了一个控 制层,允许用户创建多种用途的控制器。50. 讲下 SpringMvc 的核心入口类是什么,Struts1,Struts2的分别是什么 SpringMvc 的是DispatchServlet,Struts1 的是 ActionServlet,Struts2 的是 StrutsPre pareAndExecuteFilter 51. SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决 方案是在控制器里面不能写字段 52. SpingMvc 中的控制器的注解一般用那个,有没有别的注解可以替代一般用@Conntroller 注解,表示是表现层,不能用别的注解代替. 53. 如果在拦截请求中,我想拦截 get 方式提交的方法,怎么配置可以在@RequestMapping 注解里面加上method=RequestMethod.GET 54. 如果在拦截请求中,我想拦截提交参数中包含"type=test"字符串,怎么配置 可以在@RequestMapping 注解里面加上params="type=test"
?

65


55. SpringMvc 中函数的返回值是什么. 返回值可以有很多类型,有 String, ModelAndView,当一般用 String 比较好 56. SpringMVC 怎么样设定重定向和转发的在返回值前面加"forward:"就可以让结果转发,譬如"forward:user.do?name=method4" 在返回值前面加"redirect:"就可以让返回值重定向,譬如"redirect:http://www.baidu.co m" 57. SpringMvc 用什么对象从后台向前台传递数据的通过 ModelMap 对象,可以在这个对象里面用 put 方法,把对象加到里面,前台就可以通过 e l 表达式拿到 58. SpringMvc 中有个类把视图和数据都合并的一起的,叫什么 叫 ModelAndView 59. 怎么样把 ModelMap 里面的数据放入 Session 里面 可以在类上面加上@SessionAttributes 注解,里面包含的字符串就是要放入 session 里面 的 key 61. 当一个方法向 AJAX 返回特殊对象,譬如Object,List 等,需要做什么处理 要加上@ResponseBody注解 63. 讲下 SpringMvc 的执行流程系统启动的时候根据配置文件创建 spring 的容器, 首先是发送 http 请求到核心控 制器 disPatherServlet,spring 容器通过映射器去寻找业务控制器, 使用适配器找到相应的业务类, 在进业务类时进行数据封装, 在封装前可能会涉及到类型转换,执行完业务类后使用 ModelAndView 进行视图转发,数据放在model 中,用 map 传递数 据进行页面显示。 64,Hibernate 是如何延迟加载? * Hibernate2 延迟加载实现:a)实体对象 * Hibernate3 提供了属性的延迟加载功能 当 Hibernate 在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时, 对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
66

b)集合(Collection)


Hibernate 中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作, 它们都市对对象进行操作, 我们 程序中把所有的表与类都映射在一起,它们通过配置文件中的 many-to-one、one-to-many、 many-to-many、 说下 Hibernate 的缓存机制 * 内部缓存存在 Hibernate 中又叫一级缓存,属于应用事物级缓存 * 二级缓存: a)应用及缓存 b)分布式缓存条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统 频繁使用、非 c) 第三方缓存的实现关键数据

Hibernate 的查询方式 Sql、Criteria,objectcomptosition Hql: * 属性查询 * 参数查询、命名参数查询 * 关联查询 * 分页查询 * 统计函数 66,如何优化 Hibernate?* 使用双向一对多关联,不使用单向一对多 * 灵活使用单向一对多关联 * 不用一对一,用多对一取代 * 配置对象缓存,不使用集合缓存 * 一对多集合使用 Bag,多对多集合使用 Set * 继承类使用显式多态 * 表字段要少,表关联不要怕多,有二级缓存撑腰 67,在数据库中条件查询速度很慢的时候,如何优化? 1.建索引 2.减少表之间的关联3.优化 sql,尽量让 sql 很快定位数据,不要让 sql 做全表查询,应该走索引,把数据量大
67


的表排在前面 4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据 69,Hibernate 的主键生成机制 1) assigned 主键由外部程序负责生成,无需 Hibernate 参与。 2) hilo 通过 hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。 3) seqhilo 与 hilo 类似,通过 hi/lo 算法实现的主键生成机制,只是主键历史状态保 存在 Sequence 中,适用于支持 Sequence 的数据库,如 Oracle。 4) increment 主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变 量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加 1 作为 主键。 这种方式可能产生的问题是: 如果当前有多个实例访问同一个数据库, 那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避 免使用。 5) identity 采用数据库提供的主键生成机制。如 DB2、SQL Server、MySQL中的主键生 成机制。 6) sequence 采用数据库提供的sequence 机制生成主键。如 Oralce 中的Sequence。 7) native 由 Hibernate根据底层数据库自行判断采用 identity、hilo、sequence 其 中一种作为主键生成方式。 8) uuid.hex 由 Hibernate 基于 128 位唯一值产生算法生成 16 进制数值 (编码后以长度 32 的字符串表示)作为主键。 9) uuid.string 与 uuid.hex 类似,只是生成的主键未进行编码(长度 16) 。在某些数据库 中可能出现问题(如 PostgreSQL) 。 10) foreign 使用外部表的字段作为主键。一般而言,利用 uuid.hex 方式生成主键将提供最好的性能和数据库平台适应性。 69,Mybatis 比 IBatis 比较大的几个改进是什么? a.有接口绑定,包括注解绑定 sql 和 xml 绑定 Sql ,b.动态 sql 由原来的节点配置变成 OGNL 表达式,c. 在一对一,一对多的时候引进了 association,在一对多的时候引入了 collectio n 节点,不过都是在 resultMap 里面配置

68


70,什么是 MyBatis 的接口绑定,有什么好处接口映射就是在 IBatis 中任意定义接口,然后把接口里面的方法和 SQL 语句绑定,我们直接 调用接口方法就可以,这样比起原来了 SqlSession 提供的方法我们可以有更加灵活的选择和设置. 71,接口绑定有几种实现方式,分别是怎么实现的? 接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select @Upda te 等注解里面包含 Sql 语句来绑定,另外一种就是通过xml 里面写 SQL 来绑定,在这种情况 下,要指定 xml 映射文件里面的namespace 必须为接口的全路径名. 72,什么情况下用注解绑定,什么情况下用 xml 绑定 当 Sql语句比较简单时候,用注解绑定,当 SQL 语句比较复杂时候,用 xml 绑定,一般用 xml 绑定的比较多 73,MyBatis 实现一对一有几种方式?具体怎么操作的 有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在 resultMap 里面配 置 association 节点配置一对一的类就可以完成;嵌套查询是先查一个表,根据这个表里面 的结果的外键 id,去再另外一个表里面查询数据,也是通过 association 配置,但另外一个表 的查询通过 select 属性配置 74,MyBatis实现一对多有几种方式,怎么操作的 有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在 resultMap里面配 置 collection 节点配置一对多的类就可以完成;嵌套查询是先查一个表,根据这个表里面的 结果的外键 id,去再另外一个表里面查询数据,也是通过配置 collection,但另外一个表的 查询通过 select 节点配置 75,MyBatis里面的动态 Sql 是怎么设定的?用什么语法? MyBatis 里面的动态 Sql 一般是通过 if 节点来实现,通过 OGNL 语法来实现,但是如果要写的 完整,必须配合where,trim 节点,where 节点是判断包含节点有内容就插入 where,否则不插 入,trim 节点是用来判断如果动态语句是以 and 或 or 开始,那么会自动把这个 and 或者 or 取掉 78,讲下 MyBatis 的缓存 MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面,默认就有,二级缓存 放在它的命名空间里,默认是打开的,使用二级缓存属性类需要实现 Serializable 序列化接 口(可用来保存对象的状态),可在它的映射文件中配置<cache/>

69


七.软件工程与设计模式
1、j2ee 常用的设计模式?说明工厂模式。
总共23种,分为三大类:创建型,结构型,行为型 我只记得其中常用的6、7种,分别是: 创建型(工厂、工厂方法、抽象工厂、单例) 结构型(包装、适配器,组合,代理)行为(观察者,模版,策略) 然后再针对你熟悉的模式谈谈你的理解即可。 Java 中的23种设计模式: Factory(工厂模式) , Builder(建造模式) , Factory Method(工厂方法模式), Prototype(原始模型模式) ,Singleton(单例模式), Facade(门面模式) , Adapter(适配器模式), Bridge(桥梁模式) , Composite(合成模式), Decorator(装饰模式) , Flyweight(享元模式), Proxy(代理模式) , Command(命令模式) , Interpreter(解释器模式) , Visitor(访问者模式) , Iterator(迭代子模式) , Mediator(调停者模式) , Memento(备忘录模式) , Observer(观察者模式) , State(状态模式) , Strategy(策略模式) , Template Method(模板方法模式) , Chain OfResponsibleity(责任链模式)

2、开发中都用到了那些设计模式?用在什么场合?
每个模式都描述了一个在我们的环境中不断出现的问题, 然后描述了该问题的解决方案的核 心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了 MVC 的设计模式。 用来开发 JSP/Servlet 或者 J2EE 的相关应用。 简单工厂模式等。

3,Session:与请求有关的会话期
setAttribute("name",Object obj):设置名字为 name 的 request 参数的值,该值是由 Obj ect 类型的 obj 指定 getAttribute("name"):返回name 属性值 getAttributeNames():返回所有可用属性名的枚举 invalidate():使当前会话失效setMaxInactiveInterval(): 指定在 Servlet 容器使此会话失效之前客户端请求之间的时间间隔,以秒为单位。负数时间指示会话永远不会超时 getMaxInactivelnterval():返回 servlet 容器在客户端访问之间将使此会话保持打开状 态的最大时间间隔,以秒为单位。在此间隔之后,servlet 容器将使会话无效

4,Out:用来传送回应的输出
print():打印信息 println():换行打印信息

70


Config:Servlet 的构架部件getInitParameter(String paramNarne):从 web.xml 中获取指定名称的值 getInitParameterNames():从 web.xml 中获取所有的名称 Page:JSP 页面本身Exception:针对错误网页,未捕捉的例外 getMessage():返回异常的详细信息 getClass():返回异常的名称

八. j2ee 部分
2、应用服务器与 WEB SERVER 的区别?
应用服务器:Weblogic、Tomcat、Jboss WEB SERVER:IIS、 Apache

3、应用服务器有那些?
BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i ApplicationServer, jBoss,Tomcat

4、J2EE 是什么?
答:Je22是 Sun 公司提出的多层(multi-diered),分布式(distributed),基于组件 (component-base)的企业级应用模型(enterprieseapplicationmodel).在这样的一个应用 系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层 次(tier)中。所属层次包括客户层(clietn tier)组件,web 层和组件,Business 层和组件, 企业信息系统(EIS)层。 一个另类的回答:j2ee 就是增删改查。

5、J2EE 是技术还是平台还是框架?什么是 J2EE
J2EE 本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 J2EE 也是一个框架,包括 JDBC、JNDI、RMI、JMS、EJB、JTA 等技术。

6、如何给 weblogic 指定大小的内存?
(这个问题不作具体回答,列出来只是告诉读者可能会遇到什么问题,你不需要面面俱到, 什么都精通。 ) 在启动Weblogic 的脚本中(位于所在 Domian 对应服务器目录下的 startServerName) ,增 加 setMEM_ARGS=-Xms32m-Xmx200m,可以调整最小内存为32M,最大200M

7、如何设定的 weblogic 的热启动模式(开发模式)与产品发布模式?
可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。 或者修改服务的启 动文件或者 commenv文件,增加 setPRODUCTION_MODE=true。

8、如何启动时不需输入用户名与密码?
修改服务启动文件,增加 WLS_USER 和 WLS_PW 项。也可以在 boot.properties 文件中增加 加密过的用户名和密码.

9、在 weblogic 管理制台中对一个应用域(或者说是一个网站,Domain)进行 jms 及 ejb或连接池等相关信息进行配置后,实际保存在什么文件中?
保存在此 Domain 的 config.xml 文件中,它是服务器的核心配置文件。

10、在 weblogic 中发布 ejb 需涉及到哪些配置文件
不同类型的 EJB 涉及的配置文件不同,都涉及到的配置文件包括
71


ejb-jar.xml,weblogic-ejb-jar.xmlCMP 实体 Bean 一般还需要 weblogic-cmp-rdbms-jar.xml

11、如何在 weblogic 中进行 ssl 配置与客户端的认证配置或说说 j2ee(标准) 进行 ssl 的配置?
缺省安装中使用 DemoIdentity.jks 和DemoTrust.jks KeyStore 实现 SSL,需要配置服务器 使用 Enable SSL,配置其端口,在产品模式下需要从 CA 获取私有密钥和数字证书,创建 identity 和 trust keystore,装载获得的密钥和数字证书。可以配置此 SSL 连接是单向还 是双向的。

九,项目功能实现技术问题(附带源码)
1,java 实现 excel 模板导出:http://www.cnblogs.com/Mr-kevin/p/5793276.html 2,java 中生成验证码:http://www.cnblogs.com/syscn/p/5794391.html3,Java-->实现群聊功能(C/S 模式--TCP 协议):
http://www.cnblogs.com/xmcx1995/p/5793879.html

4,Activiti 工作流学习-----基于 5.19.0 版本(4):
http://www.cnblogs.com/liujie037/p/5790698.html

5,Java 关于 IO 流的介绍:http://www.cnblogs.com/crshuai/p/5789648.html 6,MVC 权限管理的实现流程:http://www.cnblogs.com/xinxiaoai/p/5801995.html7,批量数据上传的 sql.xml:http://www.cnblogs.com/Asions/p/5801200.html8, struts—文件的上传和下载:
http://www.cnblogs.com/xiangkejin/p/5801032.html

十. 其他问题
1,svn 的使用和搭建? 软件下载 服务器和客户端安装 建立版本库(Repository) 配置用户和权限 运行独立服务器 初始化导入 基本客户端操作
1,软件下载 下载 Subversion 服务器程序。 到官方网站的下载二进制安装文件, 来到二进制包下载部分,找到 Windows NT, 2000, XP and 2003 部分,然后选择" this directory ",这样我们可以看到许多下载的内容,目前可以
72


下载 svn-1.4.0-setup.exe 。 下载Subversion 的 Windows 客户端TortoiseSVN。 TortoiseSVN 是扩展Windows Shell 的一套工具,可以看作 Windows 资源管理器的插件,安 装之后 Windows 就可以识别 Subversion 的工作目录。 官方网站是 TortoiseSVN ,下载方式和前面的 svn 服务器类似,在 Download 页面的我们可 以选择下载的版本,目前的最高稳定版本的安装文件为TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi。 2,服务器和客户端安装服务器安装,直接运行 svn-1.4.0-setup.exe ,根据提示安装即可,这样我们就有了一套 服务器可以运行的环境。安装 TortoiseSVN,同样直接运行TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi 按照提 示安装即可,不过最后完成后会提示是否重启,其实重启只是使 svn 工作拷贝在 windows 中的特殊样式生效,与所有的实际功能无关,这里为了立刻看到好的效果,还是重新启动机器。 3,建立版本库(Repository) 运行 Subversion 服务器需要首先要建立一个版本库 (Repository), 可以看作服务器上存放 数据的数据库,在安装了 Subversion 服务器之后,可以直接运行,如: svnadmin create E:/svndemo/repository 就会在目录E:/svndemo/repository 下创建一个版本库。 我们也可以使用 TortoiseSVN 图形化的完成这一步:在目录 E:/svndemo/repository 下"右键->TortoiseSVN->Create Repository here... “,然 后可以选择版本库模式,这里使用默认即可, 然后就创建了一系列目录和文件。 4,配置用户和权限 来到E:/svndemo/repository/conf 目录,修改 svnserve.conf: # [general] # password-db = passwd 改为:[general] password-db = passwd 然后修改同目录的 passwd 文件,去掉下面三行的注释: # [users] # harry = harryssecret # sally = sallyssecret 最后变成: [users] harry = harryssecret sally = sallyssecret 在这里,因为一般来说,项目的 svn 的用户名和密码是统一认证的,而为了不每次都输入密
73


码,所以在使用 TortoiseSVN 的时候,直接都记住了密码,这里的用户名和密码最好和项目 的一致,以免出现意外情况。 5,运行独立服务器 在任意目录下运行: svnserve -d -rE:/svndemo/repository 我们的服务器程序就已经启动了。注意不要关闭 命令行窗口,关闭窗口也会把 svnserve 停止。 在使用中发现,即使关闭了此窗口,svn 一样好使~~不知道为啥~ 6,初始化导入 来到我们想要导入的项目根目录,在这个例子里是 E:/svndemo/initproject,目录下有一 个 readme.txt 文件:右键->TortoiseSVN->Import... URL of repository 输入“svn://localhost/” ok 完成之后目录没有任何变化, 如果没有报错, 数据就已经全部导入到了我们刚才定义的版本库中。 需要注意的是, 这一步操作可以完全在另一台安装了 TortoiseSVN 的主机上进行。 例如运行 svnserve 的主机的 IP 是133.96.121.22,则 URL 部分输入的内容就是“svn://133.96.121.22/” 。 在这里,不知道为什么,使用 svn://localhost/一直都搞不定,最后灵机一动使用了 file:///E:/svndemo/repository/ 反而搞定了~~ 7,基本客户端操作 取出版本库到一个工作拷贝: 来到任意空目录下,在本例中是E:/svndemo/wc1,运行右键->Checkout,在 URL of repository 中输入 svn://localhost/,这样我们就得到了一份工作拷贝。在工作拷贝中作出修改并提交: 打开 readme.txt,作出修改,然后右键->Commit...,这样我们就把修改提交到了版本库,我们可以运行。 察看所作的修改: readme.txt 上右键->TortoiseSVN->ShowLog,这样我们就可以看到我们对这个文件所有的 提交。在版本 1 上右键->Compare with working copy,我们可以比较工作拷贝的文件和版 本 1 的区别。 2,git 命令总结? pwd 命令:显示当前的目录 git init:把当前目录变成 git 可以管理的仓库 git diff 文件名:查看修改了什么内容 git log:查看 commit 历史,包括时间、作者、版本号、commit 备注 git log --pretty=oneline:查看 commit 历史,只显示时间和 commit 备注 git reset --hard 版本号:指定往前或往后穿越到任意一个版本,版本号通过git reflog 查看 git reflog:查看版本操作历史,显示缩略版本号、commit 备注 git checkout ./-- 不带引号的文件名:撤销工作区修改。如果存在 add 但没有 commit 的
74


内容,则回到 add 后的状态,删除没有 add 的修改;如果没有 add 的内容,则回到最近一次 commit 完的状态 git checkout -- 文件名:在 commit 之前执行,可恢复删除的文件 cat 文件名:查看文件内容 git branch:查看当前所有分支,当前所在的分支前面加* git branch 分支名:创建新分支,但不切换过去,如果当前已存在该分支则报错git checkout 分支名:切换到指定分支,如果该分支不存在则报错 git checkout -b 分支名:创建新分支并切换到该分支,相当于上面两条命令先后执行,如果分支已存在则报错,并不会切换过去 git branch -d 分支名:删除指定分支,必须在本分支上删除当前所在的分支,必须在其他分支上删除 git merge 分支名:使当前所在分支内容和 merge 后面指定的分支内容一致,也就是修改当前所在的分支,接着删除 merge 后指定的分支也可以 git remote(-v):查看远程库信息,加上-v 查看详细信息 命令退不出来,按 ctrl+C 输入前面输过的命令,按 PgUp/PgDnhttp://www.cnblogs.com/tugenhua0707/p/4050072.html git 使用教程详解

3.tomcat 给你你怎样去调优?
1. JVM 参数调优: -Xms<size> 表示 JVM 初始化堆的大小, -Xmx<size>表示 JVM 堆的最大值。 这两个值的大小一般根据需要进行设置。 当应用程序需要的内存超出堆的最大值时虚拟机就 会提示内存溢出,并且导致应用服务崩溃。 因此一般建议堆的最大值设置为可用内存的最大 值的 80%。在 catalina.bat 中,设置 JAVA_OPTS='-Xms256m-Xmx512m',表示初始化内存为 256MB,可以使用的最大内存为 512MB。 2. 禁用 DNS 查询当 web 应用程序向要记录客户端的信息时,它也会记录客户端的 IP 地址或者通过域名服务器查找机器名转换为 IP 地址。DNS 查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的 IP 的过程, 这样会消耗一定的时间。 为了消除 DNS 查询对性能的影响我们可以关闭 DNS 查询, 方式是修改 server.xml 文件中的 enableLookups 参数值: Tomcat4 <ConnectorclassName="org.apache.coyote.tomcat4.CoyoteConnector"port="80" minProcessors="5" maxProcessors="75"enableLookups="false" redirectPort="8443"acceptCount="100" debug="0"connectionTimeout="20000" useURIValidationHack="false"disableUploadTimeout="true" /> Tomcat5 <Connector port="80"maxThreads="150" minSpareThreads="25"maxSpareThreads="75" enableLookups="false"redirectPort="8443" acceptCount="100" debug="0"connectionTimeout="20000" disableUploadTimeout="true"/>3. 调整线程数 通过应用程序的连接器(Connector)进行性能控制的的参数是创建的处理请求的线程数。 Tomcat 使用线程池加速响应速度来处理请求。在 Java 中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线 程帮助程序员写出 CPU 最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请
75


求。 Tomcat4 中可以通过修改minProcessors 和 maxProcessors 的值来控制线程数。这 些值在安装后就已经设定为默认值并且是足够使用的,但是随着站点的扩容而改大这些值。 minProcessors 服务器启动时创建的处理请求的线程数应该足够处理一个小量的负载。也就 是说,如果一天内每秒仅发生 5 次单击事件,并且每个请求任务处理需要 1 秒钟,那么预先 设置线程数为 5 就足够了。 但在你的站点访问量较大时就需要设置更大的线程数, 指定为参 数maxProcessors 的值。maxProcessors 的值也是有上限的,应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小。如果要加大并发连接数,应同时 加大这两个参数。web server 允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右,Linux是 1000 个左右。 在 Tomcat5 对这些参数进行了调整,请看下面属性: maxThreads Tomcat 使用线程来处理接收的每个请求。这个值表示Tomcat 可创建的 最大的线程数。 acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队 列中的请求数,超过这个数的请求将不予处理。 connnectionTimeout 网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设 置有隐患的。通常可设置为 30000 毫秒。 minSpareThreads Tomcat 初始化时创建的线程数。maxSpareThreads 一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程。 最好的方式是多设置几次并且进行测试,观察响应时间和内存使用情况。在不同 的机器、 操作系统或虚拟机组合的情况下可能会不同,而且并不是所有人的 web 站点的流量 都是一样的,因此没有一刀切的方案来确定线程数的值。

4,Tomcat 有几种部署方式
第一种方法:

在 tomcat 中的 conf 目录中,在 server.xml 中的,<host/>节点中添加:<Context path="/hello"docBase="D:/eclipse3.2.2/forwebtoolsworkspacehello/WebRoot"debug="0" privileged="true"> </Context> 至于 Context 节点属性,可详细见相关文档。
第二种方法:

将 web 项目文件件拷贝到 webapps 目录中。
第三种方法:

很灵活,在 conf 目录中,新建 Catalina(注意大小写)\localhost 目录,在该目录中新 建一个 xml 文件,名字可以随意取,只要和当前文件中的文件名不重复就行了,该 xml 文件 的内容为: <Context path="/hello"docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot"debug="0" privileged="true"> </Context>

76


第 3 个方法有个优点,可以定义别名。服务器端运行的项目名称为path,外部访问的 URL 则使用 XML 的文件名。这个方法很方便的隐藏了项目的名称, 对一些项目名称被固定不能更 换,但外部访问时又想换个路径,非常有效。 第 2、3 还有优点,可以定义一些个性配置,如数据源的配置等。
第四种办法,:

可以用 tomcat 在线后台管理器,一般 tomcat 都打开了,直接上传war 就可以。

5,eclipse 中 server location 灰色,如何修改? Eclipse 中 tomcat service 设置 选择 window ----show view---services 可以看到服务的面板双击 tomcat 进入配置界面 Service Locations(Specify the server path (i.e. catalina.base) and deploy path. Servermust be published with no modules present to make changes.)选项变灰色无法更改配置。 若要更改,则先把 tomcat 下的所有項目移除。并右击,clean...之后方可设置。。。启动后将又变为黑色。 默认选项为: Use workspace metadata(dose not modify Tomcatinstallation) 修改选项为: Use Tomcat installation(takescontrol of Tomcat installation)

这样在 Eclipse 启动了 tomcat 服务器,我們也能夠访问到 tomcat 本地管理首页。 否则只能在 DOS 下使用 Tomcat 的启动命令才能访问 Tomcat 本地管理首页。 注意:Deploy path 由:wtpwebapps 改为 webapps 7,如何加大 tomcat 可以使用的内存? tomcat 默认可以使用的内存为 128MB,在较大型的应用项目中,这点内存是不够的,需要调大。 Unix 下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下设置: JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】' 需要把这个两个参数值调大。例如: JAVA_OPTS='-Xms256m -Xmx512m'
77


表示初始化内存为 256MB,可以使用的最大内存为 512MB。

8,如何加大 tomcat 连接数?
在 tomcat 配置文件 server.xml 中的<Connector />配置中,和连接数相关的参数有:minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为 10maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为 75 acceptCount:允许的最大连接数,应大于等于 maxProcessors,默认值为 100 enableLookups:是否反查域名, 取值为: true 或 false。 为了提高处理能力,应设置为 false connectionTimeout:网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐 患的。通常可设置为 30000 毫秒。 其中和最大连接数相关的参数为 maxProcessors 和 acceptCount。如果要加大并发连接数,应同时加大这两个参数。 web server 允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个 左右,Linux 是 1000 个左右。tomcat5中的配置示例: <Connector port="8080"maxThreads="150" minSpareThreads="25"maxSpareThreads="75" enableLookups="false" redirectPort="8443"acceptCount="100" debug="0"connectionTimeout="20000" disableUploadTimeout="true" />对于其他端口的侦听配置,以此类推。

78

点击隐藏

相关文档

2016-2017年九年级语文上册第四单元综合检测试题 (新版)新人教版人教新目标版江西省2016-2017学年八年级英语上学期第一次月考试题及答案人教新目标版安徽省2016-2017学年八年级英语上学期第一次月考试题及答案人教新目标版辽宁省2016-2017学年八年级英语上学期第一次月考试题及答案人教新目标版湖南省2016-2017学年八年级英语下学期第一次月考试题及答案2016最新版人教版小学二年级数学上册第四单元测试题2016新版一年级语文上册第三单元测试题2016新版小学一年级语文上册第二单元测试题及答案2016-2017学年第一学期新版PEP小学英语三年级上册期末试题及答案2016-2017年九年级语文上册第四单元综合测试题 (新版)新人教版最新JAVA编程题全集(50题及答案)Java就业面试题大全(精选)张孝祥Java就业面试题大全

m.racktom.com

共享资料网

电脑版

copyright ©right 2015-2020 共享资料网

error 0x006!请联系客服!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Java 选课系统的代码示例,仅供参考: Course.java ``` public class Course { private String id; // 课程编号 private String name; // 课程名称 private int selectedCount; // 已选人数 private int maxCount; // 最大可选人数 private String teacher; // 授课教师 private boolean isSelected; // 是否已选 public Course(String id, String name, int maxCount, String teacher) { this.id = id; this.name = name; this.maxCount = maxCount; this.teacher = teacher; this.isSelected = false; } public String getId() { return id; } public String getName() { return name; } public int getSelectedCount() { return selectedCount; } public int getMaxCount() { return maxCount; } public String getTeacher() { return teacher; } public boolean isSelected() { return isSelected; } public void setSelected(boolean selected) { isSelected = selected; } public boolean isFull() { return selectedCount >= maxCount; } public boolean select() { if (isFull()) { return false; } selectedCount++; isSelected = true; return true; } public boolean cancelSelect() { if (!isSelected) { return false; } selectedCount--; isSelected = false; return true; } @Override public String toString() { return id + " " + name + " " + selectedCount + "/" + maxCount + " " + teacher; } } ``` Student.java ``` public class Student { private String id; // 学号 private String name; // 姓名 private String password; // 密码 private String grade; // 年级 public Student(String id, String name, String password, String grade) { this.id = id; this.name = name; this.password = password; this.grade = grade; } public String getId() { return id; } public String getName() { return name; } public String getPassword() { return password; } public String getGrade() { return grade; } @Override public String toString() { return id + " " + name + " " + grade; } } ``` CourseDB.java ``` import java.util.ArrayList; import java.util.List; public class CourseDB { private static CourseDB instance; private List<Course> courses; private CourseDB() { courses = new ArrayList<>(); courses.add(new Course("C001", "Java基础", 30, "张三")); courses.add(new Course("C002", "Java高级", 20, "李四")); courses.add(new Course("C003", "数据库", 25, "王五")); courses.add(new Course("C004", "计算机网络", 20, "赵六")); courses.add(new Course("C005", "操作系统", 30, "钱七")); } public static CourseDB getInstance() { if (instance == null) { instance = new CourseDB(); } return instance; } public List<Course> getCourses() { return courses; } public Course findCourseById(String courseId) { for (Course course : courses) { if (course.getId().equals(courseId)) { return course; } } return null; } } ``` StudentDB.java ``` import java.util.ArrayList; import java.util.List; public class StudentDB { private static StudentDB instance; private List<Student> students; private StudentDB() { students = new ArrayList<>(); students.add(new Student("S001", "张三", "123456", "大一")); students.add(new Student("S002", "李四", "123456", "大二")); students.add(new Student("S003", "王五", "123456", "大三")); students.add(new Student("S004", "赵六", "123456", "大四")); students.add(new Student("S005", "钱七", "123456", "大一")); } public static StudentDB getInstance() { if (instance == null) { instance = new StudentDB(); } return instance; } public List<Student> getStudents() { return students; } public Student findStudentById(String studentId) { for (Student student : students) { if (student.getId().equals(studentId)) { return student; } } return null; } } ``` Login.java ``` import java.util.Scanner; public class Login { public static Student doLogin() { Scanner scanner = new Scanner(System.in); System.out.println("学生选课管理——登录"); System.out.print("请输入学号:"); String studentId = scanner.nextLine(); System.out.print("请输入密码:"); String password = scanner.nextLine(); Student student = StudentDB.getInstance().findStudentById(studentId); if (student == null || !student.getPassword().equals(password)) { System.out.println("登录失败,请检查学号和密码是否正确!"); return null; } System.out.println("登录成功,欢迎" + student.getName() + "!"); return student; } } ``` SelectCourse.java ``` import java.util.Scanner; public class SelectCourse { public static void doSelect(Student student) { Scanner scanner = new Scanner(System.in); CourseDB courseDB = CourseDB.getInstance(); System.out.println("可选课程列表:"); for (Course course : courseDB.getCourses()) { System.out.println(course); } System.out.print("请输入要选择的课程编号:"); String courseId = scanner.nextLine(); Course course = courseDB.findCourseById(courseId); if (course == null) { System.out.println("选课失败,该课程不存在!"); return; } if (course.isSelected()) { System.out.println("选课失败,该课程已经被选择!"); return; } boolean success = course.select(); if (success) { System.out.println("选课成功!"); student.getCourses().add(course); } else { System.out.println("选课失败,该课程已经选满!"); } } public static void doCancelSelect(Student student) { Scanner scanner = new Scanner(System.in); System.out.println("已选课程列表:"); for (Course course : student.getCourses()) { System.out.println(course); } System.out.print("请输入要取消选择的课程编号:"); String courseId = scanner.nextLine(); Course course = CourseDB.getInstance().findCourseById(courseId); if (course == null) { System.out.println("取消选课失败,该课程不存在!"); return; } boolean success = course.cancelSelect(); if (success) { System.out.println("取消选课成功!"); student.getCourses().remove(course); } else { System.out.println("取消选课失败,该课程未被选择!"); } } } ``` MainProcess.java ``` import java.util.Scanner; public class MainProcess { public static void main(String[] args) { Student student = Login.doLogin(); if (student == null) { return; } Scanner scanner = new Scanner(System.in); while (true) { System.out.println("请选择要进行的操作:"); System.out.println("1. 选课"); System.out.println("2. 取消选课"); System.out.println("3. 查看已选课程"); System.out.println("4. 退出"); System.out.print("请输入操作编号:"); int choice = scanner.nextInt(); scanner.nextLine(); switch (choice) { case 1: SelectCourse.doSelect(student); break; case 2: SelectCourse.doCancelSelect(student); break; case 3: System.out.println("已选课程列表:"); for (Course course : student.getCourses()) { System.out.println(course); } break; case 4: System.out.println("退出成功,欢迎下次再来!"); return; default: System.out.println("无效的操作编号,请重新输入!"); } } } } ``` 以上代码仅供参考,实际运行效果可能会有所不同,您可以根据自己的实际需求和情况进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值