1 / 100
目录
1、
说出一些数据库优化方面的经验?(重点).......................................................8
2、
你有优化 SQL 查询数据经验吗?如有能说一下你一般用那些什么方式进
行优化?
............................................................. 8
3、
什么是事务,事务的四个特性是什么?有哪些隔离级别?............. 9
4、 数据库中,数据类型 char 与 varchar2 有什么区别?性能方面各有什么优势?
9
5、
你怎么知道查询 SQL 的性能高还是低?........................... 9
6、
在开发过程中遇到过数据库锁吗?怎样解锁? ..................... 9
7、
怎样处理并发数据? (重点)............................................................................10
8、
delete from table 与 truncate table 的区别?drop table 呢 .... 10
9、
union 和 union all 有什么不同?.....................................................................10
10、
JDBC 访问数据库的步骤?(重点)..................................................................10
11、
大数据量下的分页解决方法.................................... 11
12、
简述建立索引的作用和索引的分类 ? .........................................................11
13、
什么是存储过程,有什么优缺点(重点)..........................................................11
14、
存储过程与 SQL 的区别?...................................... 12
15、
如何创建视图?.............................................. 12
16、
Oracle 数据库如何提高访问性能? .............................. 12
17、
JAVA 中常用的运算符有哪些?这些运算符之间的优先级怎么样?.... 16
18、
在 JAVA 自定义一个生产 10-100 之间的随机数的公式? ............ 16
19、
switch 语句中的表达式可以是什么类型数据? ................... 16
20、
while 循环结构与 do...while 循环结构的不同? ................... 17
21、
程序中 break、continue、return 跳转语句的不同?(重点) ......................17
22、
使用数组四步走是什么?...................................... 17
23、
数组的定义有哪些方式?...................................... 17
24、
编写一个程序实现费波拉契数列(就是后面的数字是前面两个数字的和)
,
要求从 1 到 20 即可.请使用数组方式来实现.............................. 17
25、
请打印杨辉三角.杨辉三角最本质的特征是,它的两条斜边都是由数字 1
组成的,而其余的数则是等于它肩上的两个数之和(使用数组实现) ......... 18
26、
成员变量和局部变量的区别是什么? ............................ 18
27、
JAVA 中包的作用是什么? ..................................... 18
28、
包命名规范有哪些?.......................................... 18
29、
String 是最基本的数据类型吗? ..................................................................18
30、
说明一下类变量和实例变量的区别. (重点)................................................19
31、
说明实例方法和类方法的区别? (重点).....................................................19
32、
数组有没有 length( )方法? String 有没有 length( )方法? .......... 19
33、
String s=new String("a");共创建了几个 String 对象? ........... 19
34、
Java 里的传引用和传值的区别是什么? ......................... 19
35、
如果去掉了 main 方法的 static 修饰符会怎样?.................... 19
36、
如何将 String 类型转化成 Number 类型? ....................... 19
37、
什么是 Java 虚拟机? .....................................................................................202 / 100
38、
Java 的访问修饰符是什么? ..........................................................................20
39、
&操作符和&&操作符有什么区别? (重点).....................................................20
40、
声明变量和定义变量有什么不同? .............................. 20
41、
你怎么理解变量?............................................ 20
42、
怎么判断数组是 null 还是为空? ...................................................................20
43、
Java 中的“短路”是指什么 .................................... 20
44、
switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
(重点)
21
45、
short s = 1; s = s + 1;有什么错? short s = 1; s += 1;有什么错? (重点)..........21
46、
char 型变量中能不能存贮一个中文汉字?为什么? (重点) ..........................21
47、
冒泡排序实现(重点).......................................................................................22
48、
"=="和 equals 方法究竟有什么区别?(重点)...............................................22
49、
静态变量和实例变量的区别?.................................. 23
50、
谈谈你对 static 关键词的理解(重点) ............................................................23
51、
是否可以从一个 static 方法内部发出对非 static 方法的调用? ....... 24
52、
Integer 与 int 的区别(重点)............................................................................24
53、
Math.round(11.5)等於多少? Math.round(-11.5)等于多少? .........................25
54、
请说出作用域 public,private,protected,以及不写时的区别(重点)...........25
55、
Java 是否有过程和函数? ...............................................................................25
56、
String 和 StringBuffer 的区别(重点)..............................................................25
57、
StringBuffer 与 StringBuilder 的区别(重点) ...................................................26
58、
数组有没有 length( )这个方法? String 有没有 length( )这个方法?..... 27
59、 使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
27
60、
类与对象的关系是什么........................................ 27
61、
谈谈你对 static 关键词的理解................................... 27
62、
什么是封装.................................................. 28
63、
this 关键字 .................................................. 28
64、
什么是继承.................................................. 28
65、
Overload 和 Override 的区别.Overload 的方法是否可以改变返回值的类型?
(重点)
28
66、
super 关键字(重点) ........................................................................................29
67、
抽象类和抽象方法............................................ 29
68、
final, finally, finalize 的区别. (重点)................................................................30
69、
java 中实现多态的机制是什么? (重点) .....................................................30
70、
什么是接口.................................................. 30
71、
abstract class 和 interface 有什么区别? (重点)..........................................30
72、
接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否
可继承实体类(concrete class)? 抽象类中是否可以有静态的 main 方法?(重点) 32
73、
什么是异常.................................................. 32
74、
运行时异常(RuntimeException)与一般异常有何异同? (重点) ...........32
75、
java 语言如何进行异常处理,关键字:throws、throw、try、catch、finally
分别代表什么意义?在 try 块中可以抛出异常吗? (重点) .........................................333 / 100
76、
程序中 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally{}里的代
码会不会被 执行?在什么时候被执行?(重点).........................................................33
77、
error 和 exception 有什么区别? ....................................................................33
78、
Java 中的异常处理机制的简单原理和应用. (这个题目需要多看看)..........33
79、
throws 和 throw 的区别(重点).......................................................................34
80、
异常分为几类................................................ 34
81、
Collection 和 Collections 的区别(重点)..........................................................34
82、
数组和集合的主要的区别(重点)...................................................................34
83、
列出你知道的容器类(就是指集合类),简单说明其功能 .............. 35
84、
List, Set, Map 是否继承自 Collection 接口? (重点).......................................35
85、
ArrayList、LinkedList 集合的区别(重点) .......................................................35
86、
Set、List、Map 它们的区别(重点)................................................................35
87、
Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==
还是 equals( )? 它们有何区别? (重点).........................................................................35
88、
List、Map、Set 三个接口,存取元素时,各有什么特点? ............. 35
89、
HashMap 和 Hashtable 的区别(重点)............................................................36
90、
说出 ArrayList,Vector, LinkedList 的存储性能和特性 (重点) ........................37
91、
ArrayList 和 Vector 的区别...................................... 37
92、
集合框架中 Collections 和 Arrays 类的作用 ........................ 37
93、
数据结构中,数组与链表有哪些区别?为什么?(重点) ..............................38
94、
描述一下 JVM(JAVA 虚拟机)加载 class 文件的原理机制? .....................38
95、
ClassLoader(类加载器)如何加载 class.....................................................38
96、
Class.forName 的作用?为什么要用?.............................................................38
97、
为什么要用 ORM? 和 JDBC 有何不一样? ...............................................38
98、
JDBC 中的 PreparedStatement 相比 Statement 的好处(最后一句话是重点)
(重点)
38
99、
分层开发的优势.............................................. 39
100、 分层开发的原则.............................................. 39
101、 Java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,
请说出他们分别是哪些类?............................................ 39
102、 字节流与字符流的区别?(重点)...................................................................39
103、 什么是 java 序列化,如何实现 java 序列化?或者请解释 Serializable 接口的
作用. (重点) ....................................................................................................................41
104、 序列化的概念和序列化 ID 的作用?(这题需要看看)..................................41
105、 JavaScript 变量有哪些数据类型? ............................... 42
106、 js 中的 3 种弹出式消息提醒(警告窗口,确认窗口,信息输入窗口)的命令是
什么? 42
107、 什么是 BOM? ............................................... 42
108、 什么是 DOM? .................................................................................................43
109、 Javascript 中定时执行如何实现,JavaScript 如何实现一段代码在执行时间后
运行?如何指定一段代码每隔指定时间就运行? .......................... 43
110、 DOM 模型中的常用对象及其方法? ............................. 43
111、 如何设置页面元素的显示和隐藏? .............................. 44
112、 使用什么事件可以实现当鼠标移动某文本上时,文本样式改变,当鼠标离开4 / 100
时文本样式恢复为原来的样式?........................................ 44
113、 DOM 如何操作文档的标准节点? ............................... 44
114、 什么是 jQuery.................................................................................................45
115、 你为什么要使用 jQuery?...................................... 45
116、 你在公司是怎么用 jQuery 的?(重点)..........................................................45
117、 jQuery 能做什么? ........................................... 46
118、 $(document).ready( )方法和 window.onload 有什么区别?(重点)..............46
119、 Jquery 对象和 dom 对象的区别 ................................. 46
120、 jQuery 对象和 dom 对象是怎样转换的? ......................... 47
121、 什么是 jQuery 选择器 ......................................... 47
122、 jQuery 选择器的种类.......................................... 47
123、 Query 中的选择器 和 css 中的选择器有区别吗? ................. 48
124、 jQuery 中的 hover( )和 toggle( )有什么区别?...................... 48
125、 你是如何使用 jQuery 中的 ajax 的? ............................. 48
126、 jQuery 中$.get( )提交和$.post( )提交有区别吗? ................... 49
127、 jQuery 中的 load 方法一般怎么用的? ........................... 49
128、 在 jQuery 执行 ajax 中,提交的 data(数据)主要有几种方式? ...... 49
129、 你知道 jQuery 中的事件冒泡吗,它是怎么执行的,何如来停止冒泡事件?
49
130、 你使用过 jQuery 中的动画吗,是怎样用的?(重点)....................................49
131、 怎样给jQuery 动态附加新的元素?那么怎样给新生成的元素绑定事件呢?
50
132、 什么是 URL.........................................................................................................50
133、 Web 应用的目录结构 ......................................... 50
134、 Tomcat 的目录结构 .......................................... 50
135、 Tomcat 工作原理?(重点)............................................................................51
136、 JSP 的执行过程? (重点)................................................................................52
137、 JSP 指令有几种? ............................................ 52
138、 page 指令常用属性? ........................................ 52
139、 JSP 有哪些内置对象?作用分别是什么? 分别有什么方法? (重点) .........53
140、 Request 对象的主要方法(重点) ....................................................................53
141、 Response 对象的主要方法(重点) ...............................................................54
142、 Servlet API 中 forward( ) 与 sendRedirect ( )的区别?(就是请求转发和重
定向的区别) ?(重点) ................................................................................................545 / 100
143、 在 JSP 中如何实现页面跳转? .................................. 55
144、 什么是 Session 机制(重点) ..........................................................................55
145、 session 对象的常用方法 ...................................... 56
146、 四种会话跟踪技术(重点)...............................................................................57
147、 Web 应用中的四大作用域(注意不要和四种会话跟踪技术搞混淆了)(重
点)
57
148、 什么是 Cookie?............................................. 58
149、 在 JSP 中如何设置 Cookie?(重点) ...............................................................58
150、 Cookie 的应用场景?......................................... 58
151、 cookie 与 session 有什么区别?(重点) .........................................................59
152、 说出数据连接池的工作机制是什么? (重点) ................................................59
153、 什么是 MVC 设计模式(重点)........................................................................60
154、 MVC 设计模式的优缺点:(重点).................................................................61
155、 什么是 Servlet.................................................................................................61
156、 说一说 Servlet 的生命周期? (重点)...............................................................61
157、 服务器如何响应 Web 客户请求? .............................. 62
158、 什么情况下调用 doGet( )和 doPost( )? ........................ 62
159、 JSP 和 Servlet 有哪些相同点和不同点,他们之间的联系是什么? (重点) 62
160、 如何实现 servlet 的单线程模式 ................................. 63
161、 在 servlets 和 JSP 之间能共享 session 对象吗? .................... 63
162、 EL 隐式对象有哪些? ......................................... 63
163、 jsp 乱码如何解决,给出三种以上的对应解决方案,并给出对应的程序案例;
64
164、 请简述 Cookie, Session 和 Application 它们的区别. (重点)....................65
165、 Hibernate 使用步骤(重点) .............................................................................65
166、
Hibernate 中实体对象的三种状态. (重点).................................................66
167、 介绍一下 Hibernate 的二级缓存(重点).........................................................66
168、
Hibernate 的数据加载方式 .................................... 676 / 100
169、
Hibernate 如何延迟加载?(重点)................................................................67
170、
Hibernate 中怎样实现类之间的关系?(如:一对多、多对多关系). 67
171、
如何优化 Hibernate?(重点)........................................................................68
172、
说下 Hibernate 缓存机制(重点)...................................................................68
173、
hibernate 的工作原理 ......................................... 68
174、
cascade 属性和 inverse 属性的作用和区别?...................... 69
175、 hibernate 中 get( )与 load( )区别(重点)................................................69
176、
Hibernate 支持两种查询方式: ................................ 69
177、
为什么使用 HQL 查询?........................................ 70
178、
使用 HQL 步骤以及 HQL 优化(重点)...............................................................70
179、
Spring 是什么? ............................................. 70
180、
使用 Spring 的好处?(重点).........................................................................71
181、 什么是依赖,什么是依赖注入? (重点).......................................................71
182、
Spring 如何实现 IOC 容器功能(重点)..........................................................71
183、
什么是 AOP(Aspect-oriented programming 面向切面编程) (重点) ........71
184、
Spring AOP 原理(重点) .................................................................................72
185、 AOP 核心概念 ................................................ 72
186、 Spring 自动装配的优缺点(重点)..................................................................73
187、
Spring 依赖检查机制 ......................................... 73
188、
实际开发过程中为什么拆分 Spring 配置文件?.................... 73
189、
采用何种策略拆分 Spring 配置文件?............................ 73
190、
Spring 对持久层的支持:(重点)..................................................................74
191、
Spring 的事务机制(重点)..............................................................................74
192、 什么是声明式事务............................................ 74
193、
Spring 如何使用声明式事务管理 Hibernate 的事务 ................ 74
194、
SpringMVC 工作机制?(重点)........................................................................74
195、
什么是 POJO 类(重点).....................................................................................75
196、 你熟悉的应用服务器有哪些?.................................. 75
197、 什么是 Web 服务(web service) .............................. 75
198、 Web 服务的优点有哪些?(重点) ..................................................................76
199、 Java 领域中的主流框架有哪些?................................ 76
200、
如何实现自定义 MVC 框架? ................................... 77
201、
Struts 2 中如何解决中文乱码问题?(重点) .................................................77
202、 Struts 2 配置文件中的 package 元素与 Java 中的包有什么异同之处? 77
203、
Struts 2 开发 Action 有几种模式,Action 的作用是什么?(重点)...........78
204、
在 struts.xml 中可以不为action 指定 class属性吗?struts2 配置中有哪些
默认的属性?........................................................ 78
205、
简要阐述 struts2 的执行流程. (重点)......................................................78
206、
Struts 2 结构体系的运行原理(重点) ......................... 79
207、 Struts 2 核心接口和类 ......................................... 80
208、
说说对 Struts 2 拦截器的理解?(重点).....................................................81
209、
拦截器工作原理.............................................. 81
210、 Struts2 内置的拦截器 ......................................... 817 / 100
211、 Struts2 自定义拦截器?(重点)....................................................................82
212、
struts2 如何防止用户表单重复提交? (重点)........................................82
213、
Struts 2 中如何创建自定义类型转换器 ......................... 83
214、
Struts2 国际化资源文件的范围 ................................ 83
215、
OGNL 和 EL 有什么异同?(重点)...................................................................83
216、
OGNL 中访问根元素和非根元素有什么区别?..................... 83
217、 OGNL 在 Struts 2 中的作用(重点)..................................................................84
218、
值栈 ValueStack 的原理与生命周期?........................... 84
219、 权限管理怎么做的,用到了几张表? (重点) ...................................................84
220、
电商项目里 redis 用到了哪些地方? (重点) ..................................................85
221、 freemarker 静态页面怎么做的,与 jsp 动态页面的区别? (重点)..................85
222、 讲讲购物车的设计方案. (重点).....................................................................86
223、 FastDFS 如何搭建的?怎么用的? (重点).........................................................86
224、 ArrayList,HashMap,HashSet 初始化容量为多少?如果超出自己扩容多少?86
225、 说说 redis 的五种数据类型(重点).................................................................86
226、 Solr 在项目里用到了哪些地方? (重点).........................................................86
227、
电商项目高并发这块,你们怎么做的? (重点) ...............................................87
228、 使用过 log4j 吗?log4j 中有哪些优先级?.......................................................87
229、 实现多线程的方法? (重点)............................................................................87
230、 手写 MySQL,Oracle 分页(重点)......................................................................88
231、 手写一个单例(重点).......................................................................................88
232、 Spring 与 SpringMVC 的区别(重点) ...............................................................89
233、 将 Map 转换为 List.........................................................................................89
234、 拦截器和过滤器的区别(重点).......................................................................90
235、 请讲下堆与栈. (重点).....................................................................................90
236、 如何判断 List 集合是否为空? (重点).............................................................90
237、 list.isEmpty( )和 list.size( )==0 有什么区别? (重点).......................................90
238、 list !=null 与 ! list.isEmpty( )有什么区别? (重点)..........................................90
239、 怎么给 tomcat 增加内存? (重点)...................................................................91
240、 JDBC,Mybatis,Hibernate 的区别是什么? (重点)............................................91
241、 什么时候用 Hibernate,Mybatis(重点) ...........................................................91
242、 Struts2 与 SpringMVC 的区别? (重点) ...........................................................91
243、 集合的三种遍历方式.......................................... 92
244、 SpringMVC 的运行原理(重点)........................................................................94
245、 你觉得 Redis 有哪些优点?有哪些缺点? (重点)............................................95
246、 Mybatis 如何处理结果集....................................... 95
247、
内存溢出这块怎么解决? (重点)....................................................................95
248、 Mybatis 的缓存(重点) ....................................................................................95
249、 线程池有哪些优点? (重点)............................................................................96
250、
电商项目里文件上传怎么做的? (重点) ........................................................96
251、
电商项目里 zookeeper 是什么? (重点) .........................................................96
252、 Ajax 的应用场景有哪些? (重点)....................................................................96
253、 Ajax 的工作原理(重点)...................................................................................96
254、 简要阐述 Ajax 的实现步骤(重点)..................................................................978 / 100
255、 Redis 与 mysql 的区别? (重点).......................................................................97
256、 为什么使用 redis 来生成商品 ID?(重点).......................................................97
257、 Mybatis 中#与$的区别? (重点)......................................................................97
258、 怎么防止表单重复提交(重点).......................................................................98
259、 @Controller 和@Service 的区别,控制器上能写@Service 吗? .....................98
260、 Java 中交互方式同步与一步是什么?区别是什么? (重点)...........................98
261、 Freemarker 生成商品静态页之后,如果商品的数据需要修改怎么办? (重点)
98
262、 JDK1.7 与 JDK1.8 的区别? ..............................................................................98
263、 聚合函数有哪些? (重点)................................................................................99
264、 JUnit4 中@AfterClass@BeforClass@after@before 的区别对比(重点).........99
265、 悲观锁乐观锁的区别? (重点)........................................................................99
266、 项目为什么使用垂直应用架构? .................................................................100
1
说出一些数据库优化方面的经验?(重点)
1) 从 JDBC 编程的角度讲,用 PreparedStatement 一般来说比 Statement 性能高,因为在使用
时,SQL 语句被预编译并存储在 PreparedStatement 对象中.然后可以使用
PreparedStatement 对象多次高效地执行该语句.
2) 有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时
就可以去掉外键.(比喻:就好比免检产品,就是为了提高效率,充分相信产品的制造商)
3) 表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等,将姓名和密码单独从用户
表中独立出来等,这些都是分析了业务的特点后,对数据库中表做了优化后的解决方案.也
就是说在有些情况下,我们设计数据库可以适度的违反三个范式的设计原则,来获得更好
的程序性能.
4) sql 语句全部大写,特别是列名和表名都大写.因为数据库中的语句执行机制是这样的:sql
语句→发给 oracle 服务器→语法检查和编译成为内部指令→缓存和执行指令.而数据库在
对语句进行检查和编译时,会自动将 sql 语句转换成大写,并且根据 SQL 缓存的特点,不要
拼凑条件,而是用?(占位符参数)和 PreparedStatment 来执行参数化的 sql 语句.
5) 还有索引对查询性能的改进.当经常查询索引列中的数据时,需要在表上创建索引.索引占
用磁盘空间,并且降低添加、删除和更新行的速度.在多数情况下,索引用于数据检索的速
度优势大大超过它的不足之处.但是,如果应用程序非常频繁地更新数据或磁盘空间有限,
则可能需要限制索引的数量
2
你有优化 SQL 查询数据经验吗?如有能说一下你一般用那些什么方式进行优化?
1) 用索引提高效率
2) 选择最有效率的表名顺序(ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中
的表名,FROM 子句中写在最后的表(基础表 driving table)将被最先处理)
3) WHERE 子句中的连接顺序:ORACLE 采用自下而上的顺序解析 WHERE 子句,根据这个
原理,表之间的连接必须写在其他 WHERE 条件之前, 那些可以过滤掉最大数量记录的条
件必须写在 WHERE 子句的末尾9 / 100
4) SELECT 子句中避免使用 ‘ * ‘:需要写全查询的字段列名.
3
什么是事务,事务的四个特性是什么?有哪些隔离级别?
1) 事务(Transaction):是数据库操作的最小工作单元,是作为单个逻辑工作单元执行
的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;
事务是一组不可再分割的操作集合(工作逻辑单元);
2) 事务具有 4 个属性,通常称为 ACID 特性:
2 .1 原子性(atomicity):事务是一个完整的操作.事务的各步操作是不可分的;要么
都执行、要么都不执行.
2.2 一致性(consistency):当事务完成时,数据必须处于一致状态.
2.3 隔离性(isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务
必须是独立的,它不应以任何方式依赖于或影响其他事务.
2.4 持久性(durability):事务完成后,它对数据库的修改被永久保存,事务日志能保
持事务的永久性.
3) 隔离级别分为:Read Uncommitted(读未提交)、Read Committed(读提交)、Repeatable
Read(可以重复读)、Serializable(序列化)这 4 种级别
4
数据库中,数据类型 char varchar2 有什么区别?性能方面各有什么优势?
char 表示的是固定长度,所占存储空间为你定义时的大小,数据量较大的时候以char 字段
为查询条件时查询得快一些.
Varchar2 表示的是实际长度的数据类型,所占存储空间为实际大小,前提是不超过你定义
时的长度,如果存储的字段不是定长的,用varchar2 好一些.
5
你怎么知道查询 SQL 的性能高还是低?
1) 简单的通过查看执行 SQL 的运行时间.
2) 可以通过查看数据库提供的语句执行计划来分析相应的数据信息,例如查看执行计划
中对应的COST(即成本耗费)值,反应了运行这段 SQL 的总体估计成本,通常COST 低的执行
计划要好一些
6
在开发过程中遇到过数据库锁吗?怎样解锁?
1) 如果 oracle 中有事务未提交,又打开一个窗口去提交一个新的事务则可能会产生数据
库锁.
2) 解锁的方式:
a) 结束当前的 session(会话,此处指和数据库的通讯)自动解锁
例如,退出当前数据库连接所用的工具或应用程序.
b) 利用 dba 权限强行关闭掉了执行 Lock 操作的 Session.
示例:通过以上查询知道了 sid 和 SERIAL#(流水号)就可以开杀(就是去关掉会话,俗称杀
掉会话)了
--查询出对应会话操作的 sid 和 serial10 / 100
SELECT
sid,
serial#,
username,
osuser
FROM
v$session;
--根据指定的 sid 和 serial 来关闭对应的会话(杀会话的意思)
ALTER
SYSTEM
KILL
SESSION
'sid,serial';
7
怎样处理并发数据? (重点)
就数据库操作来说是通过加锁的概念来确保并发数据操作下事务的完整性和数据库的
一致性
数据库主要有共享锁和排它锁.当你在修改数据的时候,别人也可以查看,但是他不能修
改数据并提交,只能优先你的操作,等你向数据库提交了数据之后他才能执行增删改的操作,
这就是排它锁.共享锁就是你和另外一个用户可以同时共享数据(查看),但是你和他都不能
修改.
8
delete from table truncate table 的区别?drop table
1) Truncate 是数据定义语言(DDL)做的修改是不能回滚的,就是不可恢复的操作.用了
这个命令后就收回了表空间.Delete 是数据操作语言(DML)删除是要把数据写入系
统回滚段(rollback segement)中以便恢复时使用.
2) 两者都是删除表中的数据而不会影响到表的结构和定义.
3) 使用 drop 的话就会删除表的结构
9
union union all 有什么不同?
UNION 在进行表连接后会筛选掉重复的记录,所以在表连接后会对所产生的结果集进行排
序运算,删除重复的记录再返回结果.
而 UNION ALL 只是简单的将两个结果合并后就返回.这样,如果返回的两个结果集中有重复
的数据,那么返回的结果集就会包含重复的数据了.
从效率上说,UNION ALL 要比 UNION 快很多,所以,如果可以确认合并的两个结果集中不包
含重复的数据的话,那么就使用 UNION ALL,
10 JDBC 访问数据库的步骤?(重点)
1) 加载 JDBC 驱动
2) 与数据库建立连接
3) 发送 SQL 语句,并得到返回结果
4) 处理返回结果
5) 关闭资源11 / 100
11、 大数据量下的分页解决方法.
答:最好的办法是利用 sql 语句进行分页,这样每次查询出的结果集中就只包含某页的数据
内容.在 sql 语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某
页的数据.
不同的数据库下的分页方案各不一样,下面是主流的三种数据库的分页 sql:
sql server:
String sql =
"select top " + pageSize + " * from students where id not in" +
"(select top " + pageSize * (pageNumber-1) + " id from students order by id)" +
"order by id";
mysql:
String sql =
"select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize;
oracle:
String sql = "select * from " +
(select *,rownum rid from (select * from students order by postime desc) where rid<=" +
pagesize*pagenumber + ") as t" + "where t>" + pageSize*(pageNumber-1);
12、 简述建立索引的作用和索引的分类 ?
索引的作用:通过使用索引,大大提高数据库的检索速度,改善数据库性能.
索引分类:
1) 唯一索引:唯一索引不允许两行具有相同的索引值
2) 主键索引:在数据库关系图中为表定义一个主键自动创建主键索引,主键索引是唯一
索引的特殊类型
3) 聚集索引:在聚集索引中表中各行的事物顺序与键值的逻辑(索引)顺序相同且唯一
4) 非聚集索引:非聚集索引建立在索引页上,在查询数据时可以从索引中找到记录存放
的位置
5) 复合索引:在创建索引时,并不是只能对其中一列创建索引,与创建主键一样,可以将多
个列组合作为索引,这种索引称为复合索引
6) 全文索引:全文索引是一种特殊类型的基于标记的功能性索引,由 SQL Server 中全
文引擎服务创建 和维护
13、 什么是存储过程,有什么优缺点(重点)
存储过程(Stored Procedure是一组为了完成特定功能的 SQL 语句集,是由流程控制
和SQL 语句书写的命名语句块,经编译和优化后存储在数据库服务器中,应用程序使用时
只要调用即可,可以通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来
调用.12 / 100
使用存储过程有以下的优点
a) 具有良好的安全性:可保证数据的安全性和完整性.通过存储过程可以使没有权限
直接访问相应数据库对象的用户受控制的间接地执行数据库相关操作,从而保证数
据的安全.
b) 执行速度快,效率高:在运行存储过程前,数据库已对其进行了语法和句法分析,并
给出了优化执行方案.这种已经编译好的过程可极大地改善 SQL 语句的性能.由于执
行 SQL 语句的大部分工作已经完成,所以存储过程能以极快的速度执行.
c) 减少网络流量:可以降低网络的通信量.
d) 模块化程序设计:存储过程可以封装业务逻辑,并存入数据服务器中,当业务逻辑发
生变化时,无需修改调用存储过程的应用程序,只需修改存储过程即可.
使用存储过程的缺点是:
a) 相对而言,调试比较麻烦
b) 移植问题,数据库端代码当然是与具体数据库相关的.
c) 代码可读性差
14、 存储过程与 SQL 的区别?
存储过程是一组预编译的 SQL 语句,经编译后存储在数据库中,可包含一个或多个 SQL
语句.能够完成一定功能的子程序,需要的时候用户通过指定存储过程的名字并给出参数(如
果该存储过程带有参数)来执行它.存储过程可以包含数据操作语言,逻辑和调用函数等;它
又可分为系统存储过程和用户自定义的存储过程.
SQL 指结构化查询语言,是一种 ANSI 的标准计算机语言.
15、 如何创建视图?
语法:create view 视图名 AS <select 语句>
16 Oracle 数据库如何提高访问性能?
a) 避免在索引列上使用 IS NULL IS NOT NULL 操作
避免在索引中使用任何可以为空的列,ORACLE 将无法使用该索引.对于单列索引,如果列
包含空值,索引中将不存在此记录.对于复合索引,如果每个列都为空,索引中同样不存在此
记录. 如果至少有一个列不为空,则记录存在于索引中.
举例:
如果唯一性索引建立在表的A 列和 B 列上,并且表中存在一条记录的A,B 值为(123,null) ,
ORACLE 将不接受下一条具有相同 A,B 值(123,null)的记录(插入). 然而如果所有的索引
列都为空,ORACLE 将认为整个键值为空而空不等于空. 因此你可以插入 1000 条具有相同
键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以 WHERE 子句中对索引列
进行空值比较将使 ORACLE 停用该索引.
b) UNION 替换 OR (适用于索引列)
通常情况下, 用 UNION 替换 WHERE 子句中的 OR 将会起到较好的效果. 对索引列使用
OR 将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有 column 没有被索13 / 100
引, 查询效率可能会因为你没有选择 OR 而降低.
c) 分离表和索引
总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于 ORACLE 内
部系统的对象存放到SYSTEM 表空间里. 同时,确保数据表空间和索引表空间置于不同的
硬盘上(通过指定表空间的方式可以实现这个要求).
d) 共享 SQL 语句
为了不重复解析相同的 SQL 语句,在第一次解析之后, ORACLE 将 SQL 语句存放在内存中.
这块位于系统全局区域 SGA(system global area)的共享池(shared buffer pool)中的内存可
以被所有的数据库用户共享. 因此,当你执行一个 SQL 语句(有时被称为一个游标)时,如果
它和之前的执行过的语句完全相同, ORACLE 就能很快获得已经被解析的语句以及最好的
执行路径. ORACLE 的这个功能大大地提高了 SQL 的执行性能并节省了内存的使用. 当你
向 ORACLE 提交一个 SQL 语句,ORACLE 会首先在这块内存中查找相同的语句.
这里需要注明的是,ORACLE 对两者采取的是一种严格匹配,要达成共享,SQL 语句必须完
全相同(包括空格,换行等).
e) WHERE 子句中的连接顺序.
ORACLE 采用自下而上的顺序解析 WHERE 子句,根据这个原理,表之间的连接必须写在其
他WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE 子句的末尾.
例如:
示例 1.(低效,执行时间 156.3 )
SELECT * FROM EMP E
WHERE SAL > 50000
AND JOB = ‘MANAGER' AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
示例 2(高效,执行时间 10.6 )
SELECT … FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = ‘MANAGER';
f) SELECT 子句中避免使用 ‘ * ‘
当你想在SELECT 子句中列出所有的COLUMN 时,使用动态SQL 列引用 ‘*' 是一个方便的
方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE 在解析的过程中, 会将'*' 依次
转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.
g) 使用 DECODE 函数来减少处理时间
使用 DECODE 函数可以避免重复扫描相同记录或重复连接相同的表.
例如:
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 002014 / 100
AND ENAME LIKE ‘SMITH%';
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0030
AND ENAME LIKE ‘SMITH%';
你可以用 DECODE 函数高效地得到相同结果
SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
FROM EMP WHERE ENAME LIKE ‘SMITH%';
类似的,DECODE 函数也可以运用于GROUP BY 和 ORDER BY 子句中.
h) TRUNCATE 替代 DELETE
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复 的
信息. 如果你没有COMMIT 事务,ORACLE 会将数据恢复到删除之前的状态(准确地说是恢
复到执行删除命令之前的状况) 而当运用 TRUNCATE 时, 回滚段不再存放任何可被恢复的
信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.
(注意: TRUNCATE 只在删除全表适用,TRUNCATE 是 DDL 不是 DML)
i)
尽量多使用 COMMIT
只要有可能,在程序中尽量多使用 COMMIT, 这样程序的性能得到提高,需求也会因为
COMMIT 所释放的资源而减少:
COMMIT 所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句获得的锁
c. redo log buffer 中的空间
d. ORACLE 为管理上述 3 种资源中的内部花费
(注意: 在使用 COMMIT 时必须要注意到事务的完整性,现实中效率和事务完整性往往是
鱼和熊掌不可得兼)
j)
Where 子句替换 HAVING 子句
避免使用HAVING 子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个
处理需要排序,总计等操作. 如果能通过WHERE 子句限制记录的数目,那就能减少这方面
的开销.
例如:
低效:
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
GROUP BY REGION
HAVING REGION REGION != ‘SYDNEY'15 / 100
AND REGION != ‘PERTH'
高效
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
WHERE REGION REGION != ‘SYDNEY'
AND REGION != ‘PERTH'
GROUP BY REGION
(注意: HAVING 中的条件一般用于对一些集合函数的比较,如 COUNT( ) 等等. 除此而外,
一般的条件应该写在 WHERE 子句中)
k) EXISTS 替代 IN
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种
情况下, 使用 EXISTS(或 NOT EXISTS)通常将提高查询的效率.
低效:
SELECT *
FROM EMP (基础表)
WHERE EMPNO > 0
AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC = ‘MELB')
高效:
SELECT *
FROM EMP (基础表)
WHERE EMPNO > 0
AND EXISTS (SELECT ‘X'
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
AND LOC = ‘MELB')
l)
NOT EXISTS 替代 NOT IN
在子查询中,NOT IN 子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN 都是
最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可
以把它改写成外连接(Outer Joins)或 NOT EXISTS.
例如:
SELECT …
FROM EMP
WHERE DEPT_NO NOT IN (SELECT DEPT_NO
FROM DEPT
WHERE DEPT_CAT='A');16 / 100
为了提高效率.改写为:
(方法一: 高效,左外连接)
SELECT ….
FROM EMP A,DEPT B
WHERE A.DEPT_NO = B.DEPT(+)
AND B.DEPT_NO IS NULL
AND B.DEPT_CAT(+) = ‘A'
(方法二: 最高效)
SELECT ….
FROM EMP E
WHERE NOT EXISTS (SELECT ‘X'
FROM DEPT D
WHERE D.DEPT_NO = E.DEPT_NO
AND DEPT_CAT = ‘A');
17、 JAVA 中常用的运算符有哪些?这些运算符之间的优先级怎么样?
1、算术运算符
2、比较运算符
3、赋值运算符
4、逻辑运算符
运算符之间的优先级:
算术运算符》比较运算符》逻辑运算符》赋值运算符
18、 在 JAVA 自定义一个生产 10-100 之间的随机数的公式?
int random=(int) (Math.random( )*(max-min)+min)
int random=(int) (Math.random( )*(100-10)+10)
19、 switch 语句中的表达式可以是什么类型数据?
答:表达式的值可以是 byte、short、int 和 char 类型的数据,但不能是 float 和 double 类
型的数据.17 / 100
20、 while 循环结构与 do...while 循环结构的不同?
while 结构在循环的开始判断下一个迭代是否应该继续.do/while 结构在循环的结尾来
判断是否将继续下一轮迭代.do 结构至少会执行一次循环体.
21、 程序中 break、continuereturn 跳转语句的不同?(重点)
1、break:跳出循环而执行循环后面的语句
2、continue:跳过循环体中剩余的语句而执行下一次循环
3、return 结束方法的调用.
22、 使用数组四步走是什么?
1、声明数组 2、分配空间 3、赋值 4、处理数据
23、 数组的定义有哪些方式?
int[] arr=new int[5];
int arr[]=new int[5];
int[] arr=new int[]{1,2,3,4,5};
int[] arr={1,2,3,4,5};
24、 编写一个程序实现费波拉契数列(就是后面的数字是前面两个数字的和),要求从
1 到 20 即可.请使用数组方式来实现
int[] num=new int[20];
num[0]=0;
num[1]=1;
for(int i=2;i<20;i++){
num[i]=num[i-1]+num[i-2];
}
for(int
j=1;j<=20;j++){ if
(j%5==0){
System.out.println( );
}
System.out.print(num[j-1]+" ");
}18 / 100
25、 请打印杨辉三角.杨辉三角最本质的特征是,它的两条斜边都是由数字1 组成的,而
其余的数则是等于它肩上的两个数之和(使用数组实现)
final int N=10;
int[] num=new int[N];
num[0]=1;
for(int
i=1;i!=N;i++){ for(in
t j=0;j!=i;j++){
System.out.print(num[j]+"\t");
}
System.out.println( );
num[i]=1;
for(int j=i-1;j!=0;j--){
num[j]=num[j]+num[j-1];
}
}
26、 成员变量和局部变量的区别是什么?
作用域不同
局部变量的作用域仅限于定义它的方法
成员变量的作用域在整个类内部都是可见的
初始值不同
Java 会给成员变量一个初始值
Java 不会给局部变量赋予初始值
27、 JAVA 中包的作用是什么?
1、允许类组成较小的单元(类似文件夹),易于找到和使用相应的文件
2、更好的保护类、属性和方法
3、防止命名冲突
28、 包命名规范有哪些?
1、包名由小写字母组成,不能以圆点开头或结尾
2、包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名
3、包名后续部分依不同机构内部的规范不同而不同
29、 String 是最基本的数据类型吗?
String 不是基本数据类型,基本数据类型包括 byte、int、char、long、float、19 / 100
double、boolean 和 short. Java.lang.String 类是 final 类型的,因此不可以继承这个类、不能
修改这个类.
30、 说明一下类变量和实例变量的区别. (重点)
类变量是所有对象共有的,所有的实例对象都共用一个类变量,内存中只有一处空间
存放类变量的值.如果其中一个对象改变了类变量的值,其他对象得到的就是改变后的结果.
当类被加载到内存时,类变量就会分配相应的内存空间.
31、 说明实例方法和类方法的区别? (重点)
方法前面有 static 关键字修饰的为类方法,否则为实例方法. 实例方法可以调用该类
中的其他方法;类方法只能调用其他类方法,不能调用实例方法;当类文件加载到内存时, 实
例方法不会被分配内存空间,只有在对象创建之后才会分配.而类方法在该类被加载到内 存时
就分配了相应的内存空间.
32、 数组有没有 length( )方法? String 有没有 length( )方法?
数组没有 length( )方法,只有 length 的属性.String 有 length( )方法.
33、 String s=new String("a");共创建了几个 String 对象?
两个.其中包括一个字符对象和一个字符对象引用对象.
34、 Java 里的传引用和传值的区别是什么?
传引用是指传递的是地址而不是值本身,传值则是传递值的一份拷贝.
35、 如果去掉了 main 方法的 static 修饰符会怎样?
程序能正常编译.运行时会抛 NoSuchMethodError 异常.
36、 如何将 String 类型转化成 Number 类型?
Integer 类的 valueOf 方法可以将String 转成 Number.下面是代码示例:
String numString = “1000″;
int id=Integer.valueOf(numString).intValue( );20 / 100
if(a>0||a<1){
//代码 1....
}
37、 什么是 Java 虚拟机?
Java 虚拟机是能移植到不同硬件平台上的软件系统.
38、 Java 的访问修饰符是什么?
访问权限修饰符是表明类成员的访问权限类型的关键字.使用这些关键字来限定程序的
方法或者变量的访问权限.它们包含:
public: 所有类都可以访问 protected: 同一个包内以及所有子类都可以访问 private:
只有归属的类才能访问默认: 归属类及相同包下的子类可以访问
39、 &操作符和&&操作符有什么区别? (重点)
当一个&表达式在求值的时候,两个操作数都会被求值,&&更像是一个操作符的快捷方
式.当一个&&表达式求值的时候,先计算第一个操作数,如果它返回 true 才会计算第二个操
作数.如果第一个操作数取值为 fale,第二个操作数就不会被求值.
40、 声明变量和定义变量有什么不同?
声明变量我们只提供变量的类型和名字,并没有进行初始化.定义包括声明和初始化两
个阶段 String s;只是变量声明,String s = new String(“bob”); 或者 String s = “bob”;是变
量定义.
41、 你怎么理解变量?
变量是一块命名的内存区域,以便程序进行访问.变量用来存储数据,随着程序的执行,
存储的数据也可能跟着改变.
42、 怎么判断数组是 null 还是为空?
输出 array.length 的值,如果是 0,说明数组为空.如果是 null 的话,会抛出空指针异常.
43、 Java 中的“短路”是指什么
在 java 逻辑运算中使用逻辑运算符||与&&时将采取“短路”运算.举一个例子
上面一段代码的执行过程是当 a 满足大于 0 的时候将不会再执行后面的 a<1 代码,21 / 100
这就是“短路”.
44 switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String ? (重点)
在 switch(expression)中,expression 只能是一个整数表达式或者枚举常量(更
大字体),整数表达式可以是 int 基本类型或 Integer 包装类型,由于,byte,short,char
都可以隐含转换为 int,所以,这些类型以及这些类型的包装类型也是可以的.显然,long
和 String 类型都不符合 switch 的语法规定,并且不能被隐式转换成 int 类型,所以,它们
不能作用于 swtich 语句中.
45 short s = 1; s = s + 1;有什么错? short s = 1; s += 1;有什么错? (重点)
对于 short s = 1; s = s + 1; 由于 s1+1 运算时会自动提升表达式的类型,所以结
果是 int 型,再赋值给 short 类型 s1 时,编译器将报告需要强制转换类型的错误.
对于 short s1 = 1; s1 += 1;由于 += 是 java 语言规定的运算符,java 编译器会
对它进行特殊处理,因此可以正确编译.
46 char 型变量中能不能存贮一个中文汉字?为什么? (重点)
char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了汉字,
所以,char 型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没有被包含在
unicode 编码字符集中,那么,这个 char 型变量中就不能存储这个特殊汉字.补充说明:
unicode 编码占用两个字节,所以,char 类型的变量也是占用两个字节.
备注:后面一部分回答虽然不是在正面回答题目,但是,为了展现自己的学识和表现
自己对问题理解的透彻深入,可以回答一些相关的知识,做到知无不言,言无不尽.
22 / 100
public static void main(String[] args) {
int[] number=new int[]{22,12,33,45,66};
int temp;
//冒泡排序
for(int i=0;i<number.length-
1;i++){ for(int j=0;j<number.length-
1-i;j++){
if(number[j]>number[j+1]){ t
emp=number[j+1];
number[j+1]=number[j];
number[j]=temp;
}
}
}
}
47、 冒泡排序实现(重点)
口诀:n 个数字来比较,外层循环 N-1,内层循环 N-1-i,两两相比小靠前.
代码示例:
48
"==" equals 方法究竟有什么区别?(重点)
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所
存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符.
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一
块内存(堆内存),变量也占用一块内存,例如 Objet obj = new Object( );引用变量 obj 是
一个内存,new Object( )是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对象
占用的那块内存的首地址.对于指向对象类型的变量,如果要比较两个变量是否指向同一个对
象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较.
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否
相同,它比较的两个对象是独立的.例如,对于下面的代码:23 / 100
String a=new String("foo");
String b=new String("foo");
两条 new 语句创建了两个对象,然后用 a,b 这两个变量分别指向了其中一个对象,这是两
个不同的对象,它们的首地址是不同的,即 a 和 b 中存储的数值是不相同的,所以,表达式 a==b
将返回 false,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回 true.
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input =
new String(“quit”); input.equals(“quit”),许多人稍不注意就使用==进行比较了, 这
是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误.记住,字 符
串的比较基本上都是使用 equals 方法.
如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法,Object
类的 equals 方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
49、 静态变量和实例变量的区别?
在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加.
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例
变量才会被分配空间,才能使用这个实例变量.静态变量不属于某个实例对象,而是属于类,所以
也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空
间,静态变量就可以被使用了.总之,实例变量必须创建对象后才可以通过这个对象来使用, 静
态变量则可以直接使用类名来引用.
50、 谈谈你对 static 关键词的理解(重点)
通常,在一个类中定义一个方法为 static,那就是说,无需本类的对象即可调用此方法,声24 / 100
明为 static 的方法有以下几条限制:
1) 它们仅能调用其他的 static 方法.
2) 它们只能访问 static 数据.
3) 它们不能以任何方式引用 this 或 super.
声明为 static 的变量实质上就是全局变量.当声明一个对象时,并不产生 static 变量的
拷贝,而是该类所有的实例变量共用同一个 static 变量.静态变量与静态方法类似.所有此类
实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操
控此块存储空间.
51、 是否可以从一个 static 方法内部发出对非 static 方法的调用?
不可以.
因为非 static 方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上
进行方法调用,而static 方法调用时不需要创建对象,可以直接调用.也就是说,当一个 static
方法被调用时,可能还没有创建任何实例对象,如果从一个 static 方法中发出对非 static 方
法的调用,那个非 static 方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个
static 方法内部发出对非 static 方法的调用.
52 Integer int 的区别(重点)
int 是 java 提供的 8 种原始数据类型之一.Java 为每个原始类型提供了封装类,Integer
是 java 为 int 提供的封装类.int 的默认值为 0,而 Integer 的默认值为 null,即 Integer 可以
区分出未赋值和值为 0 的区别,int 则无法表达出未赋值的情况.
另外,Integer 提供了多个与整数相关的操作方法,例如, 将一个字符串转换成整数
Integer.parseInt(“数字字符串”);
Integer 中还定义了表示整数的最大值和最小值的常量.25 / 100
53 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.floor(11.6)的结果为 11,Math.floor(-11.6)
的结果是-12;最难掌握的是 round 方法,它表示“四舍五入”,算法为 Math.floor(x+0.5),
即 将 原 来 的 数 字 加 上 0.5 后 再 向 下 取 整 , 所 以 ,Math.round(11.5) 的 结 果 为
12,Math.round(-11.5)的结果为-11.
54、 请说出作用域 public,private,protected,以及不写时的区别(重点)
这四个作用域的可见范围如下表所示.
说明:如果在修饰的元素上面没有写任何访问修饰符,则表示 default (friendly).
作用域
当前类
同一包内
子孙类
其他包
public
protected
×
default(不写) √
×
×
private
×
×
×
备注:只要记住了有 4 种访问权限,4 个访问范围,然后将全选和范围在水平和垂直方向
上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了.
1)
55、 Java 是否有过程和函数?
在 Java 中可以存在过程和函数.在Java 中,对于程序的各种功能的实现,都是通过方法实
现的;而方法在运行的时候,就被称为过程.Java 中的函数有 main( ),时间函数等.
56 String StringBuffer 的区别(重点)
JAVA 平台提供了两个类:String 和 StringBuffer,它们可以储存和操作字符串,即包含26 / 100
多个字符的字符数据.String 类表示内容不可改变的字符串.而 StringBuffer 类表示内容可
以被修改的字符串.当你知道字符数据要改变的时候你就可以使用 StringBuffer.典型地,你可
以使用 StringBuffers 来动态构造字符数据. 另外,String 实现了 equals 方法,new
String(“abc”).equals(new String(“abc”)的结果为 true,而 StringBuffer 没有实现
equals 方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果
为 false.
接着要举一个具体的例子来说明,我们要把 1 到 100 的所有数字拼起来,组成一个串.
StringBuffer sbf = new StringBuffer( );
for(int i=0;i<100;i++){
sbf.append(i);
}
上面的代码效率很高,因为只创建了一个 StringBuffer 对象,而下面的代码效率很低,因
为创建了 101 个对象.
String str = new String( );
for(int i=0;i<100;i++){
str = str + i;
}
在讲两者区别时,应把循环的次数搞成 10000,然后用 endTime-beginTime 来比较两者执
行的时间差异,最后还要讲讲 StringBuilder 与 StringBuffer 的区别.
String 重写了 equals 方法和 hashCode 方法,而 StringBuffer 没有重写 equals 方法和
hashCode 方法,所以,将 StringBuffer 对象存储进 Java 集合类中时会出现问题.
57 StringBuffer StringBuilder 的区别(重点)
StringBuffer 和 StringBuilder 类都表示内容可以被修改的字符串,StringBuilder
是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一27 / 100
个线程访问它,不存在不安全的因素了,则用 StringBuilder.如果要在类里面定义成员变量,
并且这个类的实例对象会在多线程环境下使用,那么最好用 StringBuffer.
58、 数组有没有 length( )这个方法? String 有没有 length( )这个方法?
数组没有 length( )这个方法,有 length 的属性.String 有 length( )这个方法.
59、 使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内
容还是可以改变的.例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");
有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对
象:
public void method(final StringBuffer param){
}
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
param.append("a");
60、 类与对象的关系是什么
类和对象的关系就是抽象和具体的关系,类是多个对象进行综合抽象的结果,是实体对象的概
念模型,而一个对象是一个类的实例.
61、 谈谈你对 static 关键词的理解
通常,在一个类中定义一个方法为 static,那就是说,无需本类的对象即可调用此方法,声
明为static 的方法有以下几条限制:
1) 它们仅能调用其他的 static 方法.
2) 它们只能访问 static 数据.
3) 它们不能以任何方式引用 this 或 super.
声明为static 的变量实质上就是全局变量.当声明一个对象时,并不产生 static 变量的拷28 / 100
贝,而是该类所有的实例变量共用同一个static 变量.静态变量与静态方法类似.所有此类实例
共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此
块存储空间.
62、 什么是封装
封装是面向对象的三大特性之一,就是将类型的状态信息隐藏在类内部,不允许外部程序直接
访问,而通过该类提供的方法来实现对隐藏信息的操作和访问.
封装的好处:隐藏类的实现细节;让使用者只能通过程序规定的方法来访问数据;可以加
入存取控制语句,限制不合理操作.
63 this 关键字
this 关键字是对一个对象的默认引用.this 关键字用来表示以后调用当前方法的对象的引用.
this 使用举例
➢ 使用 this 调用成员变量,解决成员变量和局部变量的同名冲突
➢ 使用 this 调用成员方法
➢ 使用 this 调用重载的构造方法,只能在构造方法中使用,必须是构造方法的第一条语句
64、 什么是继承
在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存
在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适
合特殊的需要,这就是继承.继承是子类自动共享父类数据和方法的机制,这是类之间的一种
关系,提高了软件的可重用性和可扩展性.Java 中只支持单继承.无法继承父类的构造方法.
65 Overload Override 的区别.Overload 的方法是否可以改变返回值的类型? (重点)
Overload 是重载的意思,Override 是覆盖的意思,也就是重写.
重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各
不相同(即参数个数或类型不同),与方法的作用域和返回类型无关.
重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通
过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的29 / 100
那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现.
子类重写父类的方法时,不能扩大方法的异常范围,即只能比父类抛出更少的异常,或者
是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问
题.
子类重写父类的方法时,不能缩小作用范围,子类方法的访问权限只能比父类的更大,不
能更小.如果父类的方法是private 类型,那么,此时根本不属于重写方法的概念,相当于子类中
增加了一个全新的方法.
扩展性回答:(请理解这些概念)
至于 Overloaded 的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个
题目很模糊.如果几个Overloaded 的方法的参数列表不一样,它们的返回者类型当然也可以不
一样.但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回
值不同来实现重载 Overload.这是不行的,我们可以用反证法来说明这个问题,因为我们有时
候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用
map.remove(key)方法时,虽然 remove 方法有返回值,但是我们通常都不会定义接收返回结果
的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java
就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断.
66 super 关键字(重点)
super 代表对当前对象的直接父类对象的默认引用.在子类中可以通过spuer 关键字来访问父
类成员.
注意:
➢ super 必须出现在子类(子类的方法和构造方法)中,而不是其他位置
➢ 可以访问父类的成员,如父类的属性、方法和构造方法
➢ 注意访问权限的控制,如无法通过super 访问 private 成员
67、 抽象类和抽象方法
用 abstract 关键字修饰的类和方法.
抽象类和抽象方法的特点:
➢ 抽象类和抽象方法都通过 abstract 关键字来修饰
➢ 抽象类不能实例化.抽象类可以没有、有一个或多个抽象方法,甚至全部方法都可以是抽
象方法.
➢ 抽象方法只有方法声明,没有方法实现.有抽象方法的类必须声明为抽象类.子类必须重
写所有抽象方法才能实例化,否则子类还是一个抽象类30 / 100
68 final, finally, finalize 的区别. (重点)
final 用于声明属性,方法和类,分别表示属性不可变,方法不可重写,类不可继承.
内部类要访问局部变量,局部变量必须定义成 final 类型,例如,一段代码……
finally 是异常处理语句结构的一部分,表示总是执行.
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以
重写此方法提供垃圾收集时的其它资源回收,例如关闭文件等.JVM 不保证此方法总被调用
69 java 中实现多态的机制是什么? (重点)
多态是同一个实现接口,使用是不同的实例而执行不同的操作.靠的是父类或接口定义的
引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就
是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是
引用变量的类型中定义的方法.
70、 什么是接口
接口是一种规范和标准,它们可以约束类的行为,是一些方法特征的集合,但是没有方法的实
现.接口可以看作是一种特殊的“抽象类”,但是采用完全不同的语法来表示,两者的设计理
念是不同的,抽象类利于代码复用,接口利于代码扩展和维护.
71 abstract class interface 有什么区别?
(重点)
含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象.含有
abstract 方法的类必须定义为 abstract class,abstract class 类中的方法不必是抽象
的.abstract class 类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象
构造方法或抽象静态方法.如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须
定义为 abstract 类型.
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的.
接口中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public
static final.
下面比较一下两者的语法区别
1) 抽象类可以有构造方法,接口中不能有构造方法.31 / 100
2) 抽象类中可以有普通成员变量,接口中没有普通成员变量
3) 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽
象的普通方法.
4) 抽象类中的抽象方法的访问类型可以是public,protected 和默认作用域(不建议使用,
因为默认作用域不能被其它包中的子类集成),但接口中的抽象方法只能是 public 类
型的,并且默认即为 public abstract 类型.
5) 抽象类中可以包含静态方法,接口中不能包含静态方法
6) 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任
意,但接口中定义的变量只能是public static final 类型,并且默认即为public static
final 类型.
7) 一个类可以实现多个接口,但只能继承一个抽象类.
下面接着再说说两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约.而抽象
类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个
典型应用,假设某个项目的所有 Servlet 类都要用相同的方式进行权限判断、记录访问日志
和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet 都继承这个抽象基类,在抽象
基类的 service 方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是
完成各自的业务逻辑代码,伪代码如下:
public abstract class BaseServlet extends HttpServlet{
public final void service(HttpServletRequest request, HttpServletResponse response)
throws
IOExcetion,ServletException{
//记录访问日志
//进行权限判断
if(具有权限){
try{
doService(request,response);
}
catch(Excetpion e){
//记录异常信息
}
}
}32 / 100
protected abstract void doService(HttpServletRequest request, HttpServletResponse
response) throws IOExcetion,ServletException;
//注意访问权限定义成 protected,显得既专业,又严谨,因为是专门给子类用的
}
}
public class MyServlet1 extends BaseServlet{
protected void doService(HttpServletRequest request, HttpServletResponse response)
throws
IOExcetion,ServletException{
//本 Servlet 处理具体业务逻辑代码
}
}
父类方法中间的某段代码不确定,留给子类去实现,就用模板方法设计模式.
备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法
细节,最后再说两者的应用区别.比较两者语法细节区别的条理是:先从一个类中的构造方法、
普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等 6 个方面逐一去比较回答,
接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底.
72、 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承
实体类(concrete class)? 抽象类中是否可以有静态的 main 方法?(重点)
接口可以继承接口.抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实
体类必须有明确的构造函数. 抽象类中可以有静态的 main 方法.
备注:只要明白了接口和抽象类的本质和作用,这些问题都很好回答,你想想,如果你是
java 语言的设计者,你是否会提供这样的支持,如果不提供的话,有什么理由吗?如果你没有道
理不提供,那答案就是肯定的了.
只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有 abstract 方法.
73、 什么是异常
异常就是在程序的运行过程中所发生的不正常的事件,比如所需文件找不到,网络连接不
通或中断,算术运算符出错,数组下标越界,类型转换异常等.
74、 运行时异常(RuntimeException)与一般异常有何异同? (重点)
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能
遇到的异常,是一种常见运行错误,只要是 RuntimeException 类的子类都属于运行时异常,而不
是 RuntimeException 类的子类的其它异常类都是一般异常或叫做受检异常.java 编译器要求
方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时
异常.33 / 100
75 java 语言如何进行异常处理?关键字:throwsthrowtrycatchfinally 分别代
表什么意义?在 try 块中可以抛出异常吗? (重点)
Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、throws 和 finally.
throws 声明方法有可能抛出的异常
throw 手动抛出异常
try catch 是内部捕获异常并做自定义处理
finally 是无论是否有异常都会被处理的语句,除非在 finally 前,存在 System.exit(整数值)时除
在 try 块中可以抛出异常,但是必须 catch 或者在方法中声明抛出的异常类型(运行时异常除
外).
76、 程序中 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally{}里的代码会不会
被 执行?在什么时候被执行?(重点)
try-catch-finally 的执行顺序是先执行 try 块中的代码,如果发生异常则进入 catch 块处理,但是
无论是否发生异常都会进入 finally 块,所以 finally 块中的代码会在try 块中的 return 语句执行
前执行
77 error exception 有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题.比如说内存溢出.不可能
指望程序能处理这样的情况. exception 表示一种设计或实现问题.也就是说,它表示如果程
序运行正常,从不会发生的情况,可以使用异常处理机制处理.
78 Java 中的异常处理机制的简单原理和应用. (这个题目需要多看看)
当 JAVA 程序违反了 JAVA 的语义规则时,JAVA 虚拟机就会将发生的错误表示为一个异常.
违反语义规则包括 2 种情况.一种是 JAVA 类库内置的语义检查.例如数组下标越界,会引发
IndexOutOfBoundsException;访问 null 的对象时会引发 NullPointerException.另一种情况就是
JAVA 允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用 throw
关键字引发异常.所有的异常都是 java.lang.Thowable 的子类.
异常是指 java 程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件
很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个
对象来表示,Java 使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装
到一个对象来表示的,该对象中包含有异常的信息.
Java 对异常进行了分类,不同类型的异常分别用不同的 Java 类表示,所有异常的根类为
java.lang.Throwable,Throwable 下面又派生了两个子类:Error 和 Exception,Error 表示应用程
序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等
系统问题.Exception 表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系
统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用
者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例
如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、
类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户
能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉.34 / 100
java 为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须 try..catch 处理
或用throws 声明继续抛给上层调用方法处理,所以普通异常也称为checked 异常,而系统异常
可以处理也可以不处理,所以,编译器不强制用 try..catch 处理或用 throws 声明,所以系统异常
也称为 unchecked 异常.
提示答题者:就按照三个级别去思考:虚拟机必须宕机(就是挂掉的意思,相当于崩溃)的
错误,程序可以死掉也可以不死掉的错误,程序不应该死掉的错误;
79 throws throw 的区别(重点)
声明异常——throws:Java 语言中通过关键字 throws 声明某个方法可能抛出的各种异
常.throws 可以同时声明多个异常,之间有逗号隔开.
抛出异常——throw:Java 语言中,可以通过使用throw 关键字来自行抛出异常.
同时它的区别还包括以下三方面:
(1) 作用不同:throw 用于程序员自行产生并抛出异常,throws 用于声明在该方法内抛出
的异常.
(1) 使用的位置不同:throw 位于方法体内部,可以作为单独语句使用.throws 必须跟在方
法参数列表后面,不能单独使用.
(2) 内容不同:throw 抛出一个异常对象,而且只能是一个.throws 后面跟异常类,而且可
以跟多个异常类.
80、 异常分为几类
(1) Throwable 类:所有异常类型都是 Throwable 类的子类,它派生来个子类:Error 和
Exception
(2) Error 类:表示仅靠程序本身无法恢复的严重错误.
(3) Exception 类:由Java 应用程序抛出和处理的非严重错误.
(4) 运行时异常:包括 RuntimeException 及其所有子类.不需要程序必须对他们做出处
理.
(5) Checked 异常(非运行时异常):除了运行时异常外的其他由 Exception 继承来的
异常类.
81 Collection Collections 的区别(重点)
Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List. Collections 是针对集合类
的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作.
82、 数组和集合的主要的区别(重点)
(1) 数组可以存储基本数据类型和对象,而集合中只能存储对象(可以以包装类形式存储基
本数据类型).
(2) 数组的长度是固定的,集合长度是可以动态改变的
(3) 定义数组时必须指定数组元素类型,集合默认其中所有元素都是 Object35 / 100
(4) 无法直接获取数组数组实际存储的元素个数,length 用来获取数组的长度,但可以通过
size( )直接获取集合实际存储的元素个数
(5) 集合有多种实现方式和不同的适用场合,而不像数组仅采用分配连续的空间方式
(6) 集合以接口和类的形式存在.具有封装,继承和多态等类的特性,通过简单的方法和属性
调用即可实现各种复杂的操作,大大提高软件的开发效率.
83、 列出你知道的容器类(就是指集合类),简单说明其功能
Java 容器类 Collection、List、ArrayList、Vector 及 Map、HashTable、HashMap.
Collection 是 List、Set 两个接口的父接口,
List 在 Collection 上增加了“有序”的特性,而 set 增加了“唯一”的特性;
Arraylist 是有序不唯一的;
Vector(向量类)可以实现类似动态数组的功能,但是又区别于C 语言中的概念,因为Java 中是不
存在“指针”这一概念,相对于 Arraylist 而言,Vector 线程是安全的,也就是说是支持线程同步
的,创建了一个 Vector 类的对象后,可以往其中随意地插入不同的类的对象,既不需顾及类型
也不需预先选定向量的容量,并可方便的进行查找;
Map 不能包括两个相同的键,它是无序的,但是Map 的值是可以重复的;
Hashtable 是 Dictionary 类的子类,缺省是线程同步的,不允许关键字或值为 null;HashMap 是
Map 接口的实现类,缺省情况下是非同步的.
84 List, Set, Map 是否继承自 Collection 接口? (重点)
List,Set 是,Map 不是 .
85 ArrayListLinkedList 集合的区别(重点)
ArrayList 集合:对数组进行了封装,实现了长度可变的数组,和数组采用相同存储方式,在内存
中分配连续的空间.它的优点在于遍历元素和随机访问元素的效率比较高.
LinkedList 集合:采用链式存储方式,优点在于插入,删除元素时效率比较高.
86 SetListMap 它们的区别(重点)
Set 接口继承 Collection 接口.存储一组唯一(不允许重复),无序的对象
List 接口继承 Collection 接口,存储一组不唯一(允许重复)
,有序(以元素插入的次序来放置元
素,不会重新排列)的对象.
Map 接口存储一组成对的键-值对象,提供 key(键)到 value(值)的映射.Map 中的 key 不要求有
序,不允许重复.value 同样不要求有序,但允许重复.
87 Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是
equals( )? 它们有何区别? (重点)
Set 里的元素是不能重复的,元素重复与否是使用equals( )方法进行判断的.
equals( )和==方法决定引用值是否指向同一对象 equals( )在类中被覆盖,为的是当两个分
离的对象的内容和类型相配的话,返回真值.
88 ListMapSet 三个接口,存取元素时,各有什么特点?
这样的题属于随意发挥题:这样的题比较考水平,两个方面的水平:一是要真正明白这些
内容,二是要有较强的总结和表述能力.如果你明白,但表述不清楚,在别人那里则等同于不明36 / 100
白.
首先,List 与 Set 具有相似性,它们都是单列元素的集合,所以,它们有一个功共同的父接口,
叫 Collection.Set 里面不允许有重复的元素,所谓重复,即不能有两个相等(注意,不是仅仅是相
同)的对象 ,即假设 Set 集合中有了一个A 对象,现在我要向 Set 集合再存入一个 B 对象,但 B
对象与 A 对象 equals 相等,则 B 对象存储不进去,所以,Set 集合的 add 方法有一个 boolean 的
返回值,当集合中没有某个元素,此时 add 方法可成功加入该元素时,则返回 true,当集合含有
与某个元素equals 相等的元素时,此时 add 方法无法加入该元素,返回结果为false.Set 取元素
时,没法说取第几个,只能以 Iterator 接口取得所有的元素,再逐一遍历各个元素.
List 表示有先后顺序的集合, 注意,不是那种按年龄、按大小、按价格之类的排序.当我
们多次调用 add(Obj e)方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到
的顺序排序.有时候,也可以插队,即调用 add(int index,Obj e)方法,就可以指定当前对象在集合
中的存放位置.一个对象可以被反复存储进 List 中,每调用一次 add 方法,这个对象就被插入进
集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指
向这个对象,当这个对象被 add 多次时,即相当于集合中有多个索引指向了这个对象,如图x 所
示.List 除了可以以 Iterator 接口取得所有的元素,再逐一遍历各个元素之外,还可以调用
get(index i)来明确说明取第几个.
Map与List 和Set不同,它是双列的集合,其中有put 方法,定义如下:put(obj key,obj value),
每次存储时,要存储一对key/value,不能存储重复的 key,这个重复的规则也是按equals 比较相
等.取则可以根据 key 获得相应的value,即 get(Object key)返回值为 key 所对应的 value.另外,
也可以获得所有的key 的结合,还可以获得所有的value 的结合,还可以获得 key 和 value 组合
成的 Map.Entry 对象的集合.
List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存
key-value 值,value 可多值.
HashSet 按照 hashcode 值的某种运算方式进行存储,而不是直接按 hashCode 值的大小进
行存储.例如,"abc" ---> 78,"def" ---> 62,"xyz" ---> 65 在 hashSet 中的存储顺序不是 62,65,78,这
些问题感谢以前一个叫崔健的学员提出,最后通过查看源代码给他解释清楚,看本次培训学员
当中有多少能看懂源码.LinkedHashSet 按插入的顺序存储,那被存储对象的 hashcode 方法还
有什么作用呢?学员想想!hashset 集合比较两个对象是否相等,首先看 hashcode 方法是否相
等,然后看 equals 方法是否相等.new 两个 Student 插入到 HashSet 中,看 HashSet 的 size,实现
hashcode 和 equals 方法后再看 size.
同一个对象可以在Vector 中加入多次.往集合里面加元素,相当于集合里用一根绳子连接到了
目标对象.往 HashSet 中却加不了多次的.
89 HashMap Hashtable 的区别(重点)
(条理上还需要整理,也是先说相同点,再说不同点)
HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了Map 接口,主要区
别在于 HashMap 允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,
效率要高于 Hashtable.
HashMap 允许将 null 作为一个entry 的 key 或者 value,而 Hashtable 不允许.
HashMap 把 Hashtable 的contains 方法去掉了,改成 containsvalue 和containsKey.因为 contains
方法容易让人引起误解.
Hashtable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的Map interface 的一个实现.
最大的不同是,Hashtable 的方法是Synchronize 的,而HashMap 不是,在多个线程访问Hashtable
时,不需要自己为它的方法实现同步,而 HashMap 就必须为之提供外同步.37 / 100
Hashtable 和 HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异.
就 HashMap 与 HashTable 主要从三方面来说.
一.历史原因:Hashtable 是基于陈旧的 Dictionary 类的,HashMap 是 Java 1.2 引进的 Map 接口的
一个实现
二.同步性:Hashtable 是线程安全的,也就是说是同步的,而 HashMap 是线程序不安全的,不是
同步的
三.值:只有 HashMap 可以让你将空值作为一个表的条目的 key 或value .
90、 说出 ArrayList,Vector, LinkedList 的存储性能和特性 (重点)
ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增
加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操
作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全),通常性
能上较ArrayList 差,而LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向
遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快.
LinkedList 也是线程不安全的,LinkedList 提供了一些方法,使得 LinkedList 可以被当作堆栈和队
列来使用.
91 ArrayList Vector 的区别
这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集合,即存储在
这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引
号取出某个元素,,并且其中的数据是允许重复的,这是 HashSet 之类的集合的最大不同
处,HashSet 之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题
目问的与 hashset 没有任何关系,但为了说清楚ArrayList 与 Vector 的功能,我们使用对比方式,
更有利于说明问题). 接着才说 ArrayList 与 Vector 的区别,这主要包括两个方面:
1) 同步性:
Vector 是线程安全的,也就是说是它的方法之间是线程同步的,而 ArrayList 是线程序不安全的,
它的方法之间是线程不同步的.如果只有一个线程会访问到集合,那最好是使用 ArrayList,因为
它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不
需要我们自己再去考虑和编写线程安全的代码.
备注:对于 Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住 Vector 与
Hashtable 是旧的,是 java 一诞生就提供了的,它们是线程安全的,ArrayList 与 HashMap 是 java2
时才提供的,它们是线程不安全的.
2) 数据增长:
ArrayList 与 Vector 都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,
就需要增加ArrayList 与Vector 的存储空间,每次要增加存储空间时,不是只增加一个存储单元,
而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得
一定的平衡.Vector 默认增长为原来两倍,而 ArrayList 的增长策略在文档中没有明确规定(从
源代码看到的是增长为原来的 1.5 倍).ArrayList 与 Vector 都可以设置初始的空间大小,Vector
还可以设置增长的空间大小,而 ArrayList 没有提供设置增长空间的方法.
总结:即Vector 增长原来的一倍,ArrayList 增加原来的 0.5 倍.
92、 集合框架中 Collections Arrays 类的作用
集合框架中有两个很实用的公用类:
Collections 和Arrays.Collections 提供了对一个Collection 容器进行诸如排序、复制、查找和填38 / 100
充等一些非常有用的方法,Arrays 则是对一个数组进行类似的操作.
93、 数据结构中,数组与链表有哪些区别?为什么?(重点)
数组就像身上编了号站成一排的人,要找第 10 个人很容易,根据人身上的编号很快就能找到.
但插入、删除慢,要望某个位置插入或删除一个人时,后面的人身上的编号都要变.当然,加入
或删除的人始终末尾的也快.
链表就像手牵着手站成一圈的人,要找第 10 个人不容易,必须从第一个人一个个数过去.但插
入、删除快.插入时只要解开两个人的手,并重新牵上新加进来的人的手就可以.删除一样的
道理.
94、 描述一下 JVMJAVA 虚拟机)加载 class 文件的原理机制?
JVM 中类的装载是由 ClassLoader 和它的子类来实现的,Java ClassLoader 是一个重要的
Java 运行时系统组件.它负责在运行时查找和装入类文件的类.
95 ClassLoader(类加载器)如何加载 class .
JVM(JAVA 虚拟机)里有多个类加载器,每个类加载器可以负责加载特定位置的类,例
如,bootstrap 类加载器负责加载 jre/lib/rt.jar 中的类, 我们平时用的 jdk 中的类都位于 rt.jar
中.extclassloader 负责加载jar/lib/ext/*.jar 中的类,appclassloader 负责 classpath 指定的目录或
jar 中的类.除了 bootstrap 之外,其他的类加载器本身也都是java 类,它们的父类是 ClassLoader.
96 Class.forName 的作用?为什么要用?
答:调用该访问返回一个以字符串指定类名的类的对象.
按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则
返回代表该字节码的 Class 实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所
有的类加载器都无法加载到该类,则抛出 ClassNotFoundException.加载完这个 Class 字节码后,
接着就可以使用 Class 字节码的 newInstance 方法去创建该类的实例对象了.
有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行
时才能确定,这时候就需要使用 Class.forName 去动态加载该类,这个类名通常是在配置文件
中配置的,例如,spring 的 ioc 中每次依赖注入的具体类就是这样配置的,jdbc 的驱动类名通常
也是通过配置文件来配置的,以便在产品交付使用后不用修改源程序就可以更换驱动类名.
97、 为什么要用 ORM? JDBC 有何不一样?
orm是一种思想,就是把object 转变成数据库中的记录,或者把数据库中的记录转变成objecdt,
我们可以用jdbc 来实现这种思想,其实,如果我们的项目是严格按照oop 方式编写的话,我们的
jdbc 程序不管是有意还是无意,就已经在实现 orm 的工作了.
现在有许多 orm 工具,它们底层调用 jdbc 来实现了 orm 工作,我们直接使用这些工具,就省去
了直接使用 jdbc 的繁琐细节,提高了开发效率,现在用的较多的 orm 工具是 hibernate.也听说
一些其他 orm 工具,如 toplink,ojb 等
98 JDBC 中的 PreparedStatement 相比 Statement 的好处(最后一句话是重点) (重点)
一个sql 命令发给服务器去执行的步骤为:语法检查,语义分析,编译成内部指令,缓存指令,执
行指令等过程.
select * from student where id =3 缓存--xxxxx 二进制命令39 / 100
select * from student where id =3--- 直接取-xxxxx 二进制命令
select * from student where id =4---- 会怎么干?
如果当初是 select * from student where id =?---- 又会怎么干?
上面说的是性能提高,可以防止 sql 注入.(重点)
99、 分层开发的优势
1) 每一层专注于自己的功能实现,便于提高质量
2) 便于分工协作,从而提高效率
3) 便于代码复用
4) 便于程序扩展
100、 分层开发的原则
特点:
1) 每一层都有自己的原则
2) 上一层不用关心下一层的实现细节,上一层通过下一层提供对外的接口来使用其功能.
3) 下一层调用上一层的功能,下一层不能调用上一层功能.
原则:
a. 封装性原则:每个层次向外提供公开的统一接口,而隐藏内部的功能实现细节,其他层次
不能也没有必要了解其内部细节
b. 顺序访问原则:下一层为上一层提供服务,而不使用上一层提供的服务.业务逻辑层可以
访问数据访问层的功能,而数据访问层不能访问业务逻辑层功能.
101 Java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出
他们分别是哪些类?
流,是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道.
当先一个流写入数据时,这个流被称为输出流,输出流可以将信息送往程序的外部,如硬盘上
的文件、打印机上的文件等.
输出流:只能从中读取数据,而不能向其中写入数据
输出流:只能向其中写入数据,而不能从中读取数据
字节流的操作最小数据单元为 8 位的字节,而字符流操作的最小数据单元是 16 位的字符.
字节流和字符流的区分非常简单,字节流建议用于二进制数据(如图片),而字符流用于文本,
它们的用法几乎是完全一样的.
字节流,字符流.字节流继承于 InputStream OutputStream,字符流继承于 InputStreamReader
OutputStreamWriter.在 java.io 包中还有许多其他的流,主要是为了提高性能和使用方便.
102、 字节流与字符流的区别?(重点)
要把一片二进制数据数据逐一输出到某个设备中,或者从某个设备中逐一读取一片二进制数
据,不管输入输出设备是什么,我们要用统一的方式来完成这些操作,用一种抽象的方式进行
描述,这个抽象描述方式起名为IO 流,对应的抽象类为OutputStream 和InputStream ,不同的实
现类就代表不同的输入和输出设备,它们都是针对字节进行操作的.
在应用中,经常要完全是字符的一段文本输出去或读进来,用字节流可以吗?计算机中的
一切最终都是二进制的字节形式存在.对于“中国”这些字符,首先要得到其对应的字节,然
后将字节写入到输出流.读取时,首先读到的是字节,可是我们要把它显示为字符,我们需要将40 / 100
字节转换成字符.由于这样的需求很广泛,人家专门提供了字符流的包装类.
底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进
行写入.字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底
层设备,这为我们向 IO 设别写入或读取字符串提供了一点点方便.
字符向字节转换时,要注意编码的问题,因为字符串转成字节数组,
其实是转成该字符的某种编码的字节形式,读取也是反之的道理.
讲解字节流与字符流关系的代码案例:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class IOTest {
public static void main(String[] args) throws Exception
{ String str = "中国人";
/*FileOutputStream fos = newFileOutputStream("1.txt");
fos.write(str.getBytes("UTF-8"));
fos.close( );*/
/*FileWriter fw = new FileWriter("1.txt");
fw.write(str);
fw.close( );*/
PrintWriter pw = new PrintWriter("1.txt","utf-8");
pw.write(str);
pw.close( );
/*FileReader fr = new FileReader("1.txt");
char[] buf = new char[1024];
int len = fr.read(buf);
String myStr = newString(buf,0,len);
System.out.println(myStr);*/
/*FileInputStream fr = newFileInputStream("1.txt");
byte[] buf = new byte[1024];
int len = fr.read(buf);
String myStr = new String(buf,0,len,"UTF-8");
System.out.println(myStr);*/
BufferedReader br = new
BufferedReader( new
InputStreamReader(
new FileInputStream("1.txt"),"UTF-8"
)
);
String myStr = br.readLine( );
br.close( );
System.out.println(myStr);41 / 100
}
}
103、 什么是java 序列化,如何实现java 序列化?或者请解释Serializable 接口的作用. (
)
我们有时候要将一个 java 对象变成字节流的形式传出去或者从一个字节流中恢复成一
个 java 对象,例如,要将 java 对象存储到硬盘或者传送给网络上的其他计算机,这个过程我
们可以自己写代码去把一个 java 对象变成某个格式的字节流再传输,但是,java 虚拟机本身
就提供了这种支持,我们可以调用 OutputStream 的 writeObject 方法来做,如果要让java 帮
我们做,要被传输的对象必须实现serializable 接口,这样,javac 编译时就会进行特殊处理, 编
译的类才可以被 writeObject 方法操作,这就是所谓的序列化.需要被序列化的类必须实现
Serializable 接口,该接口是一个 mini 接口,其中没有需要实现的方法,implements
Serializable 只是为了标注该对象是可被序列化的.
例如,在 web 开发中,如果对象被保存在了 Session 中,Tomcat 在重启时要把 Session
对象序列化到硬盘,这个对象就必须实现 Serializable 接口.如果对象要经过分布式系统进
行网络传输或通过 rmi 等远程调用,这就需要在网络上传输对象,被传输的对象就必须实
现 Serializable 接口.
104、 序列化的概念和序列化 ID 的作用?(这题需要看看)
对象经常要通过 I/O(输入输出设备)进行传送,让你写程序传递对象,你会怎么做?把对
象的状态数据用某种格式写入到硬盘,Person->“zxx,male,28,30000”→Person,既然大家
都要这么干,并且没有个统一的干法,于是,sun 公司就提出一种统一的解决方案,它会把对象
变成某个格式进行输入和输出,这种格式对程序员来说是透明(transparent)的,但是,我们
的某个类要想能被sun 的这种方案处理,必须实现 Serializable 接口.
ObjectOutputStream.writeObject(obj);//对象输出流保存对象,要使用序列化操作 Object
obj = ObjectInputStream.readObject( );//对象输入流读取对象,使用反序列化操作
序列化 id 的作用是什么呢,用以下场景来解释它的作用:
假设两年前我保存了某个类的一个对象,这两年来,我修改该类(类名保持不变),删除了
某个属性和增加了另外一个属性,两年后,我又去读取那个保存的对象,会有什么结果?Sun 的
jdk 无法获知你保存的对象到底是未修改前的类的对象还是修改后的类的对象.为此,一个解
决办法就是在类中增加版本号信息,每一次类的属性修改,都应该把版本号升级一下,这样,在
读取时,比较存储对象时的版本号与当前类的版本号,如果不一致,则直接报版本号不同的错!,
此处的版本号其实就是序列化 ID
42 / 100
105 JavaScript 变量有哪些数据类型?
JavaScript 是一种弱类型语言,在声明变量时不需要指变量的类型,变量的类型由赋给变
量的值来决定.
常用的基本数据类型:
1
undefined(未定义类型)
2
null(空类型)
3
number(数值类型)
4
string(字符串类型)
5
boolean(布尔类型)
106 js 中的 3 种弹出式消息提醒(警告窗口,确认窗口,信息输入窗口)的命令是什么?
弹出警告窗口“输入数据无效”
弹出确认窗口“确认保存吗?”
弹出信息输入窗口“请在此输入你的姓名”
“输入数据无效”:
alert("输入数据无效");//警告
“确认保存吗?”:
confirm("你是菜鸟吗");//确认
“请在此输入你的姓名”:
prompt("请在此输入你的姓名")//信息输入
107、 什么是 BOM
BOM 是 Browser Object Model(浏览器对象模型)的简称,提供了独立于内容与浏览
器窗口进行交互的对象.43 / 100
108、 什么是 DOM?
DOM 即 Document Object Model(文档对象模型),如果需要对 HTML 文档中的元素进行访
问,添加,删除,移动或重排,JavaScript 就是通过 DOM 来实现的,DOM 可被 JavaScript 用来读取,
改变 HTML,XHTML 及XML 文档,所以 DOM 是由三部分组成的.
分别是:
1.
Core DOM,即核心 DOM 编程,定义了一套标准的针对任何结构化文档的对象.
2.
XML DOM:定义了一套标准的针对 XML 文档的对象.
3.
HTML DOM:定义了一套标准的针对 HTML 文档的对象.
109 Javascript 中定时执行如何实现,JavaScript 如何实现一段代码在执行时间后运行?
如何指定一段代码每隔指定时间就运行?
定时执行有两种函数,setTimeout( )和 setInterval( ),setTimeout( )是在一段时间
后执行指定方法,而setInterval( )是每隔一段时间后执行指定的方法
110 DOM 模型中的常用对象及其方法?
1) document 对象的常用方法:
write( )
getElementById( )
getElementByName( )
getElementByTagName( )
2) location 对象提供了当前页面的 URL 信息.主要方法有:
reload( )是用于重新加载当前文档.
replace( )是用新的文档替换当前文档.
3) history 对象提供了用户最近浏览过的 URL 列表,主要方法有:
back( ):实现浏览器后退页面功能
forwarc( ):实现浏览器前进页面功能
go( ):在页面上实现前进、后退的功能.44 / 100
111、 如何设置页面元素的显示和隐藏?
主要用到两个属性,visibilitydisplay,区别在于:属性的值不同:visibility 属性
的值有:visible(可见),hidden(不可见),Display 属性的值有:none(不可见),block
(可见).
visibility 属性设置元素不可见时,元素仍然占据页面上的空间,而display 属性设置元
素不可见不会占据页面上的空间.
代码示例:
1) document.getElementById('对象 1').style.display = "none";(会释放元素所在页面
上所占的空间)
2) document.getElementById('对象 1').style.visibility= "visible";(不会释放元素
所在页面上所占的空间)
112、 使用什么事件可以实现当鼠标移动某文本上时,文本样式改变,当鼠标离开时文本样
式恢复为原来的样式?
1)onmouseover 事件可以将鼠标移动到某文本上时改变文本的样式.
2)onmouseout 事件可以当鼠标离开文本是恢复原来的样式.
113 DOM 如何操作文档的标准节点?
1)查看节点:使用 getElementById( ),getElementByName( ),getElementByTagName 可以查
看 HTML 文档中的任何元素.
2)创 建 和 增 加 节 点 : 创 建 节 点 要 用 到 createElement( “ 标 签 名 ” ), 例如 :
createElement(“img”).
3)增加节点有三种方式:
appendChild(nodeName)向已经存在节点列表的末尾添加新的子节点.
insertBefore(newNode,oldNode)向指定的节点前插入一个新的子节点.
cloneNode(deep)复制某个指定的节点,deep 是布尔值,当 deep 为 true 时,会复制指定的节45 / 100
点和所有子节点,当 deep 为 false 时,只复制指定的节点和它的属性.
4)删除和替换节点:分别用 removeChild(none),replaceChild(newNode,oldNode).
114、 什么是 jQuery
jQuery 也就是 JavaScript 和 Query(查询),即是辅助 JavaScript 开发的库.
jQuery 优势:
1).轻量级
2).强大的选择器
3).出色的 DOM 操作封装
4).可靠的事件处理机制
5).出色的浏览器兼容性
6).完善的 Ajax 支持
7).出色的浏览器兼容性等
8).jQuery 理念:写的少,做的多
115、 你为什么要使用 jQuery
答:因为 jQuery 是轻量级的框架,大小不到 30kb,它有强大的选择器,出色的 DOM 操作的封
装,有可靠的事件处理机制(jQuery 在处理事件绑定的时候相当的可靠),完善的 ajax(它的
ajax 封装的非常的好,不需要考虑复杂浏览器的兼容性和 XMLHttpRequest 对象的创建和
使用的问题.) 出色的浏览器的兼容性. 而且支持链式操作,隐式迭代.行为层和结构层的分
离,还支持丰富的插件,jQuery 的文档也非常的丰富.
116、 你在公司是怎么用 jQuery 的?(重点)
答:在项目中是怎么用的是看看你有没有项目经验(根据自己的实际情况来回答)
你用过的选择器啊,复选框啊,表单啊,ajax 啊,事件等
配置 JQuery 环境的步骤
1)下载 jQuery 类库,在 jsp 页面引用 jQuery 类库即可46 / 100
<script type="text/javascript" src="jQuery/jQuery-1.7.2.min.js"/>
2)jQuery 的调用示例:
<script>
//创建一个页面默认启动调用的特效
$(document).ready(
function( ){
alert("页面启动时调用该方法!");
}
);
//以上代码也可以写成如下的简写方式
$(function( ){
alert("页面启动时调用该方法!");
});
</script>
117 jQuery 能做什么?
答:1. 获取页面的元素
2.修改页面的外观
3.改变页面大的内容
4.响应用户的页面操作
5.为页面添加动态效果
6.无需刷新页面,即可以从服务器获取信息 7.
简化常见的 javascript 任务
118 $(document).ready( )方法和 window.onload 有什么区别?(重点)
答: 两个方法有相似的功能,但是在执行时机方面是有区别的.
1) window.onload 方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏
览器后才执行的.
2) $(document).ready( ) 方法可以在 DOM 载入就绪时就对其进行操纵,并调用执行绑定
的函数.
119 Jquery 对象和 dom 对象的区别
Jquery 对象才能调用jquery 中特有的方法.例如jqueryObj.html( )、jqueryObj.val( )
等方法,而不能使用dom 对象特有的属性和方法,例如 domObj.value,domObj.innerHTML
等.47 / 100
Jquery 对象可以和 dom 对象相互转化
120 jQuery 对象和 dom 对象是怎样转换的?
1.
jQuery 转 DOM 对象:
1)
jQuery 对象是一个数组对象,可以通过[index]的方式得到相应的 DOM 对象,例如页
面有个 id 为myDiv 的 DIV 对象,可以使用 var domObj = $(“#myDiv”)[0]这种方式
来获取该 DIV 对应的 dom 对象
2)
通过 get(index)去得到相应的 DOM 对象,var domObj = $(“#myDiv”).get(0);
2.
DOM 对象转 jQuery 对象:
直接使用$(DOM 对象)来转换,示例代码:
var domObj = document.getElementById(“myDiv”);
var jQueryObj = $(domObj);
$( )就相当于一个 jquery 对象的构造函数
121、 什么是 jQuery 选择器
1)
jQuery 选择器继承了CSS 与Path 语言的部分语法,允许通过标签名、属性名或内容对
DOM 元素进行快速、准确的选择,而不必担心浏览器的兼容性,通过 jQuery 选择器对页面
的元素的精准定位,才能完成元素属性和行为的处理.
选择器是 jQuery 的根基,在 jQuery 中,对象的事件处理,遍历 DOM 和 Ajax 操作都依赖于
选择器
2)
jQuery 选择器的优点:
简洁的写法
完善的事件处理机制
支持 CSS1 到 CSS3 选择器
122 jQuery 选择器的种类
1). 基本选择器
基本选择器是 jQuery 中最常见的选择器,也是最简单的选择器,它通过元素 id,class 和
标记名来查找DOM 元素
2). 层次选择器
如果想通过 DOM 元素之间的层次关系来获取特定元素,就需要使用层次选择器48 / 100
3). 过滤器选择器
过滤选择器主要是通过特定的过滤规则来筛选出所需的 DOM 元素,该选择器都以“:”
开头,过滤选择器又分以下几种
4). 表单选择器
表单选择器主要是通过所选择的表单元素进行过滤
5). 属性选择器
属性过滤选择器的过滤规则是通过元素的属性来获取相应的元素
7). 内容过滤器选择器
内容过滤选择器的过滤规则主要体现在它所包含的子元素和和文本内容上
8). 可见性过滤选择器
可见性过滤选择器是根据元素的可见和不可见状态来选择相应的元素
123 Query 中的选择器 和 css 中的选择器有区别吗?
答:jQuery 选择器支持 CSS 里的选择器,jQuery 选择器可用来添加样式和添加相应的
为 CSS 中的选择器是只能添加相应的样式.
124 jQuery 中的 hover( ) toggle( )有什么区别?
答: hover( )和 toggle( )都是 jQuery 中两个合成事件.
hover( )方法用于模拟光标悬停事件.
toggle( )方法是连续点击事件.
125、 你是如何使用 jQuery 中的 ajax 的?
答: 如果是一些常规的 ajax 程序的话,使用$.load( ),$.get( ),$.post( ),就可以搞
定了,
一般我会使用的是$.get( ) 方法.
如果需要设定 beforeSend(提交前回调函数),error(失败后处理),success(成功后处
理)
及 complete(请求完成后处理)回调函数等,这个时候我会使用$.ajax( ) 49 / 100
126 jQuery $.get( )提交和$.post( )提交有区别吗?
1)
$.get( ) 方法使用 GET 方法来进行异步请求的,$.post( ) 方法使用 POST 方法来进
行异步请求的.
2)
get 请求会将参数跟在 URL 后进行传递,而 POST 请求则是作为 HTTP 消息的实体正文
内容发送给 Web 服务器的,这种传递是对用户不可见的.
3)
get 方式传输的数据大小不能超过 2KB 而 POST 要大的多
4)
GET 方式请求的数据会被浏览器缓存起来,因此有安全问题.
127 jQuery 中的 load 方法一般怎么用的?
答:load 方法一般在 载入远程 HTML 代码并插入到 DOM 中的时候用通常用来从 Web 服
务器上获取静态的数据文件.
如果要传递参数的话,可以使用$.get( ) 或 $.post( ).
128、 在 jQuery 执行 ajax 中,提交的 data(数据)主要有几种方式?
答:三种,html 拼接的,json 数组,form 表单经 serialize( )序列化的.
129、 你知道 jQuery 中的事件冒泡吗,它是怎么执行的,何如来停止冒泡事件?
答: 知道,事件冒泡是从里面的往外面开始触发.
在 jQuery 中提供了 stopPropagation( )方法可以停止冒泡.
130、 你使用过 jQuery 中的动画吗,是怎样用的?(重点)
答:使用过.
hide( ) 和 show( ) 同时修改多个样式属性.像高度,宽度,不透明度.
fadeIn( ) 和 fadeOut( ) fadeTo( ) 只改变不透明度
slideUp( ) 和 slideDown( ) slideToggle( ) 只改变高度
animate( ) 属于自定义动画的方法.、
50 / 100
131、 怎样给 jQuery 动态附加新的元素?那么怎样给新生成的元素绑定事件呢?
jQuery 的 html( )可以给现有元素附加新的元素.
直接在元素还未生成前就绑定肯定是无效的,因为所绑定的元素目前根本不存在.
所以我们可以通过live 和livequery 来动态绑定事件,这种绑定方式对现有和新生成的
元素都有效.
132、 什么是 URL
URL,是英文 Uniform Resource Locator 的缩写,意思是统一资源定位符,是标准的互联网行资源
(图片,Javacript 脚本文件等)的地址,是用于完整的描述 Internet 上网页和其他资源的地址
的一种标识方法.简单的说,URL 就是我们常说的网址.
133 Web 应用的目录结构:
/:Web 应用的根目录,该目录下的所有文件对客户端都可以访问包括JSP、HTML
/WEB-INF:存放应用程序所使用的各种资源,该目录及其子目录对客户端都是不可以访问
的,其中包括 web.xml(部署表述符)
/WEB-INF/classes:存放应用的所有 class 文件
/WEB-INF/lib:存放Web 应用使用的 JAR 文件
134 Tomcat 的目录结构:
/bin:存放各种平台下用于启动和停止 Tomcat 的脚本文件
/conf:存放 Tomcat 服务器的各种配置文件,其中最重要的文件时 server.xml
/lib:存放 Tomcat 服务器所需的各种 JAR 文件
/logs:存放 Tomcat 的日志文件51 / 100
/temp:Tomcat 运行时用于存放临时文件
/webapps:Web 应用的发布目录
/work:Tomcat 把由 JSP 生成的 Servler 放于此目录下
135 Tomcat 工作原理?(重点)
Tomcat 是 Servlet 运行环境(容器),每个 Servlet 执行 init( ),service( ),destory( ).
下面以分析 Tomcat Server 处理一个 http 请求的过程来解释 Tomcat 原理.
假设来自客户的请求为:http://localhost:8080/wsota/wsota_index.jsp
1) 请求被发送到本机端口 8080,被在那里侦听的 Coyote HTTP/1.1 Connector 获得
2) Connector 把该请求交给它所在的Service 的 Engine 来处理,并等待来自Engine 的回
3) Engine 获得请求 localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机
Host
4) Engine 匹配到名为 localhost 的 Host(即使匹配不到也把请求交给该 Host 处理,因为
该 Host 被定义为该 Engine 的默认主机)
5) localhost Host 获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有 Context
6) Host 匹配到路径为/wsota 的 Context(如果匹配不到就把该请求交给路径名为""的
Context 去处理)
7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找
对应的 servlet
8) Context 匹配到URL PATTERN 为*.jsp 的 servlet,对应于 JspServlet 类
9) 构造 HttpServletRequest 对象和 HttpServletResponse 对 象 , 作为参数调用
JspServlet 的 doGet 或 doPost 方法52 / 100
10) Context 把执行完了之后的 HttpServletResponse 对象返回给 Host
11) Host 把 HttpServletResponse 对象返回给 Engine
12) Engine 把 HttpServletResponse 对象返回给 Connector
Connector 把 HttpServletResponse 对象返回给客户 browser
136 JSP 的执行过程? (重点)
1) 翻译阶段:当 Web 服务器接收到JSP 请求时,首先会对 JSP 文件进行翻译,将编写好的
JSP 文件通过 JSP 引擎转换成可识别的Java 源代码.
2) 编译阶段:经过翻译后的 JSP 文件相当于我们编写好的 Java 源文件,此时仅有Java 源文
件是不够的,必须要将Java 源文件编译成可执行的字节码文件.所以 Web 容器处理JSP 请求
的第二阶段就是执行编译.
3) 执行阶段:Web 容器接收了客户端的请求后,经过翻译和编译两个阶段,生成了可被执行
的二进制字节码文件,此时就进入执行阶段.当执行结束后,会得到处理请求的结果,Web 容器
又会再把生成的结果页面返回到客户端用户面前显示.
注意:只有第一次请求JSP 页面或者JSP 页面内容修改后访问才会执行翻译阶段和编译阶段,
所有 JSP 的执行效率并不低,只是第一次访问页面时会稍微慢一点
137 JSP 指令有几种?
JSP 指令主要有三种:page 指令,include 指令,taglib 指令
138 page 指令常用属性?
language:指定 JSP 页面使用的脚本语言,默认为“Java”
Import :通过该属性来引用脚本语言中使用到的类文件
contentType: 用来指定JSP 页面所采用的编码格式,默认为“text/html;charset=GBK”第53 / 100
二章
139 JSP 有哪些内置对象?作用分别是什么? 分别有什么方法? (重点)
JSP 共有以下 9 个内置的对象:
request表示 HttpServletRequest 对象,用户端请求.它包含了有关浏览器请求的信息,并且提
供了几个用于获取cookie, header, 和 session 数据的有用的方法.
response表示 HttpServletResponse 对象,并提供了几个用于设置送回 浏览器的响应的方法
(如 cookies,头信息等),网页传回用户端的回应
out对象是javax.jsp.JspWriter 的一个实例,并提供了几个方法使你能用于向浏览器回送输出
结果.
pageContext表示一个javax.servlet.jsp.PageContext 对象.该对象提供了对JSP 页面内所有的
对象及名字空间(就是四大作用域空间,如 page 空间、request 空间、session 空间、
application 空间)的访问,也就是说他可以访问到当前请求对应 session 中保存的信息,也可
以取当前应用所在的 application 的某一属性值,它相当于页面中所有功能的集大成者,包装
了通用的 servlet 相关功能的方法.
session表示一个请求的 javax.servlet.http.HttpSession 对象.Session 可以存贮用户的状态信
applicaton 表示一个 javax.servle.ServletContext 对象.类似于系统的全局变量,用于实现
Web 应用中的资源共享.
config表示一个 javax.servlet.ServletConfig 对象.用于存放 JSP 编译后的初始数据.
page表示从该页面产生的一个 servlet 实例,JSP 网页本身
exception 针对错误网页,未捕捉的例外.表示 JSP 页面运行时产生的异常和错误信息,该对
象只有在错误页面(page 指令中设定 isErrorPage 为 true 的页面)中才能够使用.
140 Request 对象的主要方法(重点)
(1) getParameter(String name):获得客户端传送给服务器端的有name 指定的54 / 100
参数值
(2) getParametervalues(String name):获得有 name 指定的参数的所有值
(3) void setCharacterEncoding(String charset):指定每个请求的编码,在
request.getParameter( )方法之前进行设定,可以用于解决中问乱码问题
(4) getRequestDispatcher(String path):返回一个
Javax.servlet.RequestDispatcher 对象,该对象的forward 方法用于转发请求
(5) setAttribute(String name,Object):设置名字为 name 的request 的参数值
(6) getAttribute(String name):返回由 name 指定的属性值
(7) getAttributeNames( ):返回request 对象所有属性的名字集合,结果是一个
枚举的实例
(8) getCookies( ):返回客户端的所有Cookie 对象,结果是一个 Cookie 数组
(9) getCharacterEncoding( ):返回请求中的字符编码方式
(10)getParameterNames( ):获得客户端传送给服务器端的所有参数的名字,结
果是一个枚举的实例
(11)getProtocol( ):获取客户端向服务器端传送数据所依据的协议名称
(12)getRequestURI( ):获取发出请求字符串的客户端地址
(13)getRemoteAddr( ):获取客户端的 IP 地址
(14)getRemoteHost( ):获取客户端的名字
(15)getSession([Boolean create]):返回和请求相关 Session
(16)getServerName( ):获取服务器的名字
(17)getServletPath( ):获取客户端所请求的脚本文件的路径
(18)getServerPort( ):获取服务器的端口号
(19)removeAttribute(String name):删除请求中的一个属性
141 Response 对象的主要方法(重点)
1) void addCookie(Cookie cookie):在客户端添加 Cookie
2) void setContentType(Sring type):设置 HTTP 响应的 contentType 类型
3) void SetCharacterEncoding(String charset):设置响应所采用的字符编码
类型
4) void sendRedirect(String location): 将请求重新定位到一个新的 URL 上
142 Servlet API forward( ) sendRedirect ( )的区别?(就是请求转发和重定向的
区别) ?(重点)
请求转发:请求转发是指将请求再转发到另一资源(一般为 JSP 或 Servlet).此过程依
然在同一个请求范围内,转发后浏览器地址栏内容不变,请求转发使用RequestDispatcher 接口55 / 100
中的 forward( )方法来实现,该方法可以把请求转发到另外一个资源,并让该资源对浏览器的
请 求 进 行 响 应
RequestDispatcher
rd
=
request.getRequestDispatcher(path);
rd.forward(request,response);
request.getRequestDispatcher(path) .forward(request,response);
重定向:重定向是指页面重新定位到某个新地址,之前的请求失效,进入一个新的请求,
且跳转后浏览器地址栏内容将变为新的指定地址.重定向是通过 HttpServletResponse 对象的
sendRedirect( )来实现,该方法相当于浏览器重新发送一个请求 response.sendRedirect(path);
请求转发和重定向区别如下:
forward( )只能将请求转发给同一个 Web 应用中的组件,而 sendRedirect( )方法不仅可以
重定向到当前应用程序中的其他资源,还可以重定向到其他站点的资源.
请求转发和重定向是 Servlet 处理完数据后进行页面跳转的两种主要方式
psendRedirect( )方法重定向的访问过程结束后,浏览器地址栏中显示的 URL 会发生改变,由
初始的 URL 地址变成重定向的目标 URL;而调用 forward( )方法的请求转发过程结束后,浏览
器地址栏保持初始的 URL 地址不变.forward( )方法的调用者与被调用者之间共享相同的
request 对象和 response 对象;而 sendRedirect( )方法调用者和被调用者使用各自的request
对象和 response 对象,它们属于两个独立的请求和响应过程.
143、 在 JSP 中如何实现页面跳转?
1) 使用javascript 中的 window.location.href=”要跳转的页面”.
2) 在超链接中:href=”location=要跳转的页面”,例如<a href=”index.jsp”>首页
</a>.
3) form 表单中提交:action=”要跳转的页面”.
4) 使用jsp 内置对象 request 或 response,执行请求转发或重定向来实现页面跳转
144、 什么是 Session 机制(重点)
会话的跟踪,就是 session 机制,Session 机制是一种服务器端的机制,服务器使用一种类56 / 100
似于散列表(HashTable)的结构来保存信息,主要用于在整个会话请求过程中共享数据.
Session 机制的实现原理:
1) 当程序需要为某个客户端的请求创建 session 的时候,服务器首先检查这个客
户端的请求里是否包含一个 session 标识,即称为 sessionid
2) 如果包含sessionid 则说明该客户端创建过session,服务器就会按照
sessionid 把这个session 检索出来使用,如果检索不到,会创建一个新的
session 对象,并生成一个新的与此session 关联的 sessionid.
3) 如果客户端请求不包含 sessionid,则为此客户端创建一个session 并生成一个
于此session 相关联的sessionid
Sessionid 传递的方式有两种:
Cookie 方式:服务器分配的sessionid 将作为 Cookie 发送给浏览器,浏览器保存
这个 Cookie.当再次发送 Http 请求时,浏览器将 Cookie 随请求一起发送,服务器从请
求对象中读取 sessionid,再根据 sessionid 找到对应的 HttpSession 对象.
URL 重写:当 cookie 被人禁止的时候,我们就可以使用Url 重写的方式把sessionid
传递回服务器.就是把 sessionid 附加在URL 路径的后面.附加的方式有两种:一种是
作为 URL 路径的附加信息,一种是作为查询字符串附加在 URL 后面.
145 session 对象的常用方法
void setAttribute(String key,Object value):以 key/value 的形式将对象保存到 session 中
Object getAttribute (String key):通过 key 获取 session 中保存的对象
void invalidate( ):设置 session 对象失效
String getId( ):获取 sessionId
void setMaxInactiveInterval( ):设置 session 的非活动时间57 / 100
int getMaxInactiveInterval( ):获取 session 的有效非活动时间,以秒为单位
void removeAttribute(String key):从 session 中删除指定名称(key)所对应的对象
146、 四种会话跟踪技术(重点)
由于 HTTP 事务是无状态的,因此必须采取特殊措施是服务器在系列事务期间能继续确定和
记住特定用户,这就是会话跟踪的概念.
实现此功能有四种实现技术:
1、用隐藏表单域(<input type="hidden">) 非
常适合不需要大量数据存储的会话应用.
2、URL 重写
URL 可以在后面附加参数,和服务器的请求一起发送,服务器根据相应的参数来判断是否
为同一个客户端发送的请求,一般可以直接使用 HTTP 会话 API 执行 URL 重写,会自动附加相
应的 sessionid,该技术主要使用场景是客户端的浏览器禁用 cookie 导致 session 无法使用的
情况.
3、Cookie 技术
服务器通过 cookie 对象来保存 session 对象的 id,用来保证客户端每次发送请求过来都
会带上 sessionid 以保证服务器可以识别不同客户端的请求,是 session 机制实现的前提,如果
用户禁用 cookie 就只能使用 url 重写来保证 sessionid 的传递了.
4、Session 技术
根据session 对象的 sessionid(唯一标识)即可识别不同的客户端请求
147 Web 应用中的四大作用域(注意不要和四种会话跟踪技术搞混淆了)(重点)
page 是代表与一个页面相关的对象和属性.一个页面由一个编译好的 Java Servlet 类58 / 100
(可以带有任何的 include 指令,但是没有 include 动作)表示.这既包括 servlet 又包括被
编译成 servlet 的 JSP 页面
request 是代表与Web 客户机发出的一个请求相关的对象和属性.一个请求可能跨越
多个页面,涉及多个Web 组件(由于 forward 指令和 include 动作的关系)
session 是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性.一个
Web 会话可以也经常会跨越多个客户机请求
application 是代表与整个Web 应用程序相关的对象和属性.这实质上是跨越整个
Web 应用程序,包括多个页面、请求和会话的一个全局作用域
148、 什么是 Cookie
Cookie,有时也用其复数形式 cookies,指某些网站为了辨别用户身份、进行session 跟踪
而储存在用户本地终端上的数据(通常经过加密).
Cookie 是由服务器端生成,发送给客户端浏览器的,浏览器会将其保存成某个目录下的
文本文件.
149、 在 JSP 中如何设置 Cookie(重点)
Cookie cookie = new Cookie("cookieName","cookieValue");
其中 cookieName 为 Cookie 对象的名称,未来获取 Cookie 的时候需要使用.cookieValue 为
Cookie
对象的值也就是储存用户的信息如用户名、 密码等.
150 Cookie 的应用场景?
1.对特定对象的追踪,如访问者的访问次数,最后访问时间、路径等
2.统计网页浏览记录.
3.在 Cookie 有效期内,记录用户登入信息.59 / 100
4.实现各种个性化服务,如针对不同用户喜好以不同的风格展示不同的内容
提示:由于Cookie 保存在客户端,所以使用Cookie 存在一定的风险,所以不建议在Cookie
中保存比较重要或敏感的内容.
151 cookie session 有什么区别?(重点)
1)session 是服务器端保存用户信息,cookie 是在客户端保存用户信息.
2)session 中保存的是对象,cookie 保存的是字符串.
3)session 对象随会话结束而关闭,cookie 可以长期保存在客户端
4)cookie 通常用于保存不重要的用户信息,重要的信息使用 session 保存.第五章
152、 说出数据连接池的工作机制是什么? (重点)
数据库连接是一种关键的有限的昂贵的资源,这一点企业级应用程序中体现得尤为突出.
对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.
数据库连接池正是针对这个问题提出来的.
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的
数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免
因为没有释放数据库连接而引起的数据库连接遗漏.这项技术能明显提高对数据库操作的性
能.
具体工作机制如下:
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数
量是由最小数据库连接数来设定的.无论这些数据库连接是否被使用,连接池都将一直保证至
少拥有这么多的连接数量.连接池的最大数据库连接数量限定了这个连接池能占有的最大连
接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列
中.60 / 100
数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
1) 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用
量不大,将会有大量的数据库连接资源被浪费;
2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据
库连接请求将被加入到等待队列中,这会影响之后的数据库操作.
3) 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小
连接数量的连接请求等价于建立一个新的数据库连接.不过,这些大于最小连接数的数据库连
接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放.
153、 什么是 MVC 设计模式(重点)
MVC 模式是一种流行的软件的设计模式,MVC 模式将应用程序实现分为 3 个不同的基
本部分.模型,视图和控制器.
模型(Model):表示数据和业务处理.在 MVC 的三个部件中,模型拥有最多的处理任务.
被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数
据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性.对
应的组件是java Bean( java 类).
视图(view): 是用户看到并与之交互的界面.MVC一个最大的好处就是它能为应用程序
处理很多不同的视图,在视图中其实没有真正的处理发生,不管这些数据是什么,作为视图来
讲,它只是作为一种输出数据并允许用户操作的方式.对应的组件是 JSP 或 HTML 文件.视图
提供可交互的界面,向客户显示模型数据.
控制器(Controller): 接收用户的输入并调用模型组件去完成用户的请求.当用户提交一
个请求时,控制器本身不做执行业务处理.它只是接收请求并决定调用哪个模型组件去处理请
求,然后确定用哪个视图来显示模型处理返回的数据.对应的组件可以是 Servlet. 控制器61 / 100
响应客户的请求,根据客户的请求来操作模型,并把模型的响应结果经由视图展现给客户.
MVC 最重要的特点就是把显示和数据分离,提高代码的可重用性.
MVC 的处理过程:
首先控制器接收用户的请求,并决定应该调用哪个模型来处理,然后模型处理用户的请求
并返回数据,最后控制器确定相应的视图将模型返回的数据呈现给用户.
154 MVC 设计模式的优缺点:(重点)
1)优点:
各司其职、互不干涉;
有利于开发中的分工;
有利于组建的重用;
2)缺点:
系统结构和实现复杂;
视图与控制器过于紧密;
不适用于小型甚至中型应用程序;第七章
155、 什么是 Servlet
Servlet 是一种服务器端的 Java 应用程序,具有独立于平台和协议的特性,可以生成动态
的 Web 页面. 它承担处理客户请求(Web 浏览器或其他 HTTP 客户程序)与服务器响应
(HTTP 服务器上的数据库或应用程序)的工作. Servlet 是位于Web 服务器内部的服务器
端的Java 应用程序,与传统的从命令行启动的Java 应用程序不同,Servlet 由 Web 服务器进
行加载,该 Web 服务器必须包含支持 Servlet 的 Java 虚拟机.
156、 说一说 Servlet 的生命周期? (重点)
servlet 有良好的生命周期的定义,包括加载和实例化、初始化、处理请求以及服务结束
四个阶段.WEB 容器加载Servlet,生命周期开始.首先服务器调用 Servlet 的构造方法执行实
例化操作,然后容器调用 Servlet 的 init 方法执行初始化操作,请求到达时运行 Servlet 的62 / 100
service 方法,service 方法自动调用与请求类型对应的 doXXX 方法(doGet,doPost)等来
处理请求,当服务器决定将 Servlet 实例销毁前调用其 destroy 方法(用于释放 Servlet 占用
资源,例如流、数据库连接等).
157、 服务器如何响应 Web 客户请求?
HttpServlet 容器响应Web 客户请求流程如下:
1) Web 客户向 Servlet 容器发出 Http 请求;
2) Servlet 容器解析Web 客户的 Http 请求;
3) Servlet 容器创建一个 HttpRequest 对象,在这个对象中封装 Http 请求信息;
4) Servlet 容器创建一个 HttpResponse 对象;
5) Servlet 容器调用 HttpServlet 的 service 方法,把 HttpRequest 和 HttpResponse
对象作为 service 方法的参数传给 HttpServlet 对象;
6) HttpServlet 调用 HttpRequest 的有关方法,获取 HTTP 请求信息;
7) HttpServlet 调用 HttpResponse 的有关方法,生成响应数据;
8) Servlet 容器把 HttpServlet 的响应结果传给Web 客户.
158、 什么情况下调用 doGet( ) doPost( )
Jsp 页面中的form 表单标签里的method 属性为get 时调用doGet( ),为post 时调用
doPost( ).
159 JSP Servlet 有哪些相同点和不同点,他们之间的联系是什么? (重点)
JSP 是 Servlet 技术的扩展,本质上是 Servlet 的简易方式,更强调应用的外表表达.JSP
编译后是"类 servlet".Servlet 和 JSP 最主要的不同点在于,Servlet 的应用逻辑是在Java 文
件中,并且完全从表示层中的 HTML 里分离开来.而 JSP 的情况是Java 和 HTML 可以组合成63 / 100
一个扩展名为.jsp 的文件.JSP 侧重于展示内容,Servlet 主要用于控制逻辑.
160、 如何实现 servlet 的单线程模式
通过 page 指令设置<%@ page isThreadSafe="false"%>,默认 Servlet 支持多线程模
式,即有多个客户端同时请求同一个 Servlet,服务器上的 Servlet 只会产生一个实例,但是会
启动多个线程来响应客户请求,但是这样会导致线程安全问题,编程时建议不要在 Servlet 中
定义成员属性来共享数据,以避免出现数据同步的问题.
161、 在 servlets JSP 之间能共享 session 对象吗?
当然可以,session 作用域中的内容,可以在多个请求中共享数据.例如可以在Servlet 中通
过 request.getSession( )来得到HttpSession 对象,然后将相应数据存储到该 session 对象
中,在其它 jsp 页面上都可以通过内置对象 session 来获取存入的值,即使这些页面是通过重
定向方式跳转过去的,也可以得到值.Session 本来就是用来保障在同一客户端和服务器之间
多次请求之间的数据能够共享的一种机制.第八章
162 EL 隐式对象有哪些?
1).作用域访问对象
pageScope:与页面作用域(page)中属性相关联的 Map 类
requestScope:与请求作用域(request)中属性相关联的 Map 类
sessionScope:与会话作用域(session)中属性相关联的 Map 类
applicationScope:与应用程序作用域(application)中属性相关联的 Map 类
使用例子:request.setAttribute("Student",stu);当使用 EL 表达式访问某个属性值时候,应
该 指 定 查 找 范 围 , 如 ${requestScope.Student} 如 果 不 指 定 查 找 范 围 , 会 按 照
page->request->session->application 的顺序查找
注意:必须将对象保存在作用域中,才可以用 EL 表达式访问对象.64 / 100
2).参数访问对象
param 按照参数名称访问单一请求值的 Map 对象
paramValues 按照参数名称访问数组请求值的 Map 对象
参数访问对象是和页面输入参数有关的隐式对象,通过它们可以得到用户的请求参
数:
比如登录页面表单有个表单项 <input type="text" name="userName">提交用户
名,
在登录处理页面可以通过 ${param.userName} 访问它
3).JSP 隐式对象
pageContext 提供对页面信息的 JSP 内置对象的访问
163 jsp 乱码如何解决,给出三种以上的对应解决方案,并给出对应的程序案例;
1) JSP 页面显示乱码
<%@ page contentType=”text/html; charset=gb2312″%>
2) 表单提交中文时出现乱码
request.seCharacterEncoding(“gb2312″)对请求进行统一编码
3) 数据库连接出现乱码
要 涉 及 中 文 的 地 方 全 部 是 乱 码 , 解决办法: 在数据库的数据库 URL 中加上
useUnicode=true&characterEncoding=GBK 就 OK 了.
4) 通过过滤器完成
5) 在 server.xml 中的设置编码格式65 / 100
164、 请简述 Cookie, Session Application 它们的区别. (重点)
1) Cookie 会在客户端硬盘上创建 Cookie 文件
2) Session 大部分情况下会在服务器端硬盘上写入 Cookie 文件
3) Cookie 安全性最低
4) Application 表示 Servlet 上下文环境,在整个 WEB 应用中只有一个Application 对象,用于
存储些全局性的数据
165 Hibernate 使用步骤(重点)
1) 导入 hibernate 的jar 文件和数据库的jar 文件
2) 编写 hibernate 配置文件,hibernate.cfg.xml,默认放在 src 目录,此文件保存数据库
的连接信息,hibernate 全局属性信息,以及关联的实体映射文件.
3) 编写实体及实体映射文件.如果是在 3.2 以上版本,则可用注解的方式,可不需要编
写.hbm.xml 文件.
编写完了配置文件之后,具体的使用步骤如下:
1) 读取并解析配置文件
2) 读取并解析映射信息,创建 SessionFactory
3) 打开 Session
4) 创建事务 Transaction
5) 持久化操作
6) 提交事务
7) 关闭 Session
8) 关闭 SessionFactory
2) 上面这些步骤是在单独使用 Hibernate 的步骤,如果通过spring 集成 Hibernate,则代
码更加的简单.例如使用 Spring 的AOP 声明式事务,则不需要手工开启和关闭
Session 及提交或回滚事务.66 / 100
166、 Hibernate 中实体对象的三种状态. (重点)
1) 瞬时状态
2) 持久状态
3) 游离状态
http://www.cnblogs.com/jyh317/p/3666566.html
167、 介绍一下 Hibernate 的二级缓存(重点)
按照以下思路来回答:
1)首先说清楚什么是缓存,(
2)再说有了 hibernate 的 Session 就是一级缓存,
即有了一级缓存,为什么还要有二级缓存,(
3)最后再说如何配置 Hibernate 的二级缓存.
1) 缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),
这个数据结构通常是或类似 Hashmap,当以后要使用某个对象时,先查询缓存中是否有
这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象
保存在缓存中,以便下次使用.
2) Hibernate 的 Session 就是一种缓存,我们通常将之称为 Hibernate 的一级缓存,当想使用
session 从数据库中查询出一个对象时,Session 也是先从自己内部查看是否存在这个对象,
存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部.由于 Session
代表一次会话过程,一个 Session 与一个数据库连接相关连,所以 Session 最好不要长时间
保持打开,通常仅用于一个事务当中,在事务结束时就应关闭.并且 Session 是 线程不安
全的,被多个线程共享时容易出现问题.通常只有那种全局意义上的缓存才是 真正的缓存
应用,才有较大的缓存价值,因此,Hibernate 的 Session 这一级缓存的缓存作用并不明显,
应用价值不大.Hibernate 的二级缓存就是要为Hibernate 配置一种全局缓存,67 / 100
让多个线程和多个事务都可以共享这个缓存.我们希望的是一个人使用过,其他人也可
以使用,session 没有这种效果.
3) 二级缓存是独立于 Hibernate 的软件部件,属于第三方的产品,多个厂商和组织都提供有
缓存产品,例如,EHCache 和 OSCache 等等.在 Hibernate 中使用二级缓存,首先就要在
hibernate.cfg.xml 配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自
己的配置文件,最后要配置 Hibernate 中的哪些实体对象要纳入到二级缓存的管理中.
明白了二级缓存原理和有了这个思路后,很容易配置起 Hibernate 的二级缓存.扩展知识:
一个 SessionFactory 可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据
库中的数据,当使用 Hibernate 的二级缓存后,注意不要有其他的应用或SessionFactory
来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致.
168、 Hibernate 的数据加载方式
1) 即时加载
2) 延迟加载
① 集合类型的延迟加载
② 实体对象的延迟加载
③ 属性延迟加载
区别:
1) 即时加载,当实体加载完后,立即加载其关联数据.
2) 延迟加载就是当真正需要数据的时候,才真正执行数据加载操作.
169、 Hibernate 如何延迟加载?(重点)
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正
需要数据的时候,才真正执行数据加载操作.在 Hibernate 中提供了对实体对象的延迟加载以
及对集合的延迟加载,另外在 Hibernate3 中还提供了对属性的延迟加载.下面我们就分别介绍
这些种类的延迟加载的细节.
1) 实体对象的延迟加载:<class name=”com.neusoft.entity.User” table=”user”
lazy=”true”></class>
2) 集合类型的延迟加载:<set name=”addresses” table=”address” lazy=”
true” />
3) 属性延迟加载:<property name=”resume” type=”java.sql.Clob” column=”
resume” lazy=”true”/>(需要对该实体类做字节码增强操作,否则无法生效)
4) 实体属性延时加载<many-to-one />
170、 Hibernate 中怎样实现类之间的关系?(如:一对多、多对多关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,68 / 100
我们程序中把所有的表与类都映射在一起,它们通过配置文件中的 many-to-one、
one-to-many、many-to-many.
最常用的关系是双向一对多关系,也即主从表之间的关系:
双向一对多关系中,在这表这边配置:
Set 集合,one-to-many
在从表这边配置 many-to-one
171、 如何优化 Hibernate?(重点)
1) 灵活使用单向一对多关联
2) 不用一对一、用多对一取代
3) 配置对象缓存,不使用集合缓存
4) 一对多集合使用 Bag,多对多集合使用 Set
5) 继承类使用显示多态
6) 表字段要少,表关联不要怕多,有二级缓存撑腰
7) 使用双向一对多关联,不是单向一对多
172、 说下 Hibernate 缓存机制(重点)
内部缓存在 Hibernate 中又叫一级缓存,属于应用事务级缓存二
级缓存:
1) 应用级缓存
2) 分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据
被系统频繁使用、非关键数据
3) 第三方缓存的实现
173、 hibernate 的工作原理
从以下四个方面来说明工作原理:
1) hibernate 如何连接数据库?
配置文件 Hibernate.cfg.xml 文件中定义了和数据库进行连接的信息,包括数据库方
言.jdbc 驱动.用户名.密码和 URL 等.Configuration 类借助 dom4j 的 xml 解析器进行 xml 的解
析设置环境,然后使用这些环境属性来生成 sessionfactory.这样 sessionfactory 生成的 session
就能够成功获得数据库的连接.
2) hibernate 如何进行数据库写操作?
当保存一个 pojo 持久化对象时,触发 Hibernate 保存事件监听器进行处理.Hibernate 通
过映射文件获得对象对应的数据库.表名以及属性对应的数据库列名,然后通过反射机制获
得持久化对象的各个属性,最终组织向数据库插入新对象的 SQL 的 insert 语句.调用69 / 100
session.save()保存数据后这个对象会被标识为持久化状态放在 session,当事务进行提交时
才真正执行insert 语句.
3) hibernate 如何从数据中载入对象?
当需要读取读取文件时,Hibernate 先尝试从 session 缓存中读取,如果 session 缓存数据
不存在或是脏数据并且配置了二级缓存,Hibernate 尝试从二级缓存中检索数据;否则
Hibernate 会根据对象类型·主键等信息组织select 语句到数据库中读取,再把select 结果组织
成对象返回.
4) hibernate 如何进行数据库查询操作?
Hibernate提供SQL、HQL、Criteria查询方式.HQL是其中运用最广泛的查询方式.用户使
用 session.createQuery()函数以一条 HQL 语句为参数创建 Query 查询对象后,Hibernate 会
使用 Anltr 库把 HQL 语句解析成 jdbc 可以识别的 sql 语句.如果设置了查询缓存,那么执行
Query.list()时,Hibernate 会先对查询缓存进行查询,如果查询缓存不存在,再使用 select 语
句查询数据库.
174、 cascade 属性和 inverse 属性的作用和区别?
1) Cascade 指的是关联对象之间的级联操作
2) Inverse 指的是关联关系的控制方向
175 hibernate 中 get( ) load( )区别(重点)
请注意如果没有匹配的数据库记录 , load( ) 方 法 可 能 抛 出 无 法 恢 复 的 异 常
( u n r e c o v e r a b l e exception). 如果类的映射使用了代理(proxy),load( )方法会返回
一个未初始化的代理,直到你调用该代理的某方法时才会去访问数据库. 若你希望在某对象中
创建一个指向另一个对象的关联,又不想在从数据库中装载该对象时同时装载相关联的那个
对象, 那么这种操作方式就用得上的了. 如果为相应类映射关系设置了 batch-size, 那么使
用这种操作方式允许多个对象被一批装载(因为返回的是代理,无需从数据库中抓取所有对
象的数据). 如果你不确定是否有匹配的行存在,应该使用 get( )方法,它会立刻访问数据库,
如果没有对应的行,会返回 null.
176、 Hibernate 支持两种查询方式:
1) HQL(Hibernate Query Languge)查询:是一种面向对象的查询语言.(应用较为广泛)
2) Criteria 查询又称为“对象查询“:用面向对象的方式将构造查询的过程做了封装.70 / 100
177、 为什么使用 HQL 查询?
HQL 是一种面向对象的查询语言,支持属性查询、参数查询、关联查询、分页查询等特
性,还支持统计函数.还有如下优点:
1) 使用 HQL 可以避免使用 JDBC 查询的一些弊端.
2) 不需要在编写繁复的 SQL 语句,我们将针对实体类及其属性进行查询.
3) 查询结果是直接存放到 List 中的对象,不需要再次封装.
4) HQL 还独立于数据库,对不同的数据库根据 Hibernate dialect 属性的配置自动生成不同的
SQL 语句执行
178、 使用 HQL 步骤以及 HQL 优化(重点)
步骤
1) 得到 session
2) 编写 HQL 语句
3) 创建 Query 对象
4) 执行查询,得到结果
优化:
1 避免 or 操作
2 避免使用 not
3 避免 like 的特殊形式
4 避免 having 子句
5 避免使用 distinct
179、 Spring 是什么?
Spring 是一个开源的控制反转(Inversion of Control,IoC)和面向切面(AOP)的容器框
架.它的主要目的是使现有技术更加易用,推荐编码最佳实现,从而简化企业开发.
Spring 目前已经发展为一个功能丰富而易用的集成框架,其核心是一个完整的控制反转
(IoC)的轻量级容器,用户可以使用他建立自己的应用程序.在容器上,Spring 提供了大量实
用的服务.将很多高质量的开源项目集成到统一的框架上.
Spring 致力于 Java EE 应用的各种解决方案,而不是仅仅专注于某一层面的方案.可以
说,Spring 是企业应用开发的“一站式”选择,Spring 贯穿表示层、业务层、持久层.然
而,Spring 并不想取代那些已有的框架,而以高度的开发性与他们无缝整合.
71 / 100
180、 使用 Spring 的好处?(重点)
在我看来,在项目中引入Spring 可以带来以下的好处:
1) 降低组件之间的耦合度,实现软件各层之间的解耦合;
2) 可以使用容器提供的众多服务,如:事务管理服务,消息服务等等;
3) 容器提供单例模式支持,开发人员不再需要自己编写代码实现;
4) 容器提供了 AOP 技术,利用它很容易实现如权限拦截等功能;
5) 容器提供了众多辅助类,使用这些类能够加快应用的开发;
6) Spring 对于主流的应用框架提供了集成支持.
181、 什么是依赖,什么是依赖注入? (重点)
依赖:两个元素中一个定义发生改变则会引起另一个元素发生改变,则称这两个元素之
间存在依赖关系.
控制反转(IoC):在传统的程序设计过程中,都是在应用内部创建及维护依赖的对象. 控
制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负
责的.这样控制权就由应用转移到外部容器,控制权的转移就是控制反转.
依赖注入:是指 在运行期,由外部容器动态地将依赖对象注入到组件中.
依赖注入让 Bean 与Bean 之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起.
182、 Spring 如何实现 IOC 容器功能(重点)
Spring 设计的核心是org.springframework.beans 包,它的设计目标是与JavaBean 组件一
起使用.这个包通常不是由用户直接使用,而是由服务器将其作其他多数底层中介.下一个最
高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对
象.BeanFactory 也可以管理对象之间的关系.
BeanFactory 支持两种对象模型
1) 单态 模型提供了具有特定名的对象的共享实例,可以在查询时对其进行检
索.Singleton 是默认的也是最常用的对象模型.对于无状态服务对象很理想.
2)原型 模型确保每次检索都会创建单独的对象.在每个用户都需要自己的对象时,
原型模型最适合.
bean 工厂的概念是 Spring 作为 IOC 容器的基础.IOC 将处理事情的责任从应用程序转移
到框架.Spring 框架使用 JavaBean 属性和配置数据来指定必须设置的依赖关系.
183、 什么是 AOP(Aspect-oriented programming 面向切面编程) (重点)
面向方面编程也叫面向切面编程,即 AOP,是一种编程技术,它允许程序员对横切关注点
或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化.AOP 的核心构造是方72 / 100
面,它将那些影响多个类的行为封装到可重用的模块中.
AOP 和 IOC 是补充性的技术,它们都是运用模块化方式解决企业应用程序开发中的复杂
问题.在典型的面向对象的开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能
实现日志功能.在AOP 方式中,,可以反过来将日志服务模块化,并以声明的方式将它们应用到
需要的日志组件上.当然,优势就是 Java 类不需要知道日志服务的存在,也不需要知道日志服
务的存在,也不需要考虑相关的代码.所以,用 Spring AOP 编写的应用程序代码是松散耦合的.
AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中.
184、 Spring AOP 原理(重点)
Spring 采用 JDK 动态代理模式来实现 AOP 机制.
Spring AOP 采用动态代理的过程:
(1) 将切面使用动态代理的方式动态织入到目标对象(被代理类),形成一个代理对
象;
(2) 目标对象如果没有实现代理接口,那么 Spring 会采用 CGLib 来生成代理对象,
该代理对象是目标对象的子类;
(3) 目标对象如果是 final 类,并且也没实现代理接口,就不能运用 AOP.
185、 AOP 核心概念
1、Aspect(切面)
切面,是对交叉业务逻辑的统称.
2、Joinpoint(连接点)
连接点,指切面可以织入到目标对象的位置(方法,属性等).
3、Advice(通知)
通知,指切面的具体实现.
4、Pointcut(切入点)
切入点,指通知应用到哪些类的哪些方法或属性之上的规则.
5、Introduction(引入)
引入,指动态地给一个对象增加方法或属性的一种特殊的通知.
6、Weaving(织入)
织入,指将通知插入到目标对象.
7、Target(目标对象)
目标对象,指需要织入切面的对象.
8、Proxy(代理对象)
代理对象,指切面织入目标对象之后形成的对象. 73 / 100
186、 Spring 自动装配的优缺点(重点)
优点
1) 自动装配能显著减少配置的数量.不过,采用 bean 模板(见这里)也可以达到同
样的目的.
2) 自动装配可以使配置与 java 代码同步更新.例如,如果你需要给一个java 类增加
一个依赖,那么该依赖将被自动实现而不需要修改配置.因此强烈推荐在开发过程中采用自动
装配,而在系统趋于稳定的时候改为显式装配的方式.
缺点
1) 尽管自动装配比显式装配更神奇,但是,正如上面所提到的,Spring 会尽量避免
在装配不明确的时候进行猜测,因为装配不明确可能出现难以预料的结果,而且 Spring 所管
理的对象之间的关联关系也不再能清晰的进行文档化.
2) 对于那些根据 Spring 配置文件生成文档的工具来说,自动装配将会使这些工具
没法生成依赖信息.
187、 Spring 依赖检查机制
Spring 的依赖检查能够帮助检查在一个Bean 上的所有特定类型属性是否都已经设置依
赖注入.只要在 dependency-check 的属性中指定依赖检查模式就可以了.
依赖检查的几种模式:
1)none:不执行任何依赖检查.任何属性都可以保持未设置状态,为默认;
2) simple:检查任意简单类型(原始(例如 int、double 等,还包括 String 类型)和集合
类型)的属性是否设置,未设置将抛出UnsatisfiedDependencyexception 异常;
3)objects:检查任意对象类型属性是否设置,未设置将抛出
UnsatisfiedDependencyexception 异常;
4) all:检查任意类型的属性是否设置,未设置将抛出 UnsatisfiedDependencyexception 异
常.
188、 实际开发过程中为什么拆分 Spring 配置文件?
1)
、当项目规模大的时候,配置文件可读性、可维护性差,庞大的 Spring 配置文件难
以阅读.
2)
、团队开发时,多人修改同一配置文件容易发生冲突,降低开发效率.
189、 采用何种策略拆分 Spring 配置文件?
1)
、如每个开发人员负责一模块采用公用配置(包含数据源、事务等)+每个系统模
块一个单独配置文件(包含 dao、service 及 action)形式
2)
、如采用分层负责或者 DAO 配置代码由代码生成工具生成时,我们采用公用配置(包
含数据源、事务等)+ DAO Bean 配置 + 业务逻辑 Bean 配置 + Action Bean 配置形式74 / 100
190、 Spring 对持久层的支持:(重点)
① JDBC,② O/R Mapping(Hibernate,TopLink 等)
Spring 对持久层支持采用的策略:
1、Spring 对持久层“不发明重复的轮子”,即没有重新实现新的持久层方案,对现有持久
层方案做封装,更利于使用.
2、采用DAO 模式
3、提供了大量的模板类来简化编程(HibernateDaoSupport,JdbcTemplate 等)
4、重新设计了一套完善的异常体系结构
① 类型丰富,细化异常类型
② 全都是运行时异常(RuntimeException)
191、 Spring 的事务机制(重点)
Spring 支持声明式事务.声明式事务管理采用非侵入式的设计,可以分离业务逻辑和事
务管理逻辑,具有良好的适应性.
Spring 使用事务服务代理和事务管理器(如 HibernateTransactionManager)来支持事务
服务.
相对于 EJB 规范,Spring 对事务的边界多了一种嵌套事务(PROPAGATION_NESTED).
PROPAGATION_NESTED 含义:
如果客户端启动了事务 T1,那么 Bean 启动一个嵌套在 T1 中的子事务T2;
如果客户端没有启动事务,那么 Bean 会启动一个新的事务,类似于 REQUIRED_NEW
192、 什么是声明式事务.
用在 Spring 配置文件中声明式的处理事务来代替硬代码式的处理事务.这样的好处是,事务
管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也
应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事
务管理策略的话,也只需要在定义文件(即配置文件)中重新配置即可;在不需要事务管理的
时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护
起来极其方便.
193、 Spring 如何使用声明式事务管理 Hibernate 的事务
1)配置 Hibernate 的事务管理器.
2)定义事务通知,需要指定一个事务管理器
3)使用 AOP,定义哪些方法应用这些规则
194、 SpringMVC 工作机制?(重点)
1) spring mvc 请所有的请求都提交给DispatcherServlet,它会委托给应用系统
的其他模块负责对请求进行真正的处理工作.75 / 100
1) DispatcherServlet 查询一个或多个 HandleMapping,找到处理请求的
Controller
2) DispatchServlet 请求提交到目标Controller
3) Controller 进行业务逻辑处理后,会返回一个 ModelAndView
4) Dispatcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对
象指定的视图对象
5) 视图对象负责渲染返回给客户端.
195、 什么是 POJO 类(重点)
使用 POJO 名称是为了不和 EJB 混淆起来, 而且简称比较直接. 其中有一些属性及其
getter setter 方法的类,有时可以作为value object 或 dto(Data Transform Object)来使用.当然,
如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection 之
类的方法.
错误的认识:(了解一下错误的说法,主要是需要记住正确的说法)
POJO 是这样的一种“纯粹的”JavaBean,在它里面除了 JavaBean 规范的方法和属性没有
别的东西,即 private 属性以及对这个属性方法的 public 的 get 和 set 方法.我们会发现这样
的 JavaBean 很“单纯”,它只能装载数据,作为数据存储的载体,而不具有业务逻辑处理
的能力.
真正的意思:(正确意义)
POJO = “Plain Old Java Object”,是 MartinFowler 等发明的一个术语,用来表示 普通的
Java 对象,不是JavaBean, EntityBean 或者 SessionBean.POJO 不但当任何特殊的角色,也不
实现任何特殊的 Java 框架的接口如,EJB, JDBC 等等.即 POJO 是一个简单的普通的 Java 对
象,它包含业务逻辑或持久逻辑等,但不是 JavaBean、EntityBean 等,不具有任何特殊角色和
不继承或不实现任何其它 Java 框架的类或接口.
196、 你熟悉的应用服务器有哪些?
BEA WebLogic Server,
IBM WebSphere Application Server,
Oracle9i Application Server, jBoss,
Tomcat
197、 什么是 Web 服务(web service)
Web 服务是一种可以用来解决跨网络应用集成问题的开发模式,是基于网络的、分布式的模
块化组件,它执行特定的任务遵守具体的技术规范,这些规范使得Web Service 能与其他兼容
的组件进行互操作.设计WEB 服务时应该把握的几个关键性原则:松散耦合、定义良好的接口、
合适的粒度.web 服务体系结构的三种角色是:服务提供者、服务代理机构、服务使用者76 / 100
198 Web 服务的优点有哪些?(重点)
1) 封装性
Web 服务是一种部署在Web 应用上的组件,具备良好的封装性.对使用者而言,仅看到服
务描述,而该服务的具体实现、运行平台都是透明的,调用者无须关心,也无法关
心.Web 服务作为整体提供服务.
2) 松散耦合
当 Web 服务的实现方式发生改变时,调用者是无法感受到这种改变的.对调用者而言,只
要服务实现的接口不发生变化,具体实现的改变时完全透明的.
使用标准协议:
Web 服务所有的公共协议都是用标准协议描述、传输和交换.这些标准协议在各种平台
上完全相同.
3) 高度整合的能力
由于Web 服务采用简单、易理解的标准Web 协议作为通信协议,完全屏蔽了不同平台的
差异,无论是 CORBA、DOM 还是 EJB,都可以通过这种标准协议进行互操作,实现系统的
最高可整合性.
4) 高度的开放性
Web 服务可以与其他的 Web 服务进行交互,具有语言和平台型,支持 CORBA,EJB,DCOM
等多种组件标准,支持各种通讯协议,如 HTTP、SMTP 和 RMI 等.
199、 Java 领域中的主流框架有哪些?
MVC 框架:Struts1,、Struts2、SpringMVC
ORM 框架:Hibernate、TopLink、ibatis、MyBatis
Ajax 框架:DWR、JQuery
其它框架:Spring、Xfire、SSH(spring,hibernate,struts 三个框架的集成)
Hibernate:
是一个优秀的持久化框架,负责简化将对象数据保存到数据库中,或从数据库中读取数
据并封装到对象的工作.
Struts2:
以 webwork 优秀的设计思想为核心,吸收了Struts1 框架的部分优点,提供了一个更加整
洁的 MVC 设计模式实现的 Web 应用程序框架;它引入了几个新的框架特性:从逻辑中分离
出横切关注点的拦截器,减少或者消除配置文件,贯穿整个框架的强大表达式语言,支持可
变更和可重用的基于 MVC 模式的标签 API.
Spring:
Spring 的出现改变了 Java 世界,它的目标是使现有的 JavaEE 技术更容易使用和促进良
好的编程习惯.它是一个轻量级的框架,渗透了 JavaEE 技术的方方面面,它主要作为依赖注
入容器和 AOP 实现存在.还提供了声明式事务,对 DAO 层的支持等简化开发的功能.Spring
还可以很方便的与Struts2.hibernate 等框架集成.
77 / 100
200、 如何实现自定义 MVC 框架?
MVC 是一种流行的软件设计模式,代表一种多层的应用程序实现方式,MVC 模式将应用程
序实现分为三个不同的基本部分:模型层 M、视图层 V、控制器 C
自定义 MVC 的主要实现核心就是: 定义一个 Servlet 来控制模型层 M 和视图层 V 的相
互调用
实现思路
例子:如果我们做一个登录请求 http://localhost:8080:projectName/login.action
1) 客户端向服务器发送这样的一个登录请求时,自定义MVC 框架的servlet 主控制器就
会对请求的 url 进行解析得到客户端请求的 Action 名称:“login”
2) servlet 主控制器就根据解析得到的 Action 名称“login”,反射实例化对应的
LoginAction 业务控制器
3) LoginAction 在执行其execute 方法后返回对应的导航信息 result
4) Servlet 主控制器根据result 中的信息转发或重定向到对应的视图(JSP)
实现流程:
1) 编写对应的 XML 配置文件,文件名可以自定义,配置内容包括:
a) Action 的名称ActionName 和 Action 类的全限定名ActionClassName
b) Action 对应的result 信息,包括是转发还是重定向和对应的视图组件(jsp)路
2) 在 Web.xml 中配置主控制器(ActionServlet),对应的拦截路径为*.action,并把配
置文件的位置用初始化参数配置给 Servlet 主控制器
3) 初始化主控制器 Servlet,解析 MyMVC.xml 配置文件,把配置文件中的信息保存到
ActionMapping 对象中
4) 创建一个Action 接口,在 Action 接口中定义一个execute( )方法.让所有的Action 实
现这个接口
201、 Struts 2 中如何解决中文乱码问题?(重点)
在配置文件中定义如下常量值配置:
<constant name=struts.i18n.encoding value=UTF-8/>
注意:只能解决 post 请求的乱码问题,针对 get 请求的乱码和 jsp 中的处理方式一致(需
编写相应的代码处理).
202、 Struts 2 配置文件中的 package 元素与 Java 中的包有什么异同之处?
答:相同点:都是基于方便管理的理念,Struts2 配置文件中的 package 为了更好的管理
Action 配置项, 例如区分不同模块中定义的同名的Action 配置,Java 中的包用于更好的管
理类,例如不同包中定义的同名的类
不同点:
1) package 是用于管理Action,而 Java 中的包用于管理 class 类;
2) package 可以被继承,减少 XML 中的冗余配置,而 Java 中的包没有继承的概念;78 / 100
203、 Struts 2 开发 Action 有几种模式,Action 的作用是什么?(重点)
有三种模式:
1)实现 Action 接口
2)继承 ActionSupport 类
3)普通的 Java 类 (体现 Struts2 的设计理念:表示 action 是非侵入设计,我的 Acton
不需要框架的支持,与框架减耦,可以脱离框架而存在(
Struts2 的设计理念))
Action 的作用:
1)封装工作单元
2)数据转移的场所
3)返回相应视图结果的字符串
204、 在 struts.xml 中可以不为 action 指定 class 属性吗?struts2 配置中有哪些默认的
属性?
可以,如果没有为 action 指定 class,默认是 com.opensymphony.xwork2.ActionSupport
默认属性:
如果没有为 action 指定 class 属性,则默认值是
com.opensymphony.xwork2.ActionSupport
如果没有为 action 指定 method 属性,则默认值是 execute( )
注意:ActionSupport 的 execute 方法里面就一句话 return "success";
如果没有指定 result 的 name 属性,则默认值是 success
如果没有指定 result 的 type 属性,则默认值是 dispatcher
action 中默认都有一个拦截器的引用,即:<interceptor-ref name="defaultStack">;
注意:
1)一旦我们为该包中的某个 action 显式指定了某个拦截器,则默认拦截器不会
起作用,所以此时要显式的引进默认的拦截器;
2)每个包只能指定一个默认拦截器,每个默认拦截器只针对当前包下有效.
205、 简要阐述 struts2 的执行流程. (重点)
Struts 2 框架本身大致可以分为 3 个部分:核心控制器 FilterDispatcher、业务控制器
Action 和用户实现的企业业务逻辑组件.核心控制器 FilterDispatcher 是 Struts 2 框架的基础,
包含了框架内部的控制流程和处理机制.业务控制器Action 和业务逻辑组件是需要用户来自
己实现的.用户在开发Action 和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控
制器FilterDispatcher 来使用. Struts 2 的工作流程相对于Struts 1 要简单,与WebWork 框架基
本相同,所以说 Struts 2 是 WebWork 的升级版本.
基本简要流程如下:
1、客户端浏览器发出 HTTP 请求.
2、根据 web.xml 配置,该请求被 FilterDispatcher 接收. 79 / 100
3、根据struts.xml 配置,找到需要调用的Action 类和方法, 并通过IoC 方式,将值注入给
Aciton.
4、Action 调用业务逻辑组件处理业务逻辑,这一步包含表单验证.
5、Action 执行完毕,根据 struts.xml 中的配置找到对应的返回结果result,并跳转到相应
页面.
6、返回 HTTP 响应到客户端浏览器
206、 Struts 2 结构体系的运行原理(重点)
1) 由容器创建 HttpServlet 请求,这个请求经过一系列的过滤器,最终到 Struts 2 的
核心过滤器(FilterDispatcher);
2) 核心过滤器解析请求的 URL 获得一个ActionMapper 实例,如果不存在,就抛出
请求路径无效异常;
3) 核心过滤器根据 ActionMapper 生成一个ActionProxy(Action 代理类)
4) ActionProxy从配置管理 ConfigurationManager 获取struts.xml的配置(struts.xml
中配置了每个 Action 所需通过的拦截器)
5) ActionProxy 根据 struts.xm 的配置 生成一个 ActionIncocation(action 调度者)80 / 100
6) ActionIncocation 就会以递归的方式顺序调用配置中的 Interceptor(拦截器),
执行顺序(
1、2、3)
7) ActionIncocation 调用完所有的拦截器后 就进入我们的Action
8) Action 执行完后返回一个result
9) 使用result 的信息生成对应的 Template(模板)视图(
jsp、FreeMarKey、Velocity
等)
10) ActionIncocation 再次反向调用所有配置的 Intercepto(r
2、1)
拦截器)
,执行顺序(
3、
11) 执行完所有的 interceptor(拦截器)后就会生成 Http 响应信息
12) Http 响应信息再通过过滤器转给客户端
207 Struts 2 核心接口和类
1) ActionMapper
ActionMapper 提供了在请求和 Action 调用请求之间的映射.ActionMapper 根据请求的
URI 来查找是否存在对应的 Action 调用请求,如果有则返回一个描述 Action 映射的
ActionMapping 对象;没有找到匹配的 Action 调用返回 null.
2) ActionMapping
ActionMapping 本质上是一个数据传输对象.它保存了调用Action 的映射信息,其中必须
保存 Action 的命名空间的信息和 name 属性信息
3) ActionProxy
ActionProxy 在XWork 和真正的 Action 之间充当代理,在执行Action 的过程中,因为使
用代理而非直接操纵对象,所以可以在 Action 执行前后执行额外的操作.
ActionProxy 创建了ActionInvocation 对象
4) ActionInvocation
ActionInvocation 表示Action 的执行状态,它保存拦截器(按配置顺序),Action 的实
例.ActionInvocation 是由ActionProxy 创建,通过调用 invoke( ) 方法开始 Action 的执行,执行
的顺序为按配置顺序执行拦截器,拦截器执行完毕后执行Action,Action 执行结束返回结果字
符串,匹配相应的 Result 后,再一次执行拦截器.
5) Inserceptor(拦截器)
拦截器是一种可以在请求处理前或者之后执行的Struts2 组件.拦截器是Struts2 的重要
特性,Struts2 框架的绝大多数功能都是通过拦截器来完成的81 / 100
208、 说说对 Struts 2 拦截器的理解?(重点)
Struts2 拦截器是在访问某个 Action 或 Action 的某个方法,字段之前或之后实施拦截,并
且 Struts2 拦截器是可插拔的,拦截器是AOP的一种实现.Struts2 拦截器栈就是将拦截器按
一定的顺序联结成一条链.在访问被拦截的方法或字段时,Struts2 拦截器链中的拦截器就会按
其之前定义的顺序被调用.
209、 拦截器工作原理
拦截器的工作原理:
Struts2 拦截器是一种 AOP 设计思想的体现,以链式执行,对真正要执行的方法
(execute)进行拦截,首先按照 Action 配置的拦截器顺序依次执行相应的拦截器,调用完后
再执行 Action 及 result 跳转,然后再次执行拦截器(与先前调用相反的顺序),在此链式
的执行过程中,任何一个拦截器都可以直接返回,从而终止余下的拦截器或 Action 及reuslt
的执行.
210、 Struts2 内置的拦截器
1) Params 拦截器
Params 拦截器提供了框架必不可少的功能,将请求中的数据设置到Action 中的属性
2) staticParams 拦截器
staticParams 拦截器是将在配置文件中通过 action 元素的子元素 param 设置的参
数设置到对应的Action 的属性中82 / 100
3) servletConfig 拦截器
servletConfig 拦截器提供了一种将源于Servlet API 的各种对象注入到Action 当中
的简洁方法.Action 必须实现对应的接口.servletConfig 拦截器才能将对应的Servlet 对象
注入到 Action 中
4) fileUpdload 拦截器
fileUpload 拦截器将文件和元数据从多重请求(multipart/form-date)转换为常规
的请求数据,以便能将他们设置在对应的 Action 属性上
5) validation 拦截器
validation 拦截器执行数据验证
6) workflow 拦截器
workflow 拦截器提供当数据验证错误时终止执行流程的功能
7) exception 拦截器
3) exception 拦截器捕获异常,并且能够根据类型将捕获的异常映射到用户自定
义的错误页面.该拦截器应该位于所定义的所有拦截器的第一位.
211、 Struts2 自定义拦截器?(重点)
1) 实现接口 com.opensymphony.xwork2.interceptor.Interceptor.该接口提供了三个
方法,如下所示:
➢ init( ):该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法,对于
每个拦截器而言,此方法只执行一次.
➢ destroy( ):该方法跟 init( )方法对应.在拦截器实例被销毁之前,系统将回调该方法
➢ intercept(Actioninvocation invocation) throws Exception:该方法是用户需要
实现的拦截动作.该方法会返回一个字符串作为逻辑视图
2) 继承 com.opensymphony.xwork2.interceptor.AbstractInterceptor 类是更简单的
一种实现拦截器的方式,Abstractinterceptor 类提供了 init( )和 destroy( )方法的空实现,
这样,我们只要实现 intercept( )方法,就可以创建自己的拦截器
212、 struts2 如何防止用户表单重复提交? (重点)
第一步:在表单中加入<s:token />
第二步,使用 token 栏截器,定义 invalid.token 结果集 83 / 100
213、 Struts 2 中如何创建自定义类型转换器
要创建自定义类型转换器类,需要编写一个类来继承Struts 2 提供一个自定义类型转换
器基类,org.apache.struts2.util.StrutsTypeConverter.这是个抽象类,定义了两个抽象
方法,用于不同的转换方向,分别为:
public Object convertFromString(Map context,String [] values,Class toType):
将一个或多个字符串值转换为指定的类型.
public String convertToString(Map context,Object object):将指定对象转化为字
符串.
214、 Struts2 国际化资源文件的范围
1) 全局资源文件
所有包的所有 Action 类都可以访问
导致资源文件变得非常庞大臃肿,不便于维护
2) 包范围资源文件
对应包下创建 package_language_country.properties
处于该包及子包下的 action 才可以访问该文件
3) Action 范围资源文件
命名格式 ActionClassName_language_country.properties
只有单个 Action 可以访问
215、 OGNL EL 有什么异同?(重点)
相同点:OGNL 和EL 都是表达式语言,用来获取相应对象或其属性的值
差异点
1) 在获取集合中对象的方式不同:
EL 表达式是 jsp 规范的标准,可以直接在 jsp 页面上使用
OGNL 是 Strut2 框架用来解决视图输出内容而集成的技术,在页面上只能使用 Struts2 标
签输出内容,不能直接使用
2) 是否可以调用方法:OGNL 可以直接调用对象中的方法,EL 表达式只能输出对象的属
性(其实是调用对象提供的 getter 方法)
3) 取值的方式不同:EL 表达式使用${XXXX}方式取值
ONGL 取值的方式是:
如果是根元素:<s:property value="user.name" />
如果非根元素: <s:property value="#request.user.naem" />
还有就是:<s:property value="%{#session.user.name}" />
216、 OGNL 中访问根元素和非根元素有什么区别?
区别:访问根对象,直接书写对象的属性,访问其他非根对象必须使用“#”前缀
Struts2 中集成的OGNL 可以直接访问Action 对象中的属性的原因是:Action 是ValueStack84 / 100
的栈顶元素,ValueStack 是OGNL 的根元素,而ValueSatck 的栈顶元素(也就是 Action 对象)
享有了其根元素的所有特性.
217 OGNL Struts 2 中的作用(重点)
1) 表达式语言
将表单或 Struts 2 标签与特定的Java 数据绑定起来,用来将数据移入、移出框架
2) 类型转换
数据进入和流出框架,页面中数据的字符串版本和 Java 数据类型之间都发生转
218、 值栈 ValueStack 的原理与生命周期?
1)ValueStack 贯穿整个 Action 的生命周期,保存在request 域中,所以 ValueStack 和
request 的生命周期一样.当 Struts2 接受一个请求时,会迅速创建 ActionContext,
ValueStack,action.然后把 action 存放进ValueStack,所以 action 的实例变量可以被
OGNL 访问. 请求来的时候,action、ValueStack 的生命开始,请求结束,action、
ValueStack 的生命结束;
2)action 是多例的,和 Servlet 不一样,Servelt 是单例的;
3)每个 action 的都有一个对应的值栈,值栈存放的数据类型是该 action 的实例,以及该
action 中的实例变量,Action 对象默认保存在栈顶;
4)ValueStack 本质上就是一个 ArrayList;
5)关于 ContextMap,Struts 会把下面这些映射压入 ContextMap 中:
parameters : 该 Map 中包含当前请求的请求参数
request : 该 Map 中包含当前 request 对象中的所有属性
session : 该 Map 中包含当前 session 对象中的所有属性
application : 该 Map 中包含当前 application 对象中的所有属性
attr : 该 Map 按如下顺序来检索某个属性: request, session,
application
6)使用 OGNL 访问值栈的内容时,不需要#号,而访问request、session、application、attr
时,需要加#号;
7)注意: Struts2 中,OGNL 表达式需要配合 Struts 标签才可以使用.如:<s:property
value="name"/>
8)
在 struts2 配置文件中引用 ognl 表达式 ,引用值栈的值 ,此时使用的"$",而不是#或
者%;
219、 权限管理怎么做的,用到了几张表? (重点)
权限管理这里我们用到了五张表,三张主表 user(用户表),role(角色表),privilege(权限表),两张85 / 100
关系表,user-role,privilege-role, 关系表是为了解决 user 与 role、privilege 与 role 之间的多对
多的关系 ,user 可以有若干个 role,role 可 以给很 多 user 使 用 ,role 可以有若干个
p r i v i l e g e , p r i v i l e g e 可以赋给很多role.
220、 电商项目里 redis 用到了哪些地方? (重点)
1,redis 生成商品 ID.
2,页面查询条件的缓存,(好处:页面初始化数据快速加载,提升用户体验度)
3,redis 集群(为了承载更大的数据量和redis 服务器的稳定,我们使用的redis-Cluster 方案,采用
了 6 台节点(服务器)进行同时使用.三台主机,三天客机,如果主机发生宕机(挂掉)的情况,那么
客机直接戴特使用,主机恢复后,主机机会继续使用)
4,session 共享,(因为我们的项目服务器架构方案是集群,并且是通过Nginx 进行转发,所以我们
的用户 session 需要使用redis 来进行共享,缓存 session 信息)
5,购物车在登录的情况下,用的是 redis 来存储购物车.非登录的情况下,使用的 cookie 来缓存
购物车(cookie 保存时间一个月).
221 freemarker 静态页面怎么做的, jsp 动态页面的区别? (重点)
因为商品详情页面访问量较大,为了节省网络资源,提高用户体验,因此我们使用 freeMarker
技术将商品详情页静态化
Freemarker 使用步骤:
1.创建 Configuration 对象
Configuration configuration = new Configuration( );
2.设置模版存放的目录
String
templateUrl =
"F:/qnsport2017/parent/qnsport-console/src/main/webapp/WEB-I
NF/template/";
3.加载模版目录和设置读取模版的编码方式
configuration.setDirectoryForTemplateLoading(new File(templateUrl));
configuration.setDefaultEncoding("utf-8");
4.获取模版对象
Template
template = configuration.getTemplate("temp.html");
5.创建数据
Map rootMap = new HashMap( );
rootMap.put("name", "hello freemaker");
6.创建输出文件
Writer out = new FileWriter("C:/freemaker/demo1.html");
7.通过模版输出数据
template.process(rootMap, out);
8.关流
out.close( );
静态页面与 jsp 动态页面的区别:
静态页面就是把页面上所有东西都设定好,写死的,然后放上去,不管是谁在任何时候看到的
页面内容都是一样的,一成不变(除非手动修改页面内容).静态 html 页面文件,可以直接用本地
的浏览器打开.
动态页面的内容一般都是依靠服务器端的程序来生成的,不同人,不同时候访问页面,显示的86 / 100
内容都可能不同.网页设计者在写好服务器端的页面程序后,不需要手工控制,页面内容会按照页
面程序的安排自动更改变换.
222、 讲讲购物车的设计方案. (重点)
企业级购物车设计方案,面向对象的设计模型,购物车包含购物项,购物项包含最小销售单元
sku(sku=颜色*尺码),在非登录的情况下我们购物车是存储在 cookie 里,保存时间为一个月,在
登录的情况下,使用redis 来存储购物车,使用redis 的 list 来存储购物车,hash 来存储购物项.
223 FastDFS 如何搭建的?怎么用的? (重点)
搭建:
1,配置基本环境2,安装Tracker 服务3,配置Tracker 服务4,安装storage 服务5,配置storage
服务,6 测试.
参考网址:详细的安装步骤以及 jar 网址: http://www.linuxidc.com/Linux/2016-04/130371.htm
使用:
1,先启动 fastDFS(代码 . fastDFS.sh)
2,查看 FastDFS 文件系统的服务
3, 查看 trackerd 进程是否启动成功,trackerd 进程是保存图片的存储路径( 代码 ps
aux|grep trackerd)
4,查看 storaged 进程是否启动成功,storaged 进程是用来保存图,以及图片的副本.(代码
ps aux|grep storage)
224 ArrayList,HashMap,HashSet 初始化容量为多少?如果超出自己扩容多少?
ArrayList 初始化容量为:10,如果超出,扩容为原容量的 0.5 倍+1,第一次扩容为 16
HashMap 初始化容量为:16,如果超出,扩容为原容量的 1 倍,第一次扩容为 32
HashSet 初始化容量为: 16,如果超出,扩容为原容量的 1 倍,第一次扩容为 32
225、 说说 redis 的五种数据类型(重点)
List(列表),Hash(哈希),String(字符串),Set(集合),Zset(sorted set,有序集合)在项目中,我们前三者
用的相对较多.
226 Solr 在项目里用到了哪些地方? (重点)
1,因为电商网站的检索,我们不可能去用一个 like 模糊查询,我们使用的 solr 用来缓存商品上
架数据.
2,使用了第三方的 IK 分词器进行分词,配置扩展字典和停词字典.
3,对查询的条件进行高亮显示.
4,为了维护项目的稳定性,以及提供更好的服务能力,我们这里 solr 使用的是集群方案,并且在
solr 集群方案下我们使用的是大数据的zookeeper 框架来作为服务器中间件,对 solr 服务器进
行监听,给客户端提供服务.
追问:那你跟我说说zookeeper
因为 solr 集群依赖的是 zookeeper 服务中间件,所以就算宕机,也不会影响我们整个服务的使
用,然后 zookeeper 也是使用的集群方案.三台机器进行的集群,根据 zookeeper 集群的特点,一87 / 100
台 leader,两台 follower.
227、 电商项目高并发这块,你们怎么做的? (重点)
在高并发处理这方面,我们使用的是 Nginx 服务器来做负载均衡和反向代理.并且 Nginx 我们
也是搭建的两台服务器,并且使用 keepalived 来维护Nginx 的高可用(HA 机制)
228、 使用过 log4j ?log4j 中有哪些优先级?
使用过.
1.static Level DEBUG :
DEBUG Level 指出细粒度信息事件对调试应用程序是非常有帮助的.
2.static Level INFO
INFO level 表明 消息在粗粒度级别上突出强调应用程序的运行过程.
3.static Level WARN
WARN level 表明会出现潜在错误的情形.
4.static Level ERROR
ERROR level 指出虽然发生错误事件,但仍然不影响系统的继续运行.
5.static Level FATAL
FATAL level 指出每个严重的错误事件将会导致应用程序的退出.
另外,还有两个可用的特别的日志记录级别:
1.static Level ALL
ALL Level 是最低等级的,用于打开所有日志记录.
2.static Level OFF
OFF Level 是最高等级的,用于关闭所有日志记录.
日志记录器(Logger)的行为是分等级的:
分为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL 或者自定义的级别.
一般我们只使用这四种,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG.
229、 实现多线程的方法? (重点)
第一种是继承 Thread 类,实现 run( )方法,不可以抛异常,没有返回值第
二种是实现Runnable 接口,实现 run( )方法,不可以抛异常,无返回值代
(1)继承 Thread 类,重写run 函数
创建:
class xx extends
Thread{ public void
run( ){
Thread.sleep(1000) //线程休眠1000 毫秒,sleep 使线程进入Block 状态,并释放资
}}
开启线程:88 / 100
对象.start( ) //启动线程,run 函数运行
(2)实现 Runnable 接口,重写 run 函数
开启线程:
Thread t = new Thread(对象) //创建线程对象
t.start( )
(3)实现 Callable 接口,重写 call 函数
Callable 是类似于 Runnable 的接口,实现 Callable 接口的类和实现 Runnable 的类都
是可被其它线程执行的任务.
Callable 和Runnable 有几点不同:
①Callable 规定的方法是 call( ),而 Runnable 规定的方法是run( ).
②Callable 的任务执行后可返回值,而Runnable 的任务是不能返回值的
③call( )方法可抛出异常,而 run( )方法是不能抛出异常的.
④运行 Callable 任务可拿到一个 Future 对象,Future 表示异步计算的结果,它提供了
检查计算是否完成的方法,以等
待计算的完成,并检索计算的结果.通过 Future 对象可了解任务执行情况,可取消任
务的执行,还可获取任务执行的结果
230、 手写 MySQL,Oracle 分页(重点)
MySQL:
常用分页:select * from content order by id desc limit 0,10;
Limit 是 MySQL 中特有的分页语法
举例:
Select * from tableName limit 5; //返回前五行
Select * from tableName limit 0,5;//同样也是返回前五行
Select * from tableName limit 5,10;//返回 6-15 行
Oracle:
--分页查询一
select * from (select a1.*,rownum rn from (select * from student) a1 where rownum <=5)
where rn>=2;
--分页查询二
select a1.* from (select student.*,rownum rn from student where rownum <=5) a1 where
rn >=3;
--分页查询三
select a1.* from (select student.*,rownum rn from student) a1 where rn between 3 and 5;
231、 手写一个单例(重点)
1,枚举写法
public enum Singleton
{ INSTANCE;
public void whateverMethod( ) {
}89 / 100
}
2,懒汉(线程不安全)
public class Singleton {
private static Singleton instance;
private Singleton ( ){}
public static Singleton getInstance( )
{ if (instance == null) {
instance = new Singleton( );
}
return instance;
}
}
3,懒汉(线程安全)
public class Singleton {
private static Singleton instance;
private Singleton ( ){}
public static synchronized Singleton getInstance( )
{ if (instance == null) {
instance = new Singleton( );
}
return instance;
}
}
当然,还几种方式(共七种),谷歌搜索都可.
232 Spring SpringMVC 的区别(重点)
springmvc 只是 spring 其中的一部分.
spring 可以支持 hibernate ,mybatis ,JDBC
支持事务管理, 注解功能,表达式语言,测试
springmvc 就是一个简单的 web 框架,可以代替 SSH 框架.
springmvc 比 struts2 性能优一些.
233、 将 Map 转换为 List
Map<String, String> map = new HashMap<String, String>( );
map.put("A", "ABC");
map.put("K", "KK");
map.put("L", "LV");
// 将 Map Key 转化为 List
List<String> mapKeyList = new ArrayList<String>(map.keySet( ));
System.out.println("mapKeyList:"+mapKeyList);
// 将 Map Key 转化为 List90 / 100
List<String> mapValuesList = new ArrayList<String>(map.values( ));
System.out.println("mapValuesList:"+mapValuesList);
234、 拦截器和过滤器的区别(重点)
1,拦截器是基于 java 的反射机制的,而过滤器是基于函数回调.
2,拦截器不依赖与servlet 容器,过滤器依赖与 servlet 容器.
3,拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用.
4,拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能访问.
5,在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
235、 请讲下堆与栈. (重点)
定义变量赋值赋值,以及随着方法的调用(参数为基本数据类型),会在栈中内存中开辟空
间,栈中也会有相应的数据,但是方法调用结束后,会有弹栈的效果,若方法参数为引用数据类
型,会在栈中有数据,随着方法调用结束,也会有弹栈的效果,同时在堆中也会有数据.
追问:那么堆中内存什么时候释放?
1,手动设置 null
2,变量的生命周期结束,有 GC 回收(GC 指的就是垃圾回收)
变量的生命周期: 就是一个变量在程序执行过程中的“有效期”,比如说全局变量,那它
在整个程序执行过程中都有效,及它的生命周期是整个程序执行过程,而对于一些在函数里定
义的局部变量,它只是在调用函数是有效,函数调用结束,它的生命周期也完了
236、 如何判断 List 集合是否为空? (重点)
if(null == list || list.size( ) ==0 ){
//为空的情况
}else{
//不为空的情况
}
237 list.isEmpty( ) list.size( )==0 有什么区别? (重点)
没有区别,isEmpty( )判断有没有元素,而size( )返回有几个元素,如果判断一个集合有无元素,建
议用 isEmpty( )方法比较符合.
238 list !=null ! list.isEmpty( )有什么区别? (重点)
这就相当与,你要要到商店买东西
list!=null
首先判断是否有商店
!list.isEmpty( )
没有判断商店是否存在,而是判断商店是否有东西
总结用法:如果连商店都没有,何来的的东西可卖
所以一般的判断是
if(list!=null && !list.isEmpty( )){
//不为空的情况
}else{91 / 100
//为空的情况
}
239、 怎么给 tomcat 增加内存? (重点)
在 bin/catalina.bat(windows 系统 tomcat)或者 bin/catalina.sh(Linux 系统 tomcat)中
设置变量,示例如下:
JAVA_OPTS="-server
-XX:PermSize=64M
-XX:MaxPermSize=128m
-Xms800m
-Xmx800m
-XX:MaxNewSize=256m"
Xms 是最小内存,Xmx 是最大内存,
240 JDBC,Mybatis,Hibernate 的区别是什么? (重点)
1) 从层次上看,JDBC 是较底层的持久层操作方式,而 Hibernate 和 MyBatis 都是在 JDBC
的基础上进行了封装使其更加方便程序员对持久层的操作.
2) 从功能上看,JDBC 就是简单的建立数据库连接,然后创建 statement,将 sql 语句传给
statement 去执行,如果是有返回结果的查询语句,会将查询结果放到 ResultSet 对象中,通过对
ResultSet 对象的遍历操作来获取数据;Hibernate 是将数据库中的数据表映射为持久层的Java
对象,对 sql 语句进行修改和优化比较困难;MyBatis 是将 sql 语句中的输入参数和输出参数
映射为 java 对象,sql 修改和优化比较方便.
3) 从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用 JDBC 的方式;如
果要对数据库进行完整性控制的话建议使用 Hibernate;如果要灵活使用 sql 语句的话建议采
用 MyBatis 框架.
241、 什么时候用 Hibernate,Mybatis(重点)
Hibernate 作为留下的 Java orm 框架,它确实编程简易,需要我们提供映射的规则,完全可
以通过 IDE 生成,同时无需编写 sql 确实开发效率优于 Mybatis.此外 Hibernate 还提供了缓存,
日志,级联等强大的功能,但是 Hibernate 的缺陷也是十分明显,多表关联复杂 sql,数据系统权
限限制,根据条件变化的 sql,存储过程等场景使用 Hibernate 十分不方便,而性能又难以通过
sql 优化,所以注定了 Hibernate 只适用于在场景不太复杂,要求性能不太苛刻的时候使用.
如果你需要一个灵活的,可以动态生成映射关系的框架,那么Mybatis 确实是一个最好
的选择.它几乎可以替代 jdbc,拥有动态列,动态表名,存储过程支持,同时提供了简易的缓存,日
志,级联.但是它的缺陷是需要你提供映射规则和 sql,所以开发工作量比 hibernate 要大些.
242 Struts2 SpringMVC 的区别? (重点)
1 机制不同
springmvc 的入口是 servlet,struts2 的入口是 filter,导致了二者的机制不同;
2 性能不同
spring 会稍微比struts 快.spring mvc 是基于方法的设计,而 sturts 是基于类,每次发一
次请求都会实例一个 action,每个 action 都会被注入属性,而 spring 基于方法,粒度更细,但要小
心把握像在servlet 控制数据一样.spring mvc 是方法级别的拦截,拦截到方法后根据参数上的
注解,把 request 数据注入进去,在 spring mvc 中,一个方法对应一个 request 上下文.而 struts292 / 100
框架是类级别的拦截,每次来了请求就创建一个 Action,然后调用 setter getter 方法把 request
中的数据注入;struts2 实际上是通过setter getter 方法与 request 打交道的;struts2 中,一个
Action 对象对应一个request 上下文.
Struts2 处理请求是为每个请求都创建一个单独的Action 类,Action 类当中的Field 属
性参数作为输入和输出参数用 IOC 来依赖注入的方式,是基于类的,入口是 filter.
而SpringMVC 则采用输入Request 和Reponse 作为参数,返回ModelAndView 的方式,是单
例的模式,且是基于方法的模式,入口是 servlet,速度比 struts2 快.
243、 集合的三种遍历方式
/*
迭代器 遍历集合
迭代器 Iterator 是一个接口
作用是绑定集合 迭代集合中的元素.
特殊之处: 在迭代期间可以移除迭代器指向的集合的元素
boolean hasNext( )
检查集合列表中是否还有元素未进行遍历,检查的方式从第一个依次向后检
Object next( )
获得当前遍历到的元素
void remove( )
从迭代器指向的 collection 中移除迭代器遍历到的当前元素.
[注意:如果使用迭代器遍历集合元素,迭代器必须依附于集合.
简单而言:有一个迭代器对象,就必须有一个与之关联的集合对象
]
[注意: 在迭代期间 集合本身不能操作移除功能]
*/
import java.util.*;
class IteratorDemo
{
public static void main(String[] args)
{
//System.out.println("Hello World!");
Collection c = new ArrayList( );
c.add("蜡笔小新");
c.add(5);93 / 100
c.add("淘气");
// 将集合与迭代器绑定[]
Iterator ite = c.iterator( );
while(ite.hasNext( )){
// 获取集合中的元素
Object obj = ite.next( );
System.out.println(obj);
// 移除迭代器指向的集合中的元素
ite.remove( );
//c.remove("淘气");
/*
ConcurrentModificationException 并发修改异常
*/
}
System.out.println(c);
}
}
foreach
/*
增强 for 循环进行遍历
[集合修改本身元素]
*/
import java.util.*;
class ForeachDemo
{
public static void main(String[] args)
{
//System.out.println("Hello World!");
Collection c = new ArrayList( );
c.add("路飞");
c.add("娜美");
c.add(" 鸣 人 ");
for(Object obj : c){94 / 100
// c.remove("鸣人");// ConcurrentModificationException
System.out.println(obj);
}
}
}
for
/*
普通 for 循环
注意:需要获得脚标 需要将集合转化为数组
*/
import java.util.*;
class ForDemo
{
public static void main(String[] args)
{
//System.out.println("Hello World!");
Collection c = new ArrayList( );
c.add("貂蝉");
c.add("西施");
c.add("王昭君");
c.add("杨玉环");
// 将集合转换为数组
Object[] arr = c.toArray( );
for(int i = 0; i < arr.length;
i++){ c.remove(" 王 昭
君 ");
System.out.println(arr[i]);
}
}
}
244 SpringMVC 的运行原理(重点)
1. 客户端请求提交到 DispatcherServlet
2. 由 DispatcherServlet 控制器查询一个或多个 HandlerMapping, 找到处理请求的
Controller
3. DispatcherServlet 将请求提交到 Controller
4. Controller 调用业务逻辑处理后,返回 ModelAndView
5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的
视图
6. 视图负责将结果显示到客户端95 / 100
245、 你觉得 Redis 有哪些优点?有哪些缺点? (重点)
优点:
1 读写性能优异
2 支持数据持久化,支持 AOF 和 RDB 两种持久化方式
3 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离.
4 数据结构丰富:除了支持 string 类型的 value 外还支持 string、hash、set、sortedset、
list 等数据结构.
缺点:
1 Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需
要等待机器重启或者手动切换前端的 IP 才能恢复.
2 主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后还会引入数据不一致的问
题,降低了系统的可用性.
3 redis 的主从复制采用全量复制,复制过程中主机会 fork 出一个子进程对内存做一份快
照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内
存.若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集
群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次
全量的数据复制,这对实际的系统运营造成了不小的麻烦.
4 Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂.为避免这一问
题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费.
246 Mybatis 如何处理结果集
通过获取到所有的返回的列名字,反射获取目标对象中这个名字对应的属性,调用 set 方
法,进行赋值
247、 内存溢出这块怎么解决? (重点)
原因分析
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
解决思路:
第一步,修改 JVM 启动参数,直接增加内存.(-Xms,-Xmx 参数一定不要忘记加.)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误. 第
三步,对代码进行走查和分析,找出可能发生内存溢出的位置.
使用工具:
常用的有 BoundsCheaker、Deleaker、Visual Leak Detector 等
248 Mybatis 的缓存(重点)
映射语句文件中的所有 select 语句将会被缓存.
映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存.
缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回.
根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新.96 / 100
缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用.
缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安
全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改.
所有的这些属性都可以通过缓存元素的属性来修改.
249、 线程池有哪些优点? (重点)
1 可以降低资源的消耗,通过重复使用已经创建的线程,可以降低创建线程和销毁线
程带来的消耗;
2 提高响应速度,当任务到达时,不需要等待线程创建就能立即执行;
3 提高线程的可管理性,线程是稀缺资源,如果无限制的创建和销毁,不光会带来资源
的消耗,还会降低系统的稳定性,通过线程池,可以对线程进行统一的分配,调优和监控.
250、 电商项目里文件上传怎么做的? (重点)
我们文件上传使用的是异步上传,这里在前台用到 jQuery.form.js 这个框架来做图片
的异步提交,在后台我们使用的是 springmvc,首先需要配置文件上传解析(支
持),MultParFile 必须跟文件上传项的 name 对应,然后获得图片名称,和扩展名调用封装
fastDFS 工具把图片上传到fastDFS.并且返回图片在服务器上面的路径,然后创建 json 对象
添加图片路径,然后再把 json 回写到客户端,在前端的回调函数里面接受到后台传递过来
的 json 数据,然后找到 img 标签,添加src 属性.(然后把文件上传到了本地,获取本地的服务
器据对路径,然后再把图片上传到本地服务器)
251、 电商项目里 zookeeper 是什么? (重点)
zookeeper 是在 Hadoop 大数据领域的服务中间件,它的第一个作用是存储数据(少量的),第二
个作用是对客户端提供监听.
252 Ajax 的应用场景有哪些? (重点)
1.表单驱动的交互
2.深层次的树的导航
3.快速的用户与用户间的交流响应
4.类似投票、yes/no 等无关痛痒的场景
5.对数据进行过滤和操纵相关数据的场景
6.普通的文本输入提示和自动完成的场景
253 Ajax 的工作原理(重点)
Ajax 的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应
异步化.并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax 引
擎自己来做, 只有确定需要从服务器读取新数据时再由 Ajax 引擎代为向服务器提交请求.
Ajax 其核心只有JavaScript、XMLHTTPRequest 和 DOM,在旧的交互方式中,由用户触发一
个HTTP 请求到服务器,服务器对其进行处理后再返回一个新的HTHL 页到客户端, 每当服务器
处理客户端提交的请求时,客户都只能空闲等待,并且哪怕只是一次很小的交互、只需从服务
器端得到很简单的一个数据,都要返回一个完整的 HTML 页,而用户每次都要浪费时间和带宽97 / 100
去重新读取整个页面.而使用 Ajax 后用户从感觉上几乎所有的操作都会很快响应没有页面重
载(白屏)的等待
254、 简要阐述 Ajax 的实现步骤(重点)
get 请求
1 创建一个XMLHttpRequest 对象
2 调用该对象的open 方法
3 如果是 get 请求,设置回调函数 onreadystatechange = callback
4 Send
如果是 post 请求
1 创建一个XMLHttpRequest 对象
2 调用该对象的open 方法
3 调用 setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
4 设置回调函数onreadystatechange = callback
5 Send
255 Redis mysql 的区别? (重点)
mysql 是持久化存储,存放在磁盘里面,检索的话,会涉及到一定的 IO,为了解决这个瓶颈,于是
出现了缓存
Mysql 是一个中小型的网络数据库,比oracle 和sqlserver 小, 但是并发能力远超过桌面数据库.
redis 是一个支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库.
可以认为redis 比 mysql 简化很多.
mysql 支持集群.
现在大量的软件使用redis 作为mysql 在本地的数据库缓存,然后再适当的时候和mysql 同步.
256、 为什么使用 redis 来生成商品 ID?(重点)
使得主键 id 字段能够持续自增、在高并发的场景下,id 值不重复, redis 本身单线程,不会出
现并发问题.
257 Mybatis #$的区别? (重点)
#{}表示一个占位符号,通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java
类型和 jdbc 类型转换,#{}可以有效防止 sql 注入. #{}可以接收简单类型值或 pojo 属性值. 如果
parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称.
${}表示拼接sql 串,通过${}可以将 parameterType 传入的内容拼接在sql 中且不进行 jdbc 类型
转换, ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括
号中只能是value98 / 100
258、 怎么防止表单重复提交(重点)
1>用 JavaScript 控制 Form 表单只能提交一次
var isCommitted = false;//表单是否已经提交标识,默认为 false
function dosubmit( ){
if(isCommitted==false){
isCommitted = true;//提交表单后,将表单是否已经提交标识设置为 true
return true;//返回 true 让表单正常提交
}else{
return false;//返回 false 那么表单将不提交
}
2>利用 Session 防止表单重复提交
具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为 Token(令牌),同时在当前
用户的Session 域中保存这个Token.然后将Token 发送到客户端的Form 表单中,在 Form 表单
中使用隐藏域来存储这个 Token,表单提交的时候连同这个 Token 一起提交到服务器端,然后
在服务器端判断客户端提交上来的 Token 与服务器端生成的 Token 是否一致,如果不一致,那
就是重复提交了,此时服务器端就可以不处理重复提交的表单.如果相同则处理表单提交,处
理完后清除当前用户的 Session 域中存储的标识号.
在下列情况下,服务器程序将拒绝处理用户提交的表单请求:
存储 Session 域中的Token(令牌)与表单提交的 Token(令牌)不同.
当前用户的 Session 中不存在 Token(令牌).
用户提交的表单数据中没有 Token(令牌)
259 @Controller @Service 的区别,控制器上能写@Service ?
Controller 是控制器,负责业务的调用
Service 是业务层逻辑层,负责具体业务的功能处理
控制器上不能写@Service
260 Java 中交互方式同步与异步是什么?区别是什么? (重点)
同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;
异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待.
区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要
等待的异步交互方式.
261 Freemarker 生成商品静态页之后,如果商品的数据需要修改怎么办? (重点)
Freemarker 根本不支持Java 脚本代码,而是使用el 表达式来展示数据.FreeMarker 的设计初衷
就是:模板 + 数据模型 = 输出,模板只负责在页面中展示,不涉及任何逻辑代码,而所有的逻
辑都是由数据模型来处理
我们在每一次点击上架就会生成一次新的静态页面来替换原来的静态页面
262 JDK1.7 JDK1.8 的区别?
结合回答方式总结:
(扣扣索索)企业软件一般不会在太新的 JRE 上运行,所以我没有很深入了解 JDK8.99 / 100
(自信的说)不过我知道,JDK8 支持 Lambda 表达式.这说明 JDK8 开始支持函数式编程.
(看考官不满意)以后很多地方不用匿名内部类这种形式了,简单了很多(罗利啰嗦一大堆)
(考官提示,interface 的 default 你怎么看?)
(恍然大悟状)啊,对对对
(赶紧补充)接口可以有默认实现之后,我认为有几个好处.
1.实现可以继承了,这样就减少了很多无谓的继承,可以简单的进行组合.
2.类库设计方便了,接口以后可以安全的扩展了
263、 聚合函数有哪些? (重点)
AVG( ) 返回某列的平均值
COUNT( ) 返回某列的行数
MAX( ) 返回某列的最大值
MIN( ) 返回某列的最小值
SUM( ) 返回某个列之和
264 JUnit4 @AfterClass@BeforClass@after@before 的区别对比(重点)
@Before:初始化方法 对于每一个测试方法都要执行一次(注意与 BeforeClass 区别,后者是
对于所有方法执行一次)
@After:释放资源 对于每一个测试方法都要执行一次(注意与 AfterClass 区别,后者是对于
所有方法执行一次)
@Test:测试方法,在这里可以测试期望异常和超时时间
@Test(expected=ArithmeticException.class)检查被测方法是否抛出 ArithmeticException 异常
@Ignore:忽略的测试方法
@BeforeClass:针对所有测试,只执行一次,且必须为 static void
@AfterClass:针对所有测试,只执行一次,且必须为 static void
一个 JUnit4 的单元测试用例执行顺序为:
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass;
每一个测试方法的调用顺序为:
@Before -> @Test -> @After;
265、 悲观锁乐观锁的区别? (重点)
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以
每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁.传统的关系
型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先
上锁.
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所
以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版
本号等机制.乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于
write_condition 机制的其实都是提供的乐观锁.100 / 100
两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真
的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量.但如果经常产生冲
突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合
适.
266、 项目为什么使用垂直应用架构?
我们的项目对性能的要求很高,使用的是垂直应用架构,项目分为前台和后台,consolr 是我们
的后台,partal 是我们的前台,前台后台共用我们的service 和 dao.(core 工程)
项目架构方案,在以前开发项目的时候是 all in one 传统的项目都是在 ORM 完成所有的
业务逻辑,但是我们为了增加项目的性能和提高运行速度,这个时候我们只有去增加它的服务
器节点,如果你的节点增加的越多,那么这个时候增加的节点所带来的项目加速是越小的,所
以呢,我们的项目是使用的垂直应用架构,这个就解决了传统架构方案的缺点,这样一来,节点越
多,我们的效果越好.

程序员找工作必看面试题1相关推荐

  1. 程序员找工作需要看的书

    一.为何要学编程? 每个人的动机不一样.大致有: 1.为了找个好工作:或为了有更好的机会和更好的发展.  2.看到别人超厉害,所以也想学.  3.实际工作中很多场合需要.  4.从小就立志做个程序员, ...

  2. 必看!前辈们总结出的程序员找工作遇到的坑

    最近不管是裁员潮,还是被炒的火热的 996 有赞事件,感觉大家都不容易,今天给大家推荐的就是程序员找工作黑名单的开源库.(结尾带链接) 程序员给人的印象就是:宅,不爱说话,埋头苦敲.所以,不管什么事件 ...

  3. Java程序员总结出必看的初级~高级技术面试题

    1换位思考下,如果你面试官,你会怎么做 1只能通过简历和面试来衡量,别无他法.如果某位大牛确认能力很行,但面试时无法充分地自证能力,那对不起了,过不了,现实就这样. 2如果面试官由于能力不行,招进来一 ...

  4. 亲身经历,大龄程序员找工作,为什么这么难...

    背景 临近年底,公司还在招人,可筛选的人才真是越来越少,这可能是因为大家都在等年终奖吧.于是在简历筛选时,将学历和年龄都适当的放松了.正因为如此,面试了不少大龄的程序员. 网络上一直有讨论大龄程序员找 ...

  5. 给应届毕业生的建议:萌新程序员找工作的三板斧

    一.找工作的目标和方向 一位亲戚家的年轻人马上要从大学毕业了,学软件工程,参加过培训的普通新手程序员,不是TOP学校也不是高学历,于是找我这十几年的老程序员给点建议. 说来惭愧,自己当年也不过是对计算 ...

  6. 新手Java程序员找工作更看重Java项目经验?

    动力节点IT培训,全真项目实操实训,贯穿八大行业,彻底帮助学员摆脱纸上谈兵的尴尬,一技成,天下行. 新手Java程序员找工作更看重Java项目经验?这个问题,想必是很多学Java的朋友也特别好奇的地方 ...

  7. 程序员找工作黑名单:除了 996.ICU,程序员还将如何自救?

    当一个群体真正联合起来,有些事可能就要闹大了-- 作者 | 仲培艺 出品 | 程序人生(ID:coder_life) 996.ICU 的辐射范围还在持续扩散的档口,又一个程序员群体"反抗&q ...

  8. 程序员找工作遇到的“了解、熟悉、精通”的三种技能要求实际上是这样的标准!

    本篇文章主要讲解:程序员找工作遇到的"了解.熟悉.精通"的三种技能要求的标准说明. 日期:2021-7-19 作者:任聪聪 编程语言以及技能的了解.熟悉.精通的概念标准: 一.编程 ...

  9. 什么是 Python ?聊一聊Python程序员找工作的六大技巧

    最近我一直在思考换工作的事情.因此,这段时间我会看一些题目,看一些与面试相关的内容,以便更好地准备面试.我认为无论你处于什么阶段,面试中都会有技术面试环节.无论是初级职位还是高级职位,都需要通过技术面 ...

最新文章

  1. SVN中 “containing working copy admin area is missin
  2. 无法激活安全认证服务
  3. mysql 列 随机数_mysql mmp 某字段插入随机数!(说不定那天就忘记了,存下来再说)...
  4. php无法连接mysql_php无法连接数据库
  5. ug冲模标准件库_昆山兴模lt;携手gt;武汉益模,打通冲模“智能设计+精益管理”的最后一道关卡...
  6. C#中的文件流和文本流
  7. iOS开发: info访问权限配置
  8. 尚硅谷html+css小米官网
  9. Ghostscript沙箱绕过(CVE-2021-3781)分析
  10. 全国省市县行政区划SQL代码文件
  11. matlab函数零点求法,Matlab之函数零点 | 学步园
  12. 数据采集工具:八爪鱼
  13. 悬赏任务小程序搭建抖音点赞app任务发布接单平台任务分销公众号开发
  14. 量化新手初识Brinson绩效分解模型
  15. 广域网(WAN)简介
  16. window的onload()的使用
  17. k8s部署zookeeper集群 运行 ZooKeeper, 一个 CP 分布式系统
  18. 2006年F1第一站巴林
  19. 怎么设置uboot从u盘启动linux,RT5350使用uboot从U盘启动linux顺利
  20. vue 微信浏览器缓存问题解决方案

热门文章

  1. bt面板增加多个站点用同一个IP
  2. 软件安全建设【学习笔记】
  3. Python:whl安装包简介与制作
  4. 深入理解iOS App的启动过程
  5. PyTorch开发者福音, OpenVINO整合PyTorch实现推理加速!
  6. 极大似然估计原理详细说明
  7. 关于我在编程里学表白这件事。。。。【python表白代码】
  8. vmstat命令详解——linux性能分析
  9. 窗口最小化后不出现在任务栏上
  10. 1、ubuntu 安装docker