Java 面试题-3

另有:java基础知识总结

1. 简述SSH概念及主要设计思想?

  • 集成 SSH 框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层。
  • 使用 Struts作系统的整体基础架构,负责 MVC 的分离,在 Struts 框架的模型部分,控制业务跳转,利用 Hibernate 框架对持久层提供支持,Spring 做管理,管理 struts和 hibernate。
  • 具体:用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本Java对象,编写基本的 DAO(Data Access Objects)接口,给出 Hibernate 的 DAO 实现,采用 Hibernate 架构实现的 DAO类来实现 Java 类与数据库之间的转换和访问,最后由Spring管理

2. 乐观锁和悲观锁

  • 悲观锁(Pessimistic Lock),很悲观每次拿数据时都认为别人会修改,每次在拿数据的时候都会上锁,这样想拿这个数据就会 block直到它拿到锁。传统关系型数据库里就用到很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作前先上锁。它指的是对数据被外界(包括本系统当前的其他事务,及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
  • 乐观锁(Optimistic Lock),拿数据时都认为不会修改,不锁,但在更新时会判断下在此期间有没有去更新这个数据,可使用版本号等机制。乐观锁适用于多读的应用类型,可提高吞吐量,像数据库如提供类似write_condition机制的其实都是提供的乐观锁。
  • 两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行 retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

3. 日志打印的 logj 4j 的配置中%t 表示什么?

%t 输出产生该日志事件的线程名
%M 是输出方法的名字、%m 是输出代码指定的日志信息。
指定的打印信息的具体格式 ConversionPattern,具体参数:
%m 输出代码中指定的消息
%p 输出优先级,即 DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该 log 信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows 平台为”rn”,Unix 平台为”n”
%d 输出日志时间点的日期或时间,默认格式为 ISO8601,也可以在其后指定格式,比如:%d{yyyy
MM dd HH:mm:ss,SSS},输出类似:2002 年 10 月 18 日 22:10:28,921 %l 输出日志事件的
发生位置,包括类目名、发生的线程,以及在代码中的行数。
%x: 输出和当前线程相关联的 NDC(嵌套诊断环境),尤其用到像 java servlets 这样的多客户多
线程的应用中。
%%: 输出一个”%”字符
%F: 输出日志消息产生时所在的文件名称
%M: 输出执行方法
%L: 输出代码中的行号

4. NotnWritablePropertyException 和 Could not open calss pathre source [ApplicationContext.xml]

  • 出现 NotWritablePropertyException 异常的原因一般是在 ApplicationContext.xml 中 property name 的错误等相关错误。

5. Web应用程序

  • WEB-INF 目录存在于 web 应用的根目录下
  • classes 目录位于 WEB-INF 目录之下
  • web.xml 在 WEB-INF 目录下
  • Web 应用程序可以打包为 war 文件

6. 有关 Servlet 的生命周期说法正确的

  • Servlet 的生命周期由 Servlet 容器管理(非实例)
  • Servlet 中的 init()方法有两个重载,一是空参的,另一个是带ServletConfig 形参的,而不是ServletContext
  • service()方法响应客户端发出的请求
  • destroy()方法释放 Servlet 实例

7. 有关会话跟踪技术描述正确的是

  • Cookie 是 Web 服务器发送给客户端的一小段信息,客户端请求时,可读取该信息发送到服务器端
  • 关闭浏览器意味着会话 ID 丢失,但所有与原会话关联的会话数据仍保留在服务器上,直至会话过期
  • 在禁用 Cookie 时可使用 URL 重写技术跟踪会话

8. 编写一个Filter ,需实现 Filter 接口

9. 构造函数constructor用于创建和初始化类中创建的一个对象的特殊方法。

  • constructor 在一个对象被 new 时被调用
  • 在一个构造方法中可以使用super关键字来调用一个父类的构造方法。

  • 如果没有显式指定构造方法,则会添加默认的 constructor 方法。

  • 如果不指定一个构造函数(constructor)方法, 则使用一个默认的构造函数(constructor)

10. EJB

  • EJB最初的设计思想考虑的是为分布式的应用服务的,分布式是针对大型应用构造的跨平台的协作计算,EJB最初的目的就是为这种计算服务的。
    但大多数应用不需采用分布式的解决方案,用EJB太臃肿了。Spring的出现恰恰为了解决这个问题。
    这两个框架有着一个共同的核心设计理念:它们的目标是为松耦合的POJO类提供中间件服务。框架通过在运行时截取执行环境,或将服务对象注射给POJO类的方式,将应用服务和POJO类“连接”起来。POJO类本身并不关注如何“连接”,而且也很少依赖于框架。
  • 区别:
    1. EJB来源于官方,一经通过,即成为了标准,Spring来源于开源社区,是由广大开发者共同参与开发的
    2. EJB是重量级的,而Spring是轻量级的,倡导零侵入性。
    3. 分布式能力。EJB主要被用来做分布式开发,但是Spring不具备分布式能力。
  • 联系:
    二者都是容器类框架。

11. 一些常用的类,包

  • 包:lang,util,awt,swing,io
    1. java.lang.*—–提供利用Java编程的基础类。最重要的类是Object(类层次结构的根)和Class(它的实例表示正在运行的应用程序中的类)。
    2. java.util.*—–集合框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期 Date 类、堆栈 Stack 类、向量 Vector 类等)。集合类、时间处理模式、日期时间工具等各类常用工具包
    3. java.io.*——提供了全面的 IO 接口。包括:文件读写、标准设备输出等。Java 中IO以流为基础进行输入输出,所有数据被串行化写入输出流,或输入流读入。
    4. java.net.*—–并非所有系统都支持 IPv6 协议,而当 Java 网络连接堆栈尝试检测它并在可用时透明地使用它时,还可以利用系统属性禁用它。在 IPv6不可用或被显式禁用的情况下,Inet6Address 对大多数网络连接操作都不再是有效参数。虽可保证在查找主机名时 java.net.InetAddress.getByName 类的方法不返回 Inet6Address,但仍可能通过传递字面值来创建此类对象。在此情况下,大多数方法在使用 Inet6Address 调用时都将抛出异常。
    5. java.sql.*—–提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是个关系数据库)中的数据的 API。包括一个框架,凭借此框架可动态安装不同驱动程序访问不同数据源。
  • 类:System, Math,Date,RunTime,Test

12. 对象,类,面向对象(OOP)

  • 类是具有相同属性和服务的一组对象的集合。为属于该类的所有对象提供了统一抽象描述,内部包括属性和服务两个主要部分。一个独立的程序单位,有一个类名并包括属性说明和服务说明两个主要部分。
  • 对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。
    • 更抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象,反映该事物在系统中需要保存的信息和发挥的作用;是一组属性和有权对这些属性进行操作的一组服务的封装体。客观世界是由对象和对象之间的联系组成的。
  • 就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节。(你办事我放心的思想)

13. final 修饰符,对程序有哪些影响?

  1. 修饰类:修饰类时,表明这个类不能被继承。final 类中的成员变量可根据需要设为 final,注意 final 类中的所有成员方法都会被隐式指定为final方法。
    除非这个类真在以后不会用来继承或出于安全的考虑,尽量不要设计为 final。
  2. 修饰方法:final 修饰的方法将不能被子类覆盖,主要用于 1:把方法锁定,以防继承类修改它。2.早期Java版本中,会将 final 方法转为内嵌调用,效率能够提升
  3. 修饰变量:一个 final 变量,如是基本数据类型则其数值在初始化后便不能更改;如是引用类型变量,初始化后不能再让其指向另一个对象。
    用final 作用于类的成员变量时,成员变量(类的成员变量,局部变量只需保证使用前被初始化赋值)须在定义时或构造器中进行初始化赋值,且final变量一旦被初始化赋值后,不能再被赋值。

14. 继承(inheritance)的优缺点

  • 优点:
    新的实现很容易,因为大部分是继承而来的 。很容易修改和扩展已有的实现
  • 缺点:
    打破了封装,基类向子类暴露了实现细节 。白盒重用,基类的内部细节常对子类是可见的 ,当父类的实现改变时可能要相应的对子类做出改变 ,不能在运行时改变由父类继承来的实现。

15. 脏数据,脏读

  • 脏数据在临时更新(脏读)中产生。事务 A 更新某个数据项 X, 出现问题,要把 A 回滚。回滚前另一个事务 B 读取了数据项 X 的值(A 更新后),A 回滚了事务,数据项恢复了原值。事务 B 读取的就是数据项 X 的就是一个“临时”的值,就是脏数据。
  • 脏读是当一个事务正访问数据,且对数据进行了修改,这种修改还没有提交数据库中,另外一个事务也访问这个数据,使用了这个数据。因这个数据是还没有提交的数据,那么另个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

16. equals和==

  1. ==比较非对象类型时,比较的是值。比较对象类型的时候比较的是引用地址。
  2. equals用于比较对象,比较结果取决于对象的具体实现。
    Java 面试题-3