近期的面试题总结记录(1)

1. 描述MVC设计模式(以Java为例)
mvc设计模式在Java应用中主要体现在讲应用以view、controller、model的层次进行分离,以简单的应用为例就是view(html,jsp)提交一个请求,
controller(servlet)接受请求发给model(业务处理类)进行处理, 最终model将处理的结果返回给controller,然后由controller输出请求结果。

这种模式对开发团队开发有很大的好处,不同的人可以专注去做不同的事情,最终大家一起形成一个完整应用,对开发人员的要求也逐步降低,降低了人力成本。

2. 应用软件系统一个开发过程,分析你曾经实施过的一个案例。

初始阶段: 有售前人员了解需求提供解决方案演示
细化阶段: 确定需求要开发的内容和数量,指定开发周期。
构造阶段: 完成具体的开发,并在测试环境中测试,并作和主系统的集成相关测试。
交付阶段:  上线试运行,根据客户反馈调整,优化,整个项目进入到维护升级状态。

3.Overload和Override 的区别。 Overload的方法是否可以改变返回值的类型?

(1) Override (重写)
a. 方法名,参数,返回值完全相同。
b. 子类方法不能缩小父类方法的访问权限。
c. 子类方法不能抛出比父类方法跟多的异常(单子方法可以不抛出异常)。
d. 存在于父类和子类之间
e. 方法被定义为final不能被重写。

(2)Overload(重载)
a. 参数类型、个数、顺序至少一个不相同。
b. 不能重载只有返回值不同的方法名。
c. 存在父类和子类、同类中。
Overload 可以改变返回值的类型

4. TCP和UDP区别是什么?
(1). TCP是面向连接的,而UDP是无连接的,区别大致如下:
	a. UDP传送的数据单位协议是UDP,TCP传送数据单位的协议是TCP。
	b. UDP发送数据之前是不需要建立连接,因此减少了开销和发送之前的时延。
	c. TCP提供的是面向连接的服务,不提供广播和多播服务。
(2) 对方的运输层在收到UDP报文后,不需要给出任何确认。 TCP则需要确认。
(3) UDP没有拥塞控制的,它不保证可靠交付;TCP要提供可靠的,面向连接的运输服务。
(4) UDP用户数据报只有8个字节的首部开销,比TCP的20个字节的首部要少。

5. 简述XML在日常开发中的应用?使用XML有哪些优缺点?解析XML文档有哪几种方式?

(1) 用来作为一些配置文件,struts.ibatis,spring 等等。
(2) 作为数据的载体,比较在webservice,Ajax运用中都会用来传递一下数据。
	a. 要求web客户机在两个或多个不同的数据库之间传递信息的应用。
	b. 要求web客户机把同一数据以不同的表现方式提供给不同的用户应用。
优点:
a. XMl允许各种不同的专业开发和字节的特定领域有关的标记语言,这就使得该领域的人员交流变得可行。
b. XmL具有良好的保值性(数据丢失主要原因是没有人写出如何读取历史数据的节制和文档格式)。
c. 应用间交换数据。

解析的方法: 

a.多数解析器提供了至少两种API,通常是一个对象模型API和一个事件API(也称为流API)  DOM / JDOM
b. 第二种是事件API,比如SAX,JAXP。

DOM和SAX的区别:
(1) DOM 文档对象类型。 为XML文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻
    内存的树结构,然后代码就可以使用DOM接口来操作这个树结构。
优点:整个文档树在内存中,便于操作; 支持修改,删除,和重新排等多种操作。
缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间。
使用场合: 一旦解析了文档还需要多次访问这些数据;硬件资源充足(内存,CPU等)。

(2) 为解决DOM的问题出现了SAX; 事件驱动型,当解析器发现元素开始,元素结束,时发事件,响应事件。
优点: 不用事先加载整个文档,占用资源少; 
缺点: 不是持久的;事件过后,若没有保存数据,那么数据就丢了。
       无状态行: 从时间汇总只能得到文本,但不知道该文本属于哪个元素。
使用场合: 只需要XML文档的少量类容,很少回头访问;机器内存少。

6. servlet的生命周期及Servlet于CGI的区别
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对
应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,
并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
7.手写冒泡排序方法:
  public class BubbleSort{
       public static void main(String[] args){
           int score[] = {67, 69, 75, 87, 89, 90, 99, 100};
           for (int i = 0; i < score.length -1; i++){    //最多做n-1趟排序
               for(int j = 0 ;j < score.length - i - 1; j++){    //对当前无序区间score[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的)
                  if(score[j] < score[j + 1]){    //把小的值交换到后面
                       int temp = score[j];
                      score[j] = score[j + 1];
                       score[j + 1] = temp;
                 }
              }            
              System.out.print("第" + (i + 1) + "次排序结果:");
              for(int a = 0; a < score.length; a++){
                 System.out.print(score[a] + "\t");
             }
              System.out.println("");
         }
              System.out.print("最终排序结果:");
              for(int a = 0; a < score.length; a++){
                 System.out.print(score[a] + "\t");
         }
      }
  }

8.什么是WebService

(1) Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务,
    它是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;
    它是一种新的web应用程序分支,是自包含、自描述、模块化的应用,可以发布、定位、通过web调用。
(2)Web Service是一个应用组件,它逻辑性的为其他应用程序提供数据与服务.各应用程序通过网络协议和规定的一些标准数据格式(Http,XML,Soap)来访问Web Service,通过Web Service内部执行得到所需结果.
   Web Service可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。

在构建和使用Web Service时,主要用到以下几个关键的技术和规则:
  1.XML:描述数据的标准方法.
  2.SOAP:表示信息交换的协议.
  3.WSDL:Web服务描述语言.
  4.UDDI:找到服务驱动器的的方法;
WebService的主要目标是跨平台的可互操作性。

为了达到这一目标,WebService完全基于XML(可扩展标记语言)、XSD(XMLSchema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。

9. Hibernate中get()和load()区别
1.从返回结果上对比load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常;get方法检索不到的话会返回null
2.hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;
  而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

10 将123 转换成321的编程

int num1 = 123,num2 = 0;
int tmp  = 100;
while(num1 != 0)
{
    num2 += num1 %10 * tmp;
     后面求个位和十位 相加即可。
}

11. Hibernate 有几级缓存,各有什么用?
有两级缓存,作用如下:
a. 减少数据库的反复问频率,提高访问性能。
b. 保证缓存中的对象和数据库中同步,位于缓存中的对象称为持久化对象。
c. 当持久化对象之间存在关联时,Session保证不出现对象图的死锁。



12. 当有百万用户来访问一个网站时,用什么来优化? 请描述。

a. 考虑使用服务器负载均衡。
b. 存储设备可以使用服务器集群。
c. 尽量避免使用MS SQL server.


13. 系列化有什么用?
系列化是一种用来处理对象流的机制, 所谓对象流也就是将对象的内容进行流化。可以对流化后的对象那个进行读写操作。
也可以将流化后的对象传输与网络之间。 序列化解决了对象流进行读写操作时引发的问题。
14 连接池的工作原理?

   J2ee服务器启动时会建立一定数量的连接池,并一直保持不少于该数目的池连接。 客户端程序需要连接时,池驱动程序会返回
一个未使用的池连接并将其记为忙。如果当前没有空闲连接时,会等待直到有空闲的为止。当使用的池连接调用完成后,池驱动程序
将此连接记为空闲,其它调用此时就可以使用这个连接。

15 抽象类和接口的区别?
a. 在类继承抽象类时可以事先其中的部分方法,而接口必须实现全部方法。
b. 在接口中无成员变量,而抽象类中可以有。
c. 接口中不能有非抽象方法,但抽象类中可以有。
d. 一个类可以实现多个接口,但只能有一个父类。

16.StringBuffer 和StringBuild的区别?
a.如果有频繁作字符串附加的需求,使用StringBuilder会让程序的效率大大提高.

b.StringBuilder被设计为与StringBuffer具有相同的操作接口。
  在单机非多线程(Multithread)的情况下使用StringBuilder会有较好的效率,因为StringBuilder没有处理同步(Synchronized)问题。
  StringBuffer则会处理同步问题,如果StringBuilder会在多线程下被操作,则要改用StringBuffer,让对象自行管理同步问题。

说明一点:String的操作都是改变赋值地址而不是改变值操作

17 Struts1.* 和Struts2.*的区别。
a. 在Action实现类方面: Struts1要求Action继承一个抽象基类;struts2可以实现一个Action接口,它也会提供一个ActionSupport基类实现接口。
b. 线程方面: Strtus1 Action是单例模式并且必须是线程安全,因为仅有Action的一个实例来处理所有的请求。
	      Struts2 Action为每一个请求产生一个实例,因此没有线程安全问题。
3. Servlet依赖方面: struts1 Action依赖ServletAPI(因为struts1 Action的execute方法中有request,response方法)
		     struts2 Action不再依赖Servlet API,从而允许Action脱离Web容器。
4.可测性方面:
a. 测试Struts1 Action的一个主要问题是execute方法依赖于Servlet API,这使得Action的测试	  要依赖于Web容器。为了脱离Web容器测试Struts 1的Action,必须借助于第三方扩展 
b.Struts 2 Action可以通过初始化、设置属性、调用方法来测试。 
5.封装参数方面:
Struts1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:ActionForm。
		
Struts 2直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐

6.表达式语言方面: 
Struts 1整合了JSTL,因此可以使用JSTL表达式语言。
Struts 2可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此,Struts 2下的表达式语言功能更加强大

18 Java内存泄露
(1) 内存泄露是指在程序运行过程中会不断的分配内存空间,那些不再使用的内存空间应该即时回收它们,从而保证可以保证系统可以再次使用这些内存。
    如果存在无用的内存没有被收回来,那就是内存泄露。   
说明: 对于数组的操作,堆和栈的操作需要慎重的考虑是否存在内存泄露(出栈时没有清理最后一个元素即没有对最后一个元素置空)
(2) 垃圾回收机制:
a. 跟踪并监控每个java对象,当某个对象处于不可达的状态时,就回收该对象所占用的内存。
b. 清理内存分配、回收过程中产生的内存碎片。
避免内存泄露的小技巧
a. 尽量使用直接量,对于Byte、Short、Integer、Long、Float、Double、Bolean、Character程序不应该使用new 方式创建对象,而采用直接量创建它们。

b. 使用StringBuilder和StringBuffer进行字符串连接
   Sting和StringBuilder以及StringBuffer等都可以代表字符串,其中String字符串代表的是不可变的字符串,后两者表示可变的字符串。
   如果使用多个String对象进行字符串连接运算,在运行时可能产生大量临时字符串,这些字符串会保存在内存中从而导致程序性能下降。
c. 尽量少使用静态变量
类的静态变量的生命周期和类同步的。在类不被卸载的情况下,类对应类对象会常驻内存,知道程序运行结束。
如下代码就会存在内存泄露问题:
class  Person
{
	static Object obj = new Object();
}

d.避免在经常调用的方法、循环中创建Java对象。

e. 缓存经常使用的对象
   如果有些对象需要经常被用到,可以考虑把这些对象用缓存池保存起来,下次用的时候直接从池中拿。典型的就是数据连接池。
   如果系统中还有一些常用的基础信息,可以考虑用缓存,实现缓存的方式有如下两种:
   (1) 使用HashMap进行缓存。
   (2) 直接使用某些开源的缓存项目。
   说明:缓存设计本身就是一直以牺牲系统空间来换取运行时间的技术。   
f. 考虑使用SoftReference
   当程序需要创建长度很大的数组时,可以考虑使用SoftReferene来包装数组元素,而不是直接让将数组元素来引用对象。
此时SoftReference是个很好的选择:当内存足够时,它的功能等同于普通引用;当内存不足时,它会牺牲自己,释放软引用所引用的对象。
注意:由于软引用引用对象的不确定性(软引用所获取的对象可能为null),所以程序取出SoftReference所引用的Java之后,应该显式判断该对象是否为null; 当该对象为null时,应该重建该对象。


猜你喜欢

转载自wkf41068.iteye.com/blog/1827253
今日推荐