JAVA面试题学习笔记(三)

  1. J2EE(Java2 Platform Enterprise Edition)是Java平台企业版的简称,是用来开发与部署企业级应用的一个架构,它提供了一 种统一的、开放标准的多层平台,该平台主要由构件、服务和通信三个模块构成。
    构件包含客户端构件和服务端构件两种类型,其中客户端构件主要包含两类:Applets和Application Clients,服务端构件分为两类:Web构件(Servlet与JSP)和EJBs(Enterprise Java Beans)。服务由J2EE平台提供商实现,分为Service API(开发时使用)和运行时服务。通信是由容器提供的支持协作构件之间的通信。

  2. Exception表示可恢复的异常,是编译器可以捕捉到的。它包含两种类型:运行时异常(Runtime Exception)和检查异常(Checked Exception)。
    1)检查异常是在程序中最经常碰到的异常,所有继承自Exception并且不是运行时异常的异常都是检查异常,比如最常见的IO异常和SQL异常。对于这种异常,都发生在编译阶段,Java编译器强制程序去捕获此类型的异常,即把可能会出现这些异常的代码放到try块中把对异常的处理的代码放到catch块中。这种异常一般在如下几种情况中使用:
    ①异常的发生并不会导致程序出错,进行处理后可以继续执行后续的操作。例如,当连接数据库失败后,可以重新连接后进行后续操作。
    ②程序依赖于不可靠的外部条件,例如,系统IO。
    2)对于运行时异常,编译器没有强制对其进行捕获并处理。如果不对这种异常进行处理当出现这种异常时,会由JVM来处理。在Java语言中,最常见的运行时异常有如下几种:NullPointerException(空指针异常)、ArrayStoreException(数据存储异常)、ClassCastException(类型转换异常)、InexOutOfBoundException(数组越界异常)、BufferOverflowException(缓冲区溢出异常)以及ArithmeticException(算术异常)等。
    出现运行时异常后,系统会把异常一直往上层抛出,直到遇到处理代码为止。如果没有处理块,则抛到最上层,如果是多线程就由Thread.run()方法抛出,如果是单线程,就被main()方法抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么整个程序也就退出了。所以,如果不对运行时异常进行处理,后果是非常严重的,一旦发生要么是线程中止,要么是主程序终止。
    在使用异常处理时,还需要注意以下几个问题:
    1)Java异常处理用到了多态的概念,如果在异常处理过程中,首先捕获了基类,然后再捕获子类,那么捕获子类的代码块将永远不会被执行。因此,在进行异常捕获的时候,正确的写法是:首先捕获子类,然后再捕获基类的异常信息。
    2)尽早抛出异常,同时对捕获的异常进行处理,或者从错误中恢复,或者让程序继续执行。对捕获的异常不进行任何处理是一个非常不好的习惯,这样的代码将非常不利于调试。当然,也不是抛出异常越多越好,对于有些异常类型,例如运行时异常,实际上根本不必处理。
    3)可以根据实际的需求自定义异常类,这些自定义的异常类只要继承自Exception类即可。
    4)异常能处理就处理,不能处理就抛出。对于一般异常,如果不能进行行之有效的处理最好转换为运行时异常抛出。对于没有处理的异常,最终JVM会进行处理。

  3. 在编程语言中,指针指向一块内存,它的内容是所指内存的地址;而引用是某块内存的别名。

  4. sleep与wait有什么区别?
    1)原理不同。sleep是Thread类的静态方法,是线程用来控制自身流程的,它会使此线程暂停执行指定时间,而把执行机会让给其他线程,等到计时时间到时,此线程会自动苏醒例如,当线程执行报时功能时,每一秒钟打印出一个时间,那么此时就需要在打印方法前面加上一个sleep方法,以便让自己每隔一秒执行一次,该过程如同闹钟一样。而wait是Object类的方法,用于线程间的通信,这个方法会使当前拥有该对象锁的进程等待,直到其他线程调用notify方法(或notifyAll方法)时才醒来,不过开发人员也可以给它指定一个时间,自动醒来。与wait配套的方法有notify和notifyAll。
    2)对锁的处理机制不同。由于sleep方法的主要作用是让线程休眠指定的一段时间,在时间到时自动恢复,不涉及线程间的通信,因此,调用sleep方法并不会释放锁。而wait方法则不同,当调用wait方法后,线程会释放掉它所占用的锁,从而使线程所在对象中的其他synchronized数据可被其他线程使用。举个简单例子,在小明拿遥控器期间,他可以用自己的sleep方法每隔十分钟调一次电视台,而在他调台休息的十分钟期间,遥控器还在他的手上。
    3)使用区域不同。由于wait方法的特殊意义,所以,它必须放在同步控制方法或者同步语句块中使用,而sleep方法则可以放在任何地方使用。
    4)sleep方法必须捕获异常,而wait、notify以及notifyall不需要捕获异常。在sleep的过程中,有可能被其他对象调用它的interrupt(),产生InterruptedException异常。由于sleep不会释放“锁标志”,容易导致死锁问题的发生,所以,一般情况下,不推荐使用sleep方法,而推荐使用wait方法。

  5. 优先级满足byte﹤short﹤char﹤int﹤long﹤float﹤double。

  6. JSP总共有6个操作指令:jsp:include、jsp:useBean、jsp:setProperty、jsp:getProperty、jsp:forward与jsp:plugin。
    jsp:include:用来在页面被请求的时候引入一个文件。
    jsp:useBean:用来寻找或者实例化一个JavaBean。它使得开发人员既可以发挥Java组件重用的优势,同时也避免了损失JSP区别于Servlet的方便性。
    jsp:setProperty:用来设置已经实例化的Bean对象的属性。
    jsp:getProperty:用来获取某个JavaBean的属性。
    jsp:foward:用来把请求转到一个新页面。
    jsp:plugin:用于在浏览器中播放或显示一个对象。

  7. 在Java语言中,除了8种基本数据类型,其他的类型都是对象。

  8. 数据库连接池的作用及机制:
    数据库连接是一种非常珍贵且有限的资源,尤其在多用户的网络应用环境中,更是如此。对数据库连接管理的好坏会直接影响整个系统的性能:一是建立与数据库的连接是一个耗时的操作,在页面应用中,如果每次用户的请求都需要建立新的数据库连接,那么响应时间就会很长,严重影响用户的体验;二是数据库的连接个数是有限制的,如果管理不好,用户经常建立与数据库的连接却忘记释放,运行时间久了,数据库的连接资源就会耗尽当有新的用户需要访问数据库的时候,此时就需要等待很长的一段时间直到有用户释放连接资源才能访问数据,这对系统的可用性有着严重的影响。因此,管理好数据库的连接资源对应用系统尤其是页面应用系统是非常重要的。
    数据库连接池负责分配、管理并释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个新的数据库连接,同时,它还负责释放空闲时间超过最大空闲时间的数据库连接,避免因为没有释放数据库连接而引起的数据库连接遗漏。在J2EE中,服务器在启动的时候会创建一定数量的池连接,并一直维持不少于此数目的池连接。当客户程序需要访问数据库的时候,就可以直接从池中获取与数据库的连接(获取一个空闲的连接),而不用去创建一个新的连接,同时标记该连接为忙状态。当使用完毕后再把该连接标记为空闲状态,这样其他用户就可以使用这个连接了。如果当前没有空闲的连接那么服务器就会根据配置参数在池中创建一定数量的连接。采用这种方法对数据库连接进行管理后可以大幅提高用户的响应时间,提高运行效率。另一方面,为了提高数据库操作的性能,数据库连接池会释放空闲时间超过最大空闲时间的数据库连接,以避免因为没有释放数据库连接而引起的数据库连接遗漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值