1.public、private、protected 所修饰的类的访问范围?
答:public 表示全局,内部类外部子类都可以访问;
private表示私有的,只有本类内部可以使用;
protected表示受保护的,只有本类或子类或父类中可以访问;
2.hashtable与hashmap的区别?
答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
3.垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
答:对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当GC确定一些对象为”不可达”时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
4.sql优化的几种方法?(这个比较重要)
答:A、尽量避免用select * from xxx where abc like '%xxx'类型的模糊查询,因为%在前面的话是无法利用到索引,必然会引起全量SCAN操作。应该找寻替代方式或用前置条件语句把like查找之前的行数减到最低。
B、尽量避免对大表数据进行select top n * from xxx where xxxx order by newid()的取随机记录的操作。newid()操作会读全量数据后再排序。也会占用大量CPU和读操作。可以考虑用RAND()函数来实现,这方面我还在研究中,对于整表操作比较好弄,比如id>=(select max(id) from table)*rand()。但如果取局部数据的随机记录还需要思量。
C、在SQL Server Profiler记录中会看到Audit Logout会占用大量CPU和读写等操作。查了一些资料称是某个链接在某次连接过程中执行SQL语句产生的总数,不用过于担心。看下来的确似乎这样,很多Audit Logout的CPU和IO消耗量和之前优化的语句基本一致。所以在第5点我提的SQL语句用textdata is not null条件把Audit Logout给隐去。
D、两个不同字段OR语句会导致全表扫描。例如 where m=1 or n=1。如果建立一个索引是m和n,同样会引起scan,解决方法是给m和n分别建立索引。测试12万条数据的表,索引建立错误的情况下IO开销高达 10.xxx,分别建立索引后,全部变成0.003,这个反差是非常巨大的。虽然会引起INSERT操作的性能问题,但毕竟大部分瓶颈在SELECT的读操作上。
E、索引查找(Index Seek)和索引扫描(Index Scan),我们需要的是前者,而引起后者的原因通常是某个索引里的字段多余要查找的,例如索引建立在A和B两个字段,而我们只要查找A,则会导致 INDEX SCAN。建议针对单独的A建立索引,以形成索引查找。
F、对于小表不建议建立索引,特别是几百的数据量,只有上千上万级别的数据建立索引才有效果。
5.<jsp:bean>的几种应用范围?jsp有哪些动作?作用分别是什么?
答:page是当前页面;request是指提交,就是可以将这个值传到你提交到的另一个页面或者是servlet去;
session是会话中,每个用户进入后,就会各个不一样的会话,只要当前会话没有消除,就可以在这个会话的任何地方调用得到;
appliaction是指程序中,范围最大,系统中的任何一个模块都可以调用得到;
对比得知application>session>request>page,虽然作用域大,同时也会占资源,根据自己的程序需求,选择相应的.
JSP共有以下6种基本动作 jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个JavaBean。 jsp:setProperty:设置JavaBean的属性。 jsp:getProperty:输出某个JavaBean的属性。 jsp:forward:把请求转到一个新的页面。 jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。
6.Runable 接口的作用,实现多线程除了Runable外,还有什么方式?sleep() 和 wait() 有什么区别?
答:线程实现的两种方式:继承Thread或实现Runnable接口,继承Thread后可以定义此类的对象直接调用start()方法,实现Runable接口后,需要创建此类的对象赋给Thread构造方法,再调用start()
线程的状态:新建、start()就绪、(得到cpu)运行、(发生IO阻塞、wait)阻塞、(代码运行结束或人工结束)死亡
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
7.“==”和equals的区别?
答:==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。"=="比较的是2个对象的地址,而equals比较的是2个对象的内容。
8.Serialization和DeSerialization是什么?
答:
9.接口runnable的功能?
答:我们使用Runnable接口实现了线程,而没有通过创建线程类的派生类的方式。使用Runnable接口,需要我们实现run方法。我们也需要创建Thread对象的一个实例,它最终是用来调用run方法的。在小程序中的start方法中,我们通过使用thread建构方法产生一个Thread对象的实例,其参数就是实现Runnable接口的任何类。 Thread 对象启动已经定义好的run 方法,而run方法是用来进行动画显示的。当然,从线程类中派生出一个类,并在Applet派生类中创建实例,我们可完成同样的事情。
10.tag<jsp:userBean>的不同取值范围(scope) ?
答:有四种scope,分别是:
a).scope=page,就是当前页面有效??。
答:在page范围中的对象只能在他们被创建的页中被访问。在应答从jsp也送回到客户端之后或者请求被送到其他地方之后,对这样的对象的所有引用将被释放。对page范围内对象的引用被保存在pageCcontext隐含对象中。
b).scope=request,就是当前页面及当前页面提交请求转向的那个页面有效?而直接用request.getAttribute("aaa"),就可以得到这个bean,是么?
答:在request范围内的对象能被与他们被创建的页处理同样request的页来访问。所有对该对象的引用必须在request 处理之后被释放;特别地,如果在同样的运行时间request被传递一资源,该对象是可访问的。对request范围内的对象的引用被保存在request隐含对象中。
c).scope=session,是不是就是在整个session中都可以用第一次已经实例话的bean?
答:在session范围内的对象能被处理请求所在的session与对象创建时的session一样的页中访问。在一个不是session的页的内部定义个session范围的对象是非法的。当相关session停止时所有对该对象的引用必须被释放。对session范围的对象的引用被保存在与页激活相关的session对象中。
d).application和session的区别好象搞不清,因为感觉用户登陆上来,就有一个session,用户退出,session就没有了,从用户登陆到用户离开,在整个session内,bean都起作用,这个范围和application感觉没有什么区别呀?application好象用不上?
答:在application范围内的对象能被处理的请求所在的application与该对象被创建时的application相同的页来访问。当运行时刻的环境回收servletcontext时,所有对该对象的引用必须被释放。apolication范围内的对象能被无会话(session)意识的页来定义(访问)。对application范围的对象的所有引用被保存在与页激活相关的application对象中。
11.关键字protected作用域?
答:在Java中有四种不同的作用域,分别是 public protected default 和private,这四种不同的作用域的限制由前到后逐渐的增加。
现在来看看public的作用域,在所有的作用域中,public可谓是最宽松的,在编写类文件的时候,只要该类以public关键字修饰,那么这个类的类文件就必须以该类的简单类名来命名。在类的内部,被它修饰的无论是参数还是方法,都可以在任何地方访问的到(当然前提是这个类是公开的,就是上文说到的是以public关键字修饰的类)。
而对于protected作用域来说,它的限制就严格了一点,它只允许本类、同一个包内的其他类(这个类不是它的子类)或者它的子类使用被它修饰的方法或者参数(以protected修饰的类貌似还没遇到过,O(∩_∩)O~,有用过的给个提醒),子类使用父类中的protected方法或者参数时不受包位置的影响,这就意味着,即使位于不同包的类想要调用它父类的protected方法或者参数也是被允许的。
对于default作用域(即不加任何的关键字修饰的方法或者参数),它的限制就严格的多了,除了本类和本包中的类能访问以外,就是不在同一个包内的它自己的子类也不能访问(有点像老子跟儿子分家了,老子的东西就不能给儿子用了一样O(∩_∩)O~)。
private作用域在这四种之内是最为严格的,除了它自己,哪怕是同包内的其他类都不允许使用。通常我们使用这个关键字来实现对类的方法的隔离,它意味着,除了本类的方法能够调用这个私有化成员以外,其他的包括同包中的类和子类都不能访问这些个私有的成员。(肥水不流外人田嘛,能被private修饰的东东怎么说也是相当有价值的了)。
12.Stratus 2.0工作原理?
答:struts2并不是一个陌生的web框架,它是以Webwork的设计思想为核心,吸收struts1的优点,可以说
struts2是struts1和Webwork结合的产物。
struts2 的工作原理图:
一个请求在Struts2框架中的处理分为以下几个步骤:
1).客户端发出一个指向servlet容器的请求(tomcat);
2).这个请求会经过图中的几个过滤器,最后会到达FilterDispatcher过滤器。
3).过滤器FilterDispatcher是struts2框架的心脏,在处理用户请求时,它和请求一起相互配合访问struts2的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。过滤器会通过询问ActionMapper类来查找请求中需要用到的Action。
4).如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象。ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。
5).ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了Action的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和所有的Interceptor。
6).ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在调用Action的过程前后,涉及到相关拦截器(intercepetor)的调用。
7). 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。
13.Stratus 1.0 和 Stratus2.0的区别
1),在Action实现类方面:
Struts1要求Action类继承一个抽象基类;Struts1的一个具体问题是使用抽象类编程
而不是接口。Struts2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制服务成为可能。
Struts2 提供一个ActionSupport基类去实现常用的接口。即使Action接口不是必须实现的,只有一个包含
execute方法的POJO类都可以用作Struts2的Action。
2),线程模式方面:
Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
3),Servlet依赖方面:
Struts1 Action依赖于Servlet API,因为Struts1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。
Struts2 Action 不再依赖于ServletAPI,从而允许Action脱离Web容器运行,从而降低了测试Action的难度。当然,如果Action 需要直接访问HttpServletRequest和HttpServletResponse参数,Struts2 Action仍然可以访问它们。但是,大部分时候,Action都无需直接访问
HttpServletRequest和HttpServletResponse,从而给开发者更多灵活的选择。
4),可测试方面:
测试Struts1 Action的一个主要问题是execute方法依赖于Servlet于ServletAPI,这使得Action 仍然的测试要依赖于Web容器。为了脱离Web容器测试Struts1 的Action,必须借助于第三方扩展:Struts TestCase,该扩展下包含了系列的Mock对象,从而脱离Web容器测试Struts1的Action类。
Struts2Action可以通过初始化,设置属性,调用方法来测试。
5),封装请求参数方面:
Struts1 使用ActionForm对象封装用户的请求参数,所有的ActionForm 必须继承一个
基类:ActionForm。普通的JavaBean不能用作ActionForm因此,开发者必须创建大量的ActionForm类封装用户请求参数。虽然Struts1 提供了动态ActionForm 来简化ActionForm 的开发,但依然需要在配置文件中定义ActionForm; Struts2 直接使用Action 属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的繁琐,实际上,这些属性还可以是包含子属性的Rich对象类型。如果开发者依然怀念Struts1 ActionForm 的模式
Struts 2 提供了ModelDriven 模式,可以让开发者使用单独的Model 对象来封装用户请求参数,但该Model对象无须继承任何Struts2基类,是一个POJO,从而
降低了代码污染。
6),表达式语言方面:
Struts1 整合了JSTL,因此可以使用JSTL表达式语言。这种表达式语言有基本对象图遍
历,但在对集合和索引属性的支持上则功能不强
Struts2 可以是用JSTL,但它整合了一种更强大和灵活的表达
式语言:OGNL(Object Graph Notation Language),因此,Struts2下的表达式语言功能更加强大。
7),绑定值到视图方面:
Struts1 使用标准JSP机制把对象绑定到视图页面;
Struts2 使用“ValueStack”技术,使标签能够访问值,而不需要把对象和视图页面绑定在一起。
8),类型转换的方面:
Struts 1 ActionForm 属性通常都是String 类型。 Struts1 使用
Commons-Beanutils 进行类型转换,支持基本数据类型和常用对象之间的转换。
9),数据校验的方面:
Struts1 支持在ActionForm 重写 validate方法手动校验,或者通过整合Commonsalidator框架来完成数据校验。
Struts2 支持通过重写validator方法进行校验,也支持整合XWork校验框架进行校验
10),Action执行控制的方面:
Struts1 支持每一个模块对应一个请求处理(既生命周期的概念),但是模块中的所有Action必须共享相同的生命周期。
Struts2支持通过拦截器堆栈为每一个Action 创建不通的生命周期。开发者可以根据需要创建相应堆找,从而和不同的Action一起使用。
14.java基础包的介绍?
java.lang包:Java语言包,主要包含与语言、数据类型相关的类。程序运行时,编译器自动引入该包
java.awt包和javax.swing包:提供了创建图形界面元素的类,通过这些类,可以控制应用程序的外观界面
java.io包:Java输入/输出包,包含与输入和输出操作相关的类,提供了不同的输入/输出设备读写的支持
java.util包:实用程序包,提供实现不同功能的类。
java.net包:Java网络包,提供与网络操作相关的类
java.sql包:包含了与数据库编程相关的类/接口