JAVA复试问题答案

(一) JAVA复试的问题整理

1 Hibernate 的优化流程是如何实现的,流程是怎么样?

1. 尽量使用many-to-one ,避免使用单向one-to-many

2 Struts1与Struts2的区别?

在Action 实现类方面的对比:Struts 1 要求Action 类继承一个抽象基类;Struts 1 的 一个具体问题是使用抽象类编程而不是接口。Struts 2 Action 类可以实现一个Action 接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts2 提供一ActionSupport 基类去实现常用的接口。即使 Action 接口不是必须实现的,只有一个包含execute 方法的POJO 类都可以用作 Struts 2 的Action 。

线程模式方面的对比:Struts 1 Action 是单例模式并且必须是线程安全的,因为仅有Action 的一个实例来处理所有的请求。单例策略限制了Struts 1 Action 能做的事,并且要在开发时特别小心。Action 资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。

Servlet 依赖方面的对比:Struts 1 Action 依赖于 Servlet API ,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。Struts 2 Action 不再依赖于 Servlet API ,从而允许Action 脱离Web 容器运行,从而降低了测试Action 的难度。当然,如果Action 需要直接访问HttpServletRequest 和HttpServletResponse 参数,Struts 2 Action 仍然可以访问它们。但是,大部分时候,Action 都无需直接访问HttpServetRequest 和HttpServletResponse ,从而给开发者更多灵活的选择。

可测性方面的对比:测试Struts 1 Action 的一个主要问题是execute 方法依赖于7. 消除大表,使用二级缓存 2. 灵活使用单向one-to-many 3. 不用一对一,使用多对一代替一对一 4. 配置对象缓存,不使用集合缓存 5. 一对多使用Bag 多对一使用Set 6. 继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对Servlet API ,这使得Action 的测试要依赖于Web 容器。为了脱离Web 容器测试 Struts1

的Action ,必须借助于第三方扩展:Struts TestCase ,该扩展下包含了系列的Mock 对象(模拟了HttpServetRequest 和HttpServletResponse 对象),从而可以脱离Web 容器测 试Struts 1 的Action 类。Struts 2 Action 可以通过初始化、设置属性、调用方法来测试。 封装请求参数的对比:Struts 1 使用ActionForm 对象封装用户的请求参数,所有的 ActionForm 必须继承一个基类:ActionForm 。普通的JavaBean 不能用作ActionForm ,因此,开发者必须创建大量的ActionForm 类封装用户请求参数。虽然 Struts 1 提供了动态 ActionForm 来简化 ActionForm的开发,但依然需要在配置文件中定义ActionForm ;Struts2 直接使用Action 属性来封装用户请求属性,避免了开发者需要大量开发 ActionForm 类的烦琐,实际上,这些属性还可以是包含子属性的 Ric对象类型。如果开发者依然怀念 Struts 1 ActionForm 的模式,Struts2 提供ModelDriven 模式,可以让开发者使用单独的Model 对象来封装用户请求参数,但该Model 对象无需继承任何 Struts 2 基类,是一个POJO ,从而降低了代码污染。

表达式语言方面的对比:Struts1 整合了 JSTL,因此可以使用JSTL 表达式语言。这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts 2 可以使用JSTL ,但它整合了一种更强大和灵活的表达式语言:OGNL (Object Graph Notation Language ),因此,Struts 2 下的表达式语言功能更加强大。绑定值到视图的对比:Struts1 使用标准JSP 机制把对象绑定到视图页面;Struts2 使用“ValueStack ”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。

类型转换的对比:Struts1 ActionForm 属性通常都是 String 类型。Struts 1 使用commons-Beanutils 进行类型转换,每个类一个转换器,转换器是不可配置的;Struts 2 使用OGNL 进行类型转换,支持基本数据类型和常用对象之间的转换。

数据校验的对比:Struts1 支持在 ActionForm 重写validate 方法中手动校验,或者通过整合 Commons-validator 框架来完成数据校验。Struts 2 支持通过重写validate 方法进行校验,也支持整合XWork 校验框架进行校验。

Action 执行控制的对比:Struts 1 支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action 必须共享相同的生命周期。Struts 2 支持通过拦截器堆栈(Interceptor Stacks)为每一个Action 创建不同的生命周期。开发者可以根据需要创建相应堆栈,从而和不同的Action 一起使用。

3 Struts1的原理

1. 初始化:struts 框架的总控制器ActionServlet 是一个Servlet ,它在web.xml 中配置成自动启动的Servlet ,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts 不同的模块初始化相应的对象。(面向对象思想)

2. 发送请求:用户提交表单或通过URL 向WEB 服务器提交请求,请求的数据用HTTP 协议传给web 服务器。

3.form 填充:struts 的总控制器ActionServlet 在用户提交请求时将数据放到对应的form 对象中的成员变量中。

4. 派发请求:控制器根据配置信息对象ActionConfig 将请求派发到具体的Action ,对应的formBean 一并传给这个Action 中的excute()方法。

5. 处理业务:Action 一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块) 完毕后返回一个ActionForward 对象。服务器通过ActionForward 对象进行转发工作。

6. 返回响应:Action 将业务处理的不同结果返回一个目标响应对象给总控制器。

7. 查找响应:总控制器根据Action 处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp 页面。

8. 响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。

4 IO的流程如何实现

1,根据输入源不同,构造不同的输入流

2,根据不同的需要,包装原始的输入流。比如用BufferdInputStream 提高性能。 3,根据输出源不同,构造不同的输出流。

4,根据不同的需要,包装原始的输入流。

5,从输入流中读取数据写入输出流中。

6,关闭输出,输入流

5 WEB开发安全的注意要点

1.登陆验证码。

利用一个servlet 随机产生一个验证码,由于验证码是机器随机产生的,因此暴力破解程序无法预料到具体是什么,所以可以防止暴力破解。

2.登陆身份验证。系统的每个功能都必须经过身份验证后才能访问,没有认证的请求会被过滤掉,这是最基本的安全要求:

1,所有功能都通过Struts 的Action 来进行访问,不直接以jsp 的形式向用户提供功能访问,这样一方面可以防止向用户暴露程序的资源名称,另一方面也可更方便的进行权限控制。

2,对Struts 的Actionservlet 设置filter ,利用该filter 来检查用户的权限,这样既可以防止用户登陆后跨url 访问。

3.防 止扰过权限认证的直接资源访问。虽然前面的设计中,已经要求所有的功能都通过struts 的Action 来进行访问,但是还是不能排除恶意用户可能会知道 程序资源名称(jsp 文件),如果这类用户直接输入jsp 文件的url 访问,有可能会对系统形成威胁。因此需要禁止所有用户发起的直接资源访问。通常以这 种方式来实现:在Web 应用中创建一个从不使用的角色:NeverUsedRole ,将所有的jsp 资源文件配置为必须具有NeverUserRole 才 能访问。由于根本没有任何用户可以成为该角色。由于根本没有任何用户可以成为该角色,所以也就无法对该角色对应的资源直接访问。

6 常用的集合的区别

Collection 接口

Collection 是最基本的集合接口,一个Collection 代表一组Object ,即Collection 的元素 (Elements )。一些Collection 允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection 的类,Java SDK提供的类都是继承自Collection 的“子接口”如List 和Set 。

List 接口

List 是有序的Collection ,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List 中的位置,类似于数组下标)来访问List 中的元素,这类似于Java 的数组。和下面要提到的Set 不同,List 允许有相同的元素。

LinkedList 类

LinkedList 实现了List 接口,允许null 元素。此外LinkedList 提供额外的get ,remove ,insert 方法在 LinkedList的首部或尾部。这些操作使LinkedList 可被用作堆栈(stack ),队列(queue )或双向队列(deque )。

注意LinkedList 没有同步方法。如果多个线程同时访问一个List ,则必须自己实现访问同步。

ArrayList类

ArrayList 实现了可变大小的数组。它允许所有元素,包括null 。ArrayList 没有同步。size ,isEmpty ,get ,set 方法运行时间为常数。但是add 方法开销为分摊的常数,添加n 个元素需要O(n)的时间。其他的方法运行时间为线性。 当需要插入大量元素时,在插入前可以调用ensureCapacity 方法来增加ArrayList 的容量以提高插入效率。 和LinkedList 一样,ArrayList 也是非同步的(unsynchronized )。

Vector 类

Vector 非常类似ArrayList ,但是Vector 是同步的。由Vector 创建的Iterator ,虽然和ArrayList 创建的Iterator 是同一接口,但是,因为Vector 是同步的,当一个 Iterator被创建而且正在被使用,另一个线程改变了Vector 的状态(例如,添加或删除了一些元素),这时调用Iterator 的方法时将抛出 ConcurrentModificationException,因此必须捕获该异常。

Stack 类

Stack 继承自Vector ,实现一个后进先出的堆栈。Stack 提供5个额外的方法使得Vector 得以被当作堆栈使用。基本的push 和pop 方法,还有peek 方法得到栈顶的元素,empty 方法测试堆栈是否为空,search 方法检测一个元素在堆栈中的位置。Stack 刚创建后是空 栈。

set 接口

Set 是一种不包含重复的元素的Collection ,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set 最多有一个null 元素。

Map 接口

请注意,Map 没有继承Collection 接口,Map 提供key 到value 的映射。一个Map 中不能包含相同的key ,每个key 只能 映射一个value 。Map 接口提供3种集合的视图,Map 的内容可以被当作一组key 集合,一组value 集合,或者一组key-value 映射。

Hashtable 类

Hashtable 继承Map 接口,实现一个key-value 映射的哈希表。任何非空(non-null )的对象都可作为key 或者value 。 Hashtable是同步的。

HashMap 类

HashMap 和Hashtable 类似,不同之处在于HashMap 是非同步的,并且允许null ,即null value和null key。,但是将HashMap 视为Collection 时(values()方法可返回Collection ),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap 的初始化容量设得过高,或者load factor过低。

7 sql的优化

1)Shared pool的优化应该放在优先考虑,因为一个cache miss在shared pool中发生比在data buffer中发生导致的成本更高

2)尽可能避免排序;尽可能在内存中排序;分配合适的临时空间以减少空间分配调用。

3)建立Indexes ,但索引的层次越多,效率越低,索引所包含的字段不超过4个。

4)表分区

5)使用where 过滤行

Select id from dual where id = 1

6)使用表连接而不是多个查询

使用:

Select a.id,a.name,b.app_name from A a,B b where a.id=b.id

而不是:

Select a.id,a.name,b.app_name from B b where a.id=b.id from A a

7)执行连接时使用完全限定的列引用

8)使用CASE 表达式而不是多个查询

9)使用WHERE 而不用HAVING

避免使用HAVING 子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤。 这个处理需要排序,总计等操作。 如果能通过WHERE 子句限制记录的数目,那就能减少这方面的开销。

10)使用exists 而不用IN

11)使用相同的SQL ,使用的SQL 必须绝对相同

a) 所有字符必须相同

b) 大小写要相同

c) 空格要相同

12)WHERE 子句中的连接顺序

ORACLE采用自下而上的顺序解析WHERE 子句,根据这个原理,表之间的连接必须写在

其他WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE 子句的末尾。

13)SELECT 子句中避免使用 ‘ * ’

例如:person 表包含4个字段(id,name,age,address)

Select id,name,age,address from person;

不用:select * from person

14) 使用DECODE 函数来减少处理时间

使用DECODE 函数可以避免重复扫描相同记录或重复连接相同的表。 15) 减少对表的查询

在含有子查询的SQL 语句中,要特别注意减少对表的查询。

16) 使用表的别名(Alias)

17) 用EXISTS 替代IN

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在

这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率。

8 DWR是怎么实现

它先在web.xml 中配置一个Servlet ,映射到特定的路径(通常是%CONTEXT_PATH%/dwr/*)。这个Servlet 的作用就是初 始化要暴露给Javascript 调用的

Java 类(通过dwr.xml 进行配置),并生成相应的代理的Javascript 类代码。在XHR 请求到来的 时候,Servlet 负责将请求的参数变成对应的Java 对象,并以其为参数调用目标Java 方法,并将返回值转化为Javascript 代码。

9 list和vector 的区别

List 接口

List 是有序的Collection ,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List 中的位置,类似于数组下标)来访问List 中的元素,这类似于Java 的数组。和下面要提到的Set 不同,List 允许有相同的元素。

LinkedList 类

LinkedList 实现了List 接口,允许null 元素。此外LinkedList 提供额外的get ,remove ,insert 方法在 LinkedList的首部或尾部。这些操作使LinkedList 可被用作堆栈(stack ),队列(queue )或双向队列(deque )。

注意LinkedList 没有同步方法。如果多个线程同时访问一个List ,则必须自己实现访问同步。

ArrayList类

ArrayList 实现了可变大小的数组。它允许所有元素,包括null 。ArrayList 没有同步。size ,isEmpty ,get ,set 方法运行时间为常数。但是add 方法开销为分摊的常数,添加n 个元素需要O(n)的时间。其他的方法运行时间为线性。 当需要插入大量元素时,在插入前可以调用ensureCapacity 方法来增加ArrayList 的容量以提高插入效率。 和LinkedList 一样,ArrayList 也是非同步的(unsynchronized )。

Vector 类

Vector 非常类似ArrayList ,但是Vector 是同步的。由Vector 创建的Iterator ,虽然和ArrayList 创建的Iterator 是同一接口,但是,因为Vector 是同步的,当一个 Iterator被创建而且正在被使用,另一个线程改变了Vector 的状态(例如,添加或删除了一些元素),这时调用Iterator 的方法时将抛出 ConcurrentModificationException,因此必须捕获该异常。

Stack 类

Stack 继承自Vector ,实现一个后进先出的堆栈。Stack 提供5个额外的方法使得Vector 得以被当作堆栈使用。基本的push 和pop 方法,还有peek 方法得到栈顶的元素,empty

方法测试堆栈是否为空,search 方法检测一个元素在堆栈中的位置。Stack 刚创建后是空 栈。

10 hashmap和hashtable 的区别

Hashtable 类

Hashtable 继承Map 接口,实现一个key-value 映射的哈希表。任何非空(non-null )的对象都可作为key 或者value 。 Hashtable是同步的。

HashMap 类

HashMap 和Hashtable 类似,不同之处在于HashMap 是非同步的,并且允许null ,即null value和null key。,但是将HashMap 视为Collection 时(values()方法可返回Collection ),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap 的初始化容量设得过高,或者load factor过低。

(一) JAVA复试的问题整理

1 Hibernate 的优化流程是如何实现的,流程是怎么样?

1. 尽量使用many-to-one ,避免使用单向one-to-many

2 Struts1与Struts2的区别?

在Action 实现类方面的对比:Struts 1 要求Action 类继承一个抽象基类;Struts 1 的 一个具体问题是使用抽象类编程而不是接口。Struts 2 Action 类可以实现一个Action 接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts2 提供一ActionSupport 基类去实现常用的接口。即使 Action 接口不是必须实现的,只有一个包含execute 方法的POJO 类都可以用作 Struts 2 的Action 。

线程模式方面的对比:Struts 1 Action 是单例模式并且必须是线程安全的,因为仅有Action 的一个实例来处理所有的请求。单例策略限制了Struts 1 Action 能做的事,并且要在开发时特别小心。Action 资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。

Servlet 依赖方面的对比:Struts 1 Action 依赖于 Servlet API ,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。Struts 2 Action 不再依赖于 Servlet API ,从而允许Action 脱离Web 容器运行,从而降低了测试Action 的难度。当然,如果Action 需要直接访问HttpServletRequest 和HttpServletResponse 参数,Struts 2 Action 仍然可以访问它们。但是,大部分时候,Action 都无需直接访问HttpServetRequest 和HttpServletResponse ,从而给开发者更多灵活的选择。

可测性方面的对比:测试Struts 1 Action 的一个主要问题是execute 方法依赖于7. 消除大表,使用二级缓存 2. 灵活使用单向one-to-many 3. 不用一对一,使用多对一代替一对一 4. 配置对象缓存,不使用集合缓存 5. 一对多使用Bag 多对一使用Set 6. 继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对Servlet API ,这使得Action 的测试要依赖于Web 容器。为了脱离Web 容器测试 Struts1

的Action ,必须借助于第三方扩展:Struts TestCase ,该扩展下包含了系列的Mock 对象(模拟了HttpServetRequest 和HttpServletResponse 对象),从而可以脱离Web 容器测 试Struts 1 的Action 类。Struts 2 Action 可以通过初始化、设置属性、调用方法来测试。 封装请求参数的对比:Struts 1 使用ActionForm 对象封装用户的请求参数,所有的 ActionForm 必须继承一个基类:ActionForm 。普通的JavaBean 不能用作ActionForm ,因此,开发者必须创建大量的ActionForm 类封装用户请求参数。虽然 Struts 1 提供了动态 ActionForm 来简化 ActionForm的开发,但依然需要在配置文件中定义ActionForm ;Struts2 直接使用Action 属性来封装用户请求属性,避免了开发者需要大量开发 ActionForm 类的烦琐,实际上,这些属性还可以是包含子属性的 Ric对象类型。如果开发者依然怀念 Struts 1 ActionForm 的模式,Struts2 提供ModelDriven 模式,可以让开发者使用单独的Model 对象来封装用户请求参数,但该Model 对象无需继承任何 Struts 2 基类,是一个POJO ,从而降低了代码污染。

表达式语言方面的对比:Struts1 整合了 JSTL,因此可以使用JSTL 表达式语言。这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts 2 可以使用JSTL ,但它整合了一种更强大和灵活的表达式语言:OGNL (Object Graph Notation Language ),因此,Struts 2 下的表达式语言功能更加强大。绑定值到视图的对比:Struts1 使用标准JSP 机制把对象绑定到视图页面;Struts2 使用“ValueStack ”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。

类型转换的对比:Struts1 ActionForm 属性通常都是 String 类型。Struts 1 使用commons-Beanutils 进行类型转换,每个类一个转换器,转换器是不可配置的;Struts 2 使用OGNL 进行类型转换,支持基本数据类型和常用对象之间的转换。

数据校验的对比:Struts1 支持在 ActionForm 重写validate 方法中手动校验,或者通过整合 Commons-validator 框架来完成数据校验。Struts 2 支持通过重写validate 方法进行校验,也支持整合XWork 校验框架进行校验。

Action 执行控制的对比:Struts 1 支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action 必须共享相同的生命周期。Struts 2 支持通过拦截器堆栈(Interceptor Stacks)为每一个Action 创建不同的生命周期。开发者可以根据需要创建相应堆栈,从而和不同的Action 一起使用。

3 Struts1的原理

1. 初始化:struts 框架的总控制器ActionServlet 是一个Servlet ,它在web.xml 中配置成自动启动的Servlet ,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts 不同的模块初始化相应的对象。(面向对象思想)

2. 发送请求:用户提交表单或通过URL 向WEB 服务器提交请求,请求的数据用HTTP 协议传给web 服务器。

3.form 填充:struts 的总控制器ActionServlet 在用户提交请求时将数据放到对应的form 对象中的成员变量中。

4. 派发请求:控制器根据配置信息对象ActionConfig 将请求派发到具体的Action ,对应的formBean 一并传给这个Action 中的excute()方法。

5. 处理业务:Action 一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块) 完毕后返回一个ActionForward 对象。服务器通过ActionForward 对象进行转发工作。

6. 返回响应:Action 将业务处理的不同结果返回一个目标响应对象给总控制器。

7. 查找响应:总控制器根据Action 处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp 页面。

8. 响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。

4 IO的流程如何实现

1,根据输入源不同,构造不同的输入流

2,根据不同的需要,包装原始的输入流。比如用BufferdInputStream 提高性能。 3,根据输出源不同,构造不同的输出流。

4,根据不同的需要,包装原始的输入流。

5,从输入流中读取数据写入输出流中。

6,关闭输出,输入流

5 WEB开发安全的注意要点

1.登陆验证码。

利用一个servlet 随机产生一个验证码,由于验证码是机器随机产生的,因此暴力破解程序无法预料到具体是什么,所以可以防止暴力破解。

2.登陆身份验证。系统的每个功能都必须经过身份验证后才能访问,没有认证的请求会被过滤掉,这是最基本的安全要求:

1,所有功能都通过Struts 的Action 来进行访问,不直接以jsp 的形式向用户提供功能访问,这样一方面可以防止向用户暴露程序的资源名称,另一方面也可更方便的进行权限控制。

2,对Struts 的Actionservlet 设置filter ,利用该filter 来检查用户的权限,这样既可以防止用户登陆后跨url 访问。

3.防 止扰过权限认证的直接资源访问。虽然前面的设计中,已经要求所有的功能都通过struts 的Action 来进行访问,但是还是不能排除恶意用户可能会知道 程序资源名称(jsp 文件),如果这类用户直接输入jsp 文件的url 访问,有可能会对系统形成威胁。因此需要禁止所有用户发起的直接资源访问。通常以这 种方式来实现:在Web 应用中创建一个从不使用的角色:NeverUsedRole ,将所有的jsp 资源文件配置为必须具有NeverUserRole 才 能访问。由于根本没有任何用户可以成为该角色。由于根本没有任何用户可以成为该角色,所以也就无法对该角色对应的资源直接访问。

6 常用的集合的区别

Collection 接口

Collection 是最基本的集合接口,一个Collection 代表一组Object ,即Collection 的元素 (Elements )。一些Collection 允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection 的类,Java SDK提供的类都是继承自Collection 的“子接口”如List 和Set 。

List 接口

List 是有序的Collection ,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List 中的位置,类似于数组下标)来访问List 中的元素,这类似于Java 的数组。和下面要提到的Set 不同,List 允许有相同的元素。

LinkedList 类

LinkedList 实现了List 接口,允许null 元素。此外LinkedList 提供额外的get ,remove ,insert 方法在 LinkedList的首部或尾部。这些操作使LinkedList 可被用作堆栈(stack ),队列(queue )或双向队列(deque )。

注意LinkedList 没有同步方法。如果多个线程同时访问一个List ,则必须自己实现访问同步。

ArrayList类

ArrayList 实现了可变大小的数组。它允许所有元素,包括null 。ArrayList 没有同步。size ,isEmpty ,get ,set 方法运行时间为常数。但是add 方法开销为分摊的常数,添加n 个元素需要O(n)的时间。其他的方法运行时间为线性。 当需要插入大量元素时,在插入前可以调用ensureCapacity 方法来增加ArrayList 的容量以提高插入效率。 和LinkedList 一样,ArrayList 也是非同步的(unsynchronized )。

Vector 类

Vector 非常类似ArrayList ,但是Vector 是同步的。由Vector 创建的Iterator ,虽然和ArrayList 创建的Iterator 是同一接口,但是,因为Vector 是同步的,当一个 Iterator被创建而且正在被使用,另一个线程改变了Vector 的状态(例如,添加或删除了一些元素),这时调用Iterator 的方法时将抛出 ConcurrentModificationException,因此必须捕获该异常。

Stack 类

Stack 继承自Vector ,实现一个后进先出的堆栈。Stack 提供5个额外的方法使得Vector 得以被当作堆栈使用。基本的push 和pop 方法,还有peek 方法得到栈顶的元素,empty 方法测试堆栈是否为空,search 方法检测一个元素在堆栈中的位置。Stack 刚创建后是空 栈。

set 接口

Set 是一种不包含重复的元素的Collection ,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set 最多有一个null 元素。

Map 接口

请注意,Map 没有继承Collection 接口,Map 提供key 到value 的映射。一个Map 中不能包含相同的key ,每个key 只能 映射一个value 。Map 接口提供3种集合的视图,Map 的内容可以被当作一组key 集合,一组value 集合,或者一组key-value 映射。

Hashtable 类

Hashtable 继承Map 接口,实现一个key-value 映射的哈希表。任何非空(non-null )的对象都可作为key 或者value 。 Hashtable是同步的。

HashMap 类

HashMap 和Hashtable 类似,不同之处在于HashMap 是非同步的,并且允许null ,即null value和null key。,但是将HashMap 视为Collection 时(values()方法可返回Collection ),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap 的初始化容量设得过高,或者load factor过低。

7 sql的优化

1)Shared pool的优化应该放在优先考虑,因为一个cache miss在shared pool中发生比在data buffer中发生导致的成本更高

2)尽可能避免排序;尽可能在内存中排序;分配合适的临时空间以减少空间分配调用。

3)建立Indexes ,但索引的层次越多,效率越低,索引所包含的字段不超过4个。

4)表分区

5)使用where 过滤行

Select id from dual where id = 1

6)使用表连接而不是多个查询

使用:

Select a.id,a.name,b.app_name from A a,B b where a.id=b.id

而不是:

Select a.id,a.name,b.app_name from B b where a.id=b.id from A a

7)执行连接时使用完全限定的列引用

8)使用CASE 表达式而不是多个查询

9)使用WHERE 而不用HAVING

避免使用HAVING 子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤。 这个处理需要排序,总计等操作。 如果能通过WHERE 子句限制记录的数目,那就能减少这方面的开销。

10)使用exists 而不用IN

11)使用相同的SQL ,使用的SQL 必须绝对相同

a) 所有字符必须相同

b) 大小写要相同

c) 空格要相同

12)WHERE 子句中的连接顺序

ORACLE采用自下而上的顺序解析WHERE 子句,根据这个原理,表之间的连接必须写在

其他WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE 子句的末尾。

13)SELECT 子句中避免使用 ‘ * ’

例如:person 表包含4个字段(id,name,age,address)

Select id,name,age,address from person;

不用:select * from person

14) 使用DECODE 函数来减少处理时间

使用DECODE 函数可以避免重复扫描相同记录或重复连接相同的表。 15) 减少对表的查询

在含有子查询的SQL 语句中,要特别注意减少对表的查询。

16) 使用表的别名(Alias)

17) 用EXISTS 替代IN

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在

这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率。

8 DWR是怎么实现

它先在web.xml 中配置一个Servlet ,映射到特定的路径(通常是%CONTEXT_PATH%/dwr/*)。这个Servlet 的作用就是初 始化要暴露给Javascript 调用的

Java 类(通过dwr.xml 进行配置),并生成相应的代理的Javascript 类代码。在XHR 请求到来的 时候,Servlet 负责将请求的参数变成对应的Java 对象,并以其为参数调用目标Java 方法,并将返回值转化为Javascript 代码。

9 list和vector 的区别

List 接口

List 是有序的Collection ,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List 中的位置,类似于数组下标)来访问List 中的元素,这类似于Java 的数组。和下面要提到的Set 不同,List 允许有相同的元素。

LinkedList 类

LinkedList 实现了List 接口,允许null 元素。此外LinkedList 提供额外的get ,remove ,insert 方法在 LinkedList的首部或尾部。这些操作使LinkedList 可被用作堆栈(stack ),队列(queue )或双向队列(deque )。

注意LinkedList 没有同步方法。如果多个线程同时访问一个List ,则必须自己实现访问同步。

ArrayList类

ArrayList 实现了可变大小的数组。它允许所有元素,包括null 。ArrayList 没有同步。size ,isEmpty ,get ,set 方法运行时间为常数。但是add 方法开销为分摊的常数,添加n 个元素需要O(n)的时间。其他的方法运行时间为线性。 当需要插入大量元素时,在插入前可以调用ensureCapacity 方法来增加ArrayList 的容量以提高插入效率。 和LinkedList 一样,ArrayList 也是非同步的(unsynchronized )。

Vector 类

Vector 非常类似ArrayList ,但是Vector 是同步的。由Vector 创建的Iterator ,虽然和ArrayList 创建的Iterator 是同一接口,但是,因为Vector 是同步的,当一个 Iterator被创建而且正在被使用,另一个线程改变了Vector 的状态(例如,添加或删除了一些元素),这时调用Iterator 的方法时将抛出 ConcurrentModificationException,因此必须捕获该异常。

Stack 类

Stack 继承自Vector ,实现一个后进先出的堆栈。Stack 提供5个额外的方法使得Vector 得以被当作堆栈使用。基本的push 和pop 方法,还有peek 方法得到栈顶的元素,empty

方法测试堆栈是否为空,search 方法检测一个元素在堆栈中的位置。Stack 刚创建后是空 栈。

10 hashmap和hashtable 的区别

Hashtable 类

Hashtable 继承Map 接口,实现一个key-value 映射的哈希表。任何非空(non-null )的对象都可作为key 或者value 。 Hashtable是同步的。

HashMap 类

HashMap 和Hashtable 类似,不同之处在于HashMap 是非同步的,并且允许null ,即null value和null key。,但是将HashMap 视为Collection 时(values()方法可返回Collection ),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap 的初始化容量设得过高,或者load factor过低。


相关文章

  • 2017人大软件工程硕士考研复习方法整理
  • 2017人大软件工程硕士考研复习方法整 理 经过整理凯程人大软件工程硕士考研老师总结了以下关于考研内容,希望通过以下内容,同学们更加了解人大软件工程硕士考研,规划好学习计划!凯程就是王牌的人大考研机构! 一.人大软件工程硕士考研复习方法解读 ...查看


  • 人大软件工程硕士考研学费是多少
  • 人大软件工程硕士考研学费是多少 人大软件工程硕士考研学费是多少,是历年来学子的问题,凯程人大软件工程硕士考研老师整理了一些备考人大软件工程硕士考研的资料,希望广大考生根据复习建议规划复习计划,取得好的成绩.特别申明,以下信息绝对准确,凯程就 ...查看


  • 人大软件工程硕士考研学费怎么收
  • 人大软件工程硕士考研学费怎么收 考取人大软件工程硕士研究生学费怎么收?今天,凯程人大软件工程硕士考研老师给大家整理了一些有关学费,人大软件工程硕士考研就业,人大软件工程硕士考研辅导,人大软件工程硕士考研参考书,人大软件工程硕士考研专业课其它 ...查看


  • 考研复试全过程
  • 复试: 一.英语听力问题:(满分10分) 重邮的听力没有那么严格,两个老师(外语系)一个打分,一个旁听,估计是辅助的.两个人一组,各个专业打乱,你的搭档和你不是一个专业的.告诉大家一个小方法,你可以头一天去看分组情况,把你的*****写下来 ...查看


  • 武汉大学电通面试问题
  • 面试问题 1, 调制和混频有什么区别? 调制的本质是用调制信号(输入的低频信号)控制高频载波的一个或几个参数(幅度.频率.相位),使高频载波或输出已调信号的参数按照调制信号的规律变化.相当于把调制信号装到高频载波上. 混频是把输入的信号(可 ...查看


  • 2014贵州大学计算机复试经验
  • 2014贵州大学计算机复试经验 可能标的红字比较多...不过如果能认真看完还是认真看下吧,都是比较有用的东东. 一志愿和调剂 如果是一志愿,那就好好准备复试,虽然复试刷一志愿的可能性不大,但是这是在你所有的表现都不是很烂很烂的基础上.如果是 ...查看


  • 亿阳信通2012校园招聘大礼包_备战亿阳信通2012校园招聘_大街网
  • 大街网--中国最先进的大学生求职互动平台 亿阳信通 2012校园招聘大礼包 --大街网倾情奉献 大街网企业俱乐部 亿阳信通讨论区 亿阳信通2012校园招聘简介: 亿阳信通股份有限公司,是2000年7月在中国上海证券交易所上市的高科技上市公司 ...查看


  • 电子商务技术基础课后习题及答案
  • 电子商务技术基础课后习题及参考答案 第一章:参考答案 1.传统的商务与现代电子商务有什么区别? 参考答案:电子商务将传统商业活动中物流.资金流.信息流的传递方式利用网络科技整合,企业将重要的信息通过全球信息网(WWW).企业内部网(intr ...查看


  • 答辩常见问题汇总1
  • (1)怎么连接数据库 答案:通过JDBC_ODBC桥连接数据库 (2)数据库有几个表 几张表看一下自己论文的物理设计 (3)数据库的表之间的联系 看一下自己论文中的ER图 (4)数据库的连接代码怎么写/找到数据库的连接代码 连接数据库的代码 ...查看


热门内容