java-SSH面试题
待余离北辞
于 2017-09-20 10:48:06 发布
1 . BeanFactory的作用是什么? [中] BeanFactory是配置、创建、管理bean的容器,有时候也称为bean上下文。Bean与bean的依赖关系,也是由BeanFactory负责维护的。 2 . bean在spring的容器中两种基本行为是什么? [中] Singleton:单态 Non-singleton或prototype:原型 3 . spring配置文件中的ref元素的作用是什么?它的两个基本属性是什么? [中] 用于指定属性值为spring容器中的其它bean.两个基本属性是bean和local 4 . 什么是DWR?它有哪些功能? [中] DWR(Direct Web Remoting)是一个WEB远程调用框架. 可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript DWR根据Java类来动态生成JavaScrip代码. 支持Dom Trees,支持Spring,支持commons-logging 5 . Ajax的工作原理 ? [难] 在会话的开始,浏览器加载Ajax引擎 请求动作通过JavaScript调用Ajax引擎来代替. 引擎负责绘制用户界面以及与服务器端通讯。 Ajax引擎采用异步交互过程--不用等待服务器的通讯。 6 . XMLHttpRequest对象是什么,它有哪些常用方法? [难] 一个 JavaScript 对象。是Ajax 的核心。 该对象的方法和属性。 open():建立到服务器的新请求。 send():向服务器发送请求。 abort():退出当前请求。 readyState:提供当前 HTML 的就绪状态。 responseText:服务器返回的请求响应文本。. 7 . XMLHttpRequest有哪些属性, 它的值分代表什么?[ 中] 8 . 什么是Ajax? [易] AJAX(Asynchronous JavaScript and XML),它不是一门新的语言或技术,而是多种技术的综合,包括: Javascript XHTML CSS DOM XML XSTL XMLHttpRequest 9 . 同步与异步的区别? [ 难] 普通B/S模式(同步)AJAX技术(异步) 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事,而异步则是 请求通过事件触发->服务器处理->处理完毕 同步是阻塞模式,异步是非阻塞模式。 同步(发送方发出数据后,等接收方发回) 异步(发送方发出数据后,不等接收方发回响应) 10 . Struts+Hibernate+Spring开发模式中Hibernate扮演的角色 [中] 答:Hibernate扮演的是数据持久层 它的作用是实现持久化对象和数据库表 之间的映射,形成持久化对象和数据库表中数据的一个转换平台 11 . 什么是Hibernate 的抓取策略 [难] 抓取策略是指当应用程序需要利用关联关系进行对象获取的时候。 12 . 何为容器 [中] 容器就是符合某种规范的能够提供一系列服务的管理器。 13 . Spring实现了那几种模式 [中] 答: 工厂模式 和 单例模式 14 :Hibernate实体对象生命周期的三种状态 [难] 答 Transient(瞬态) ,persistent(持久态)和Detached(游历态) 15 : HQL查询参数的处理方法 [中] 答:直接将参数拼写为HQL语句 通过参数名称来标识参数 16 . Hibernate实体之间的关联关系的三种形式 [中] 答 一对一关联 一对多关联 多对多关联 17 . Hibernate具用的三种检索方式 [难] 答:HQL检索方式 QBC检索方式 SQL检索方式 18 . spring 中<Bean>的depends-on属性是什么 [中] Depends-on用于当前Bean初始化之前显示的强制一个或多个bean被初始化 19 . spring 中的BeanWrapper类是什么 [难] BeanWrapper类是一个对JavaBean进行各种操作的工具类 BeanWrapper本身是一个接口BeanWrapperImpl实现了BeanWrapper 20 . <set>元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值? [难] 答:save-update 21 . Hibernate中session什么时候是游离态 [中] 答:session.close();方法后 22 . Hibernate中映射文件<hibernate-mapping> inverse属性和cascade属性的区别 [中] 答:inverse属性只存在于集合标记的元素中集合元素包括<set/>,<map/>,<list/>,<array/>,<bag/> Inverse属性的作用是是否将对集合对象的修改反射到数据库中 inverse=” false ”时修改反射到数据库中 inverse=” true ” 时修改不反射到数据库中 Cascade属性的作用是描述关联对象进行操作时的级联特性,因此只有涉及到关系的元素才有cascade属性 23 . : Hibernate中Session对象的load()方法和get()方法的区别(请列举出两点)[难] 答:①记录不存在时 get()方法会返回空( null ),而load()方法将会抛出一个HibernateException异常 ② load()方法查询数据时会先找Hibernate的内部缓存和二级缓 存中的现有数据,get()方法在内部缓存中没有打到相对应的数据时装直接执行SQL语句 进行查询 24 . : Hibernate中HQL属于什么语言 [易] 答:HQL是面向对象的查询语言,它可以查询以对象形式存在的数据。 25 . Hibernate简介以及主要功能 [中] 答:Hibernate是采用ORM模式实现数据持久层的一个优秀的JAVA组件,它提供了 强大,高效的将JAVA对象进行持久化操作的服务 26 . 简述Hibernate的优点 [难] 答:开源和免费的License,我可以在需要的时候研究源代码,改写源代码,进行功能的定制。轻量级封装,避免引入过多复杂的问题,调试容易,也减轻程序员的负担。 具有可扩展性,API开放,当本身功能不够用的时候,可以自己编码进行扩展。 27 . 怎样构建SessionFactory [难] 答: Hibernate的SessionFactory接口提供Session类的实例,Session类用于完成对数据库的操作。 由于SessionFactory实例是线程安全的(而Session实例不是线程安全的),所以每个操作都可以共用同一个SessionFactory来获取Session。Hibernate配置文件分为两种格式,一种是xml格式的配置文件,另一种是Java属性文件格式的配置文件 28 . :从XML文件读取配置信息构建SessionFactory的具体步骤如下。 [难] ( 1 )创建一个Configuration对象,并通过该对象的configura()方法加载Hibernate配置文件,代码如下。 Configuration config = new Configuration().configure(); configura()方法:用于告诉Hibernate加载hibernate.cfg.xml文件。Configuration在实例化时默认加载classpath中的hibernate.cfg.xml,当然也可以加载名称不是hibernate.cfg.xml的配置文件,例如wghhibernate.cfg.xml,可以通过以下代码实现。 Configuration config = new Configuration().configure( "wghhibernate.cfg.xml" ); ( 2 )完成配置文件和映射文件的加载后,将得到一个包括所有Hibernate运行期参数的Configuration实例,通过Configuration实例的buildSessionFactory()方法可以构建一个惟一的SessionFactory,代码如下: SessionFactory sessionFactory = config.buildSessionFactory(); 构建SessionFactory要放在静态代码块中,因为它只在该类被加载时执行一次。 29 . 写出使用构造方法进行注入的关键代码 [难] <bean id=”constructBean” class =”com.huang.ConstructBean”> <constructor-arg><ref bean=”bean_1”/></ constructor-arg > <constructor-arg><ref bean=”bean_2”/></ constructor-arg > <constructor-arg><ref bean=”bean_3”/></ constructor-arg > </bean> 30 . 什么是IOC? [难] 不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在Spring 框架中是 IOC 容器) 负责将这些联系在一起。 就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控,控制权由应用代码中转到了外部容器,控制权的转移,就是所谓的反转。 31 . 编程题: 写一个Singleton出来。 [难] Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 第一种形式: 定义一个类,它的构造函数为 private 的,它有一个 static 的 private 的该类变量,在类初始化时实例话,通过一个 public 的getInstance方法获取对它的引用,继而调用其中的方法。 public class Singleton { private Singleton(){} private static Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } } 第二种形式: public class Singleton { private static Singleton instance = null ; public static synchronized Singleton getInstance() { if (instance== null ) instance= new Singleton(); return instance; } } String tempStr = "" ; try { tempStr = new String(str.getBytes( "ISO-8859-1" ), "GBK" ); tempStr = tempStr.trim(); } catch (Exception e) { System.err.println(e.getMessage()); } return tempStr; } 32 . J2EE是技术还是平台还是框架? [中] J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。 33 . 我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859- 1 等,如何输出一个某种编码的字符串? [难] Public String translate (String str) { String tempStr = "" ; try { tempStr = new String(str.getBytes( "ISO-8859-1" ), "GBK" ); tempStr = tempStr.trim(); } catch (Exception e) { System.err.println(e.getMessage()); } return tempStr; } 34.如何使用静态工厂方法来创建Bean的实例 [易] <bean id=”staticFactoryBean” class =”com.huang.StaticFactoryBean” factory-method=”静态方法名”/> 相当于: StaticFactoryBean staticFactoryBean=StaticFactoryBean.静态方法名 使用实例化的工厂方法来创建Bean的实例 <!—注意此时bean的 class 属性为空--> <bean id=”dynamicFactory” class =”com.huang.DynamicFactory”/> <bean id=”dynamiceFactoryBean” factory-bean=”dynamicFactory” Factory-method=”方法名”/> 相当于: DynamicFactory dynamicFactory= new DynamicFactory(); DynamiceFactoryBean dynamiceFactoryBean=dynamicFactory.方法名 35 . 从Java属性文件读取配置信息构建SessionFactory的具体步骤如下: [难] ( 1 )创建一个Configuration对象,此时Hibernate会默认加载classpath中的配置文件hibernate.properties,代码如下。 Configuration config = new Configuration(); ( 2 )由于在配置文件中缺少相应的配置映射文件的信息,所以此处需要通过编码方式加载,这可以通过Configuration对象的addClass()方法实现,具体代码如下。 config.addClass(BranchForm. class ); addClass()方法用于加载实体类。 ( 3 )完成配置文件和映射文件的加载后,将得到一个包括所有Hibernate运行期参数的Configuration实例,通过Configuration实例的buildSessionFactory()方法可以构建一个惟一的SessionFactory,代码如下。 SessionFactory sessionFactory = config.buildSessionFactory(); 36 . spring框架的 7 个模块是什么? [ 难] 答: ( 1 ) spring AOP --面象切面编程 ( 2 )spring DAO --数据访问对象 ( 3 )spring ORM --对象关系影射 ( 4 )spring Contect -- 上下文配置,向Spring框架提供上下文信息 ( 5 )spring WEB - -WEB上下文模块 ( 6 )\spring WEB-MVC --实现了MVC ( 7 )spring CORE –核心容器提供Spring框架基本功能 37 . 什么是AOP 请祥述 [中] 答: 是面向切面编程 AOP 把软件系统分为两个部分:核心关注点和横切关注点。所谓的核心关注点,是业务处理的主要流程,也就是说这个解决方案要做的事。所谓横切关注点,是与核心业务无关的部分,它把常发生在核心关注点的多处,而各处基本相似,如日志,事务,权限等 。 38 . Hinbernate和EJB的区别 [中] 答:Hibernate可以用在任何JDBC使用的场合,例如Java应用程序的数据库访问代码,DAO接口的实现类,甚至可以是BMP里面的访问数据库的代码。从这个意义上来说,Hibernate和EB不是一个范畴的东西,也不存在非此即彼的关系。 39 . 一般情况下,关系数据模型与对象模型之间有哪些匹配关系 [难] 答:表对应类 记录对应表的对象 表的字段对应类的属性 40 . 事务隔离级别是由谁实现的? [难] 答:数据库系统‘ 41 . 什么是IOC [难] 答:IOC 是控制反转,实现了对象之间的依赖关系的转移成而使程序的菘耦合 42 . 在Spring中给属性有几种赋值方式 请祥叙 [难] 答:有四种 分别是 ( 1 )普通属性赋值 ( 2 )集合属性赋值 ( 3 )Properties赋值 ( 4 )Map 属性赋值 43 . 在Spring说说Bean的alias元素和name属性有什么区别 [难] 答: <bean>元素name属性可以一次为<bean>定义多个别名 例:<bean id=”beanName” name=”alias_1,alias_2”/> <alias>元素一次只能定义一个别名 例:<alias name=”beanName” alias=”toName”/> 注意: alias元素name属性是bean实例名 44 . Bean 的作用域用几种,请祥叙 [难] 答: 用 5 种 分别是: 1 . singleton IOC容器只会创建一个Bean的唯一的实例 2 . prototype IOC容器在每次请求该Bean的时候都创建一个新的实例 3 . request 在一次Http请求中 IOC容器会返回该Bean的同一个实例,而对于不同的用户请求,则会返回不同的实例 4 . session 在一次Http请求Session 中 IOC容器会返回该Bean的同一个实例,而对于不同的用户Session,则会返回不同的实例 5 . global session在一个全局Http请求Session 中 45 . 简述什么是ORM [中] 答:ORM的全称是Object-Relational Mapping 翻译成中文就是“对象-关系映射” ORM组件的主要功能就是实现实体域对象的持久化并封装数据库访问的细节 ORM本身并不是一个组件,它是具用某种功能的组件的总称,也可以说是一种框 架结构 46 .:struts中的几个关键对象的作用(说说几个关键对象的作用) [中] struts中的几个关键对象:Action Global(设置语言靠它了) ModuleConfig(获取mapping), 47 .Action的作用 [中] Action的作用是接受用户的请求,通过调用业务方法实现业务处理的功能。 48 . 在通常情况下软件系统由表示层,业务层,持久层和数据库层组成,Struts属于哪一层? [难] Struts属于表示层组件,它的作用主要体现在以下几个方面: 1 ) 输出用户界面和接收用户的输入,实现与用户的交互。 2 ) 调用业务方法,完成业务处理,还要包括处理后的显示工作。 48 :Struts标签库由哪些组件组成? [难] 标签库是组合在一起的一组JSP自定义标签。 标签库由以下组件组成: 1 ) 标签处理程序 2 ) 标签库描述符(TLD)文件 3 ) 应用程序部署描述符(web.xml)文件 4 ) JSP页面中标签库的声明 49 . 用<bean:write>读出一个URL和一个名称, [难] 用<html:link>的话怎么组合起来。 即要达到这样的效果 <a href= "<bean:write name=" data " property=" url ">" > <bean:write name= "data" property= "tilte" > </a> <html:link page= "<bean:write name=" data " property=" url ">" > <bean:write name= "data" property= "title" /> </html:link> 会报出属性data无值的错误!(page= "<bean:write name=" data " property=" url ">" 中的data无值。) 50 :怎样才能配置<html:button>的资源文件? [难] 在资源文件 ApplicationResourses.properties 中加入 label.login=login 在jsp页面写: <html:button name= "btn_login" ><bean:message key= "label.login" /></html:button> 这样显示页面时,button上就会显示label.login的对应内容“login” 51 . 说说struts框架,的方法的工作原理或流程 [易] 答: 对于采用Struts框架的web应用, 在web应用启动时会加载并初始化ActionServlet,ActionServlet从struts-config.xml中读取配置信息, 把它们存放到各种配置对象中,例如把Action的映射信息存放在ActionMapping对象中。 当ActionServlet接收到客户请求时,执行以下流程: 1 .检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效信息; 2 .如果ActionForm实例不存在,就创建一个ActionForm对象并在其中保存客户提交的表单内容; 3 .根据配置信息决定是否调用ActionForm的validate()方法; 4 .如果ActionForm的validate()方法返回 null 或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功; 5 .ActionServlet根据ActionMapping实例包含的映射信息将请求转发给Action(如果Action实例不存在,就先创建Action实例),然后调用Action的excute()方法; 6 .Action的excute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件; 7 .ActionForward对象指向的JSP组件生成动态网页,返回给客户。 52 : strust的Action是不是线程安全的? [难] 答:线程安全就是你可以在多线程环境下使用它,而不需要你来对它进行特殊的处理。action都是继承至servlet的,由于servlet就是线程不安全的(指多个线程共享一个servlet对象,所以),所以不要再action中定义类变量和实例变量,否则其他线程改变了这些值,可本线程还在使用 53 :MVC,分析一下struts是如何实现MVC的 [难] 从MVC角度来看看struts的体系结构(Model 2 )与工作原理: 1 )模型(Model) 在Struts的体系结构中,模型分为两个部分:系统的内部状态和可以改变状态的操作(事务逻辑)。内部状态通常由一组ActinForm Bean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean调用。比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。 小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。 建议用户将事务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。 2 )视图(View) 视图主要由JSP建立,struts包含扩展自定义标签库(TagLib),可以简化创建完全国际化用户界面的过程。目前的标签库包括:Bean Tags、HTML tags、Logic Tags、Nested Tags 以及Template Tags等。 3 )控制器(Controller) 在struts中,基本的控制器组件是ActionServlet类中的实例servelt,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。对于业务逻辑的操作则主要由Action、ActionMapping、ActionForward这几个组件协调完成的,其中Action扮演了真正的业务逻辑的实现者,ActionMapping与ActionForward则指定了不同业务逻辑或流程的运行方向。struts-config.xml 文件配置控制器。 54 :简述什么是Struts [中] Struts只是一个MVC框架(Framework),用于快速开发Java Web应用。Struts实现的重点在C(Controller),包括ActionServlet/RequestProcessor和我们定制的Action,也为V(View)提供了一系列定制标签(Custom Tag)。但Struts几乎没有涉及M(Model),所以Struts可以采用JAVA实现的任何形式的商业逻辑。 Spring是一个轻型容器(light-weight container),其核心是Bean工厂(Bean Factory),用以构造我们所需要的M(Model)。在此基础之上,Spring提供了AOP(Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean工厂的扩展ApplicationContext更加方便我们实现J2EE的应用;DAO/ORM的实现方便我们进行数据库的开发;Web MVC和Spring Web提供了Java Web应用的框架或与其他流行的Web框架进行集成。 就是说可将两者一起使用,达到将两者自身的特点进行互补。 55 :Struts有哪些主要功能:[难] 1 .包含一个controller servlet,能将用户的请求发送到相应的Action对象。 2 . JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。 3 . 提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。 Struts项目的目标是为创建Java web应用提供一个开放源代码的framework。Struts framework的内核是基于例如Java Servlets, JavaBeans, ResourceBundles, 和 XML,以及各种 Jakarta Commons包的标准技术的灵活的控制层。 Struts提供了它自身的控制器组件,并整合了其他技术,以提供模型和视图。对于模型,同大多数的第三方软件包一样,如Hibernate, iBATIS, 或者 Object Relational Bridge,Struts能够和标准数据连接技术相结合,如JDBC和EJB。对于视图,Struts与JavaServer Pages协同工作,包含JSTL和JSF。 56 :Stuts框架中控制器组件的类主要有哪些? [难] ActionServlet , RequestProcessor , Action, ActionMapping, ActionForward 41 :Validator的组成与作用 [难] Validator框架主要包括以下几个部分: 1 ) 实现各种验证规则的Java类 2 ) 配置文件 3 ) 资源文件 4 ) JSP自定义标签 Validator组件可以很好地解决用户输入数据的验证问题,但它并不是一个独立运行的组件,它可以被嵌入到目前大部分的Web应用开发框架中。Validator组件的验证方式有多种,既可以通过JavaScript脚本实现用户输入数据的页面验证,也可以实现在后台处理程序中的Java验证 57 . ActionForm的作用?[难] ActionForm属于一种数据传输对象,联系了前台页面与后台的Action方法,实现了前台与后台之间的数据转换和传递。它的作用主要体现在以下几个方面: 1 ) 在显示页面的时候用于完成页面中各种控件的初始化工作。 2 ) 在用户提交请求的时候,ActionForm又代表了用户所提交的数据,供Action以及后续的业务处理方法使用 ActionForm还有另外一个作用就是对用户提交数据的合法性进行验证 Java 基础就业题库 1 . 类和对象的区别? [易] 类是对象的抽象,是模型概念,而对象是实实在在存在的事物,是现实中存在的实体 2 . Java类库中八个标准包分别是什么? [易] java.lang 提供常用的类、接口、一般异常、系统等编程语言的核心内容。 java.util 包含日期、日历、向量、堆栈等实用工具。 java.io 包含输入输出流类、文件类等与输入输出I/O有关的类。 java.awt 包含窗口和屏幕元素类,事件处理接口等与图形用户界面有关的内容。 java.applet 提供为编写applet小程序所需要的类。 java.text 提供与文本有关的类。 java.net 包含url类等与网络传输有关的东西。 java.sql 提供与数据库应用相关的类和接口。 3 . 接口和抽象类有什么区别? [中] 接口是公开的,不能包含私有的方法或变量,而抽象类是可以有私有方法或私有变量的, 实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法, 接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承, 接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用. 一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。 4 . 说说java中的内存分配? [难] Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。 堆内存用于存放由 new 创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。 引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用 new 产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。但是在写程序的时候,可以人为的控制 5 . Character类有哪些常用方法? [难] charValue() 返回字符对象对应的值。 digit( char , int ) 以指定基数返回字符 ch 对应的数值。 equals(Object) 比较该对象和指定对象。 forDigit( int , int ) 确定以指定基数指定的数对应的字符。 getNumericValue( char ) 返回此字符对应的 Unicode 的非负整型值。 getType( char ) 返回一个表示字符种类的值。 hashCode() 返回此字符对应的哈希码。 isDefined( char ) 判定一个字符在 Unicode 中是否有定义。 isDigit( char ) 判定指定字符是否为数字。 isIdentifierIgnorable( char ) 判定指定字符在 Java 标识符中或 Unicode 标识符中是否应看作是一个可忽略字符。 isISOControl( char ) 判定指定字符是否为 ISO 控制字符。 isJavaIdentifierPart( char ) 判定指定字符是否为 Java 标识符中除首字符外的字符。 isJavaIdentifierStart( char ) 判定指定字符是否可作为 Java 标识符的首字符。 isJavaLetter( char ) 判定指定字符是否为 Java 字母,若是,它可作为 Java 语言中一个标识符的首字符。 不推荐使用该方法。 isJavaLetterOrDigit( char ) 判定指定字符是否为 Java 字母或数字,若是,它可作为 Java 语言中的一个标识符除首字符外的字符。 不推荐使用该方法。 isLetter( char ) 判定指定字符是否为字母。 isLetterOrDigit( char ) 判定指定字符是否为字母或数字。 isLowerCase( char ) 判定指定字符是否为小写字符。 isSpace( char ) 判定指定字符是否为 ISO-LATIN- 1 空格。 不推荐使用该方法。 isSpaceChar( char ) 判定指定字符是否为 Unicode 空白字符。 isTitleCase( char ) 判定指定字符是否为标题字符。 isUnicodeIdentifierPart( char ) 判定指定字符是否为 Unicode 标识符中除首字符外的字符。 isUnicodeIdentifierStart( char ) 判定指定字符是否可作为 Unicode 标识符首字符。 isUpperCase( char ) 判定指定字符是否为大写字符。 isWhitespace( char ) 据 Java 语言,判定指定字符是否为空格。 toLowerCase( char ) 将给定字符映射为对应的小写字符,若没有对应的小写字符,返回此字符本身。 toString() 返回表示此字符值的串对象。 toTitleCase( char ) 将字符参数转换为标题字符。 toUpperCase( char ) 将字符参数转换为大写字符。 5 .Boolean类有哪些方法? booleanValue() 返回 Boolean 对象对应的布尔值。 equals(Object) 当且仅当参数非空,且是包含与此对象相同的布尔值的布尔对象时,返回 true 。 getBoolean(String) 当且仅当以参数命名的系统属性存在,且等于 "true" 时,返回为 true 。 hashCode() 返回此布尔值对应的哈希码。 toString() 返回表示当前布尔值的一个串对象。 valueOf(String) 返回表示指定串的布尔值。 6 . String s = new String( "xyz" );创建了几个String Object? [中] 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 7 . String与StringBuffer有什么区别? [难] 从表面看来String类只用一个加号(+)便完成了字符串的拼接,而StringBuffer类却要调用一个append()方法,是否实现起来更简洁,更单纯呢?其实不然,让我们了解一下程序运行内部发生了哪些事情: 经编译后程序的bytecode(字节码)展示出了实质: 在用String类对象直接拼接时,JVM会创建一个临时的StringBuffer类对象,并调用其append()方法完成字符串的拼接,这是因为String类是不可变的,拼接操作不得不使用StringBuffer类(并且--JVM会将 "You are nice." 和 "I love you so much." 创建为两个新的String对象)。之后,再将这个临时StringBuffer对象转型为一个String,代价不菲!可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的str了,这个引用的名称没变,但它指向了新的String对象。 而如果直接使用StringBuffer类,程序将只产生两个对象:最初的StringBuffer和拼接时的String( "I love you so much." ),也不再需要创建临时的StringBuffer类对象而后还得将其转换回String对象。 short s1 = 1 ; s1 = s1 + 1 ;有什么错? short s1 = 1 ; s1 = s1 + 1 ; (s1+ 1 运算结果是 int 型,需要强制转换类型) short s1 = 1 ; s1 += 1 ;有什么错? short s1 = 1 ; s1 += 1 ;(可以正确编译) 8 . 是否可以继承String类? [难] String类是 final 类故不可以继承。 9 . throw 与 throws 有什么区别? [中] throws 是用来声明一个方法可能抛出的所有异常信息 throw 则是指抛出的一个具体的异常类型。 通常在一个方法(类)的声明处通过 throws 声明方法(类)可能抛出的异常信息,而在方法(类)内部通过 throw 声明一个具体的异常信息。 throws 通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw 则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛出。 throws 语句 throws 用来标明一个成员函数可能抛出的各种 "异常" 。对大多数Exception子类来说,Java编译器会强迫你声明在一个成员函数中抛出的 "异常" 的类型。如果 "异常" 的类型是Error或RuntimeException,或它们的子类,这个规则不起作用,因为这copy;在程序 的正常部分中是不期待出现的。如果你想明确地抛出一个RuntimeException,你必须用 throws 语句来声明它的类型。这就重新定义了成员函数的定义语法:type method-name(arg-list) throws exception-list { }下面是一段程序,它抛出了一个 "异常" , 但既没有捕捉它,也没有用 throws 来声明。这在编译时将不会通过。 try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的code会不会被执行,什么时候被执行,在 return 前还是后? 会执行,在 return 前执行。 10 . 常见的runtime exception有哪些?。 [中] ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException NullPointException 11 . 介绍JAVA中的Collection FrameWork(包括如何写自己的数据结构)? [难] 答:Collection FrameWork如下: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements) Map提供key到value的映射 12 . ArrayList和Vector的区别,HashMap和Hashtable的区别 [难] 答:就ArrayList与Vector主要从二方面来说. 一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 二.数据增长:当需要增长时,Vector 默认增长为原来一培,而ArrayList却是原来的一半 就HashMap与HashTable主要从三方面来说。 一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2 引进的Map接口的一个实现 二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 三.值:只有HashMap可以让你将空值作为一个表的条目的key或value 13 . Math.round( 11.5 )等於多少? Math.round(- 11.5 )等於多少? [难] Math.round( 11.5 )== 12 Math.round(- 11.5 )==- 11 round方法返回与参数最接近的长整数. 14 . swtich是否能作用在 byte 上,是否能作用在 long 上,是否能作用在String上? [难] switch (expr1)中,expr1是一个整数表达式。应该是 int 、 short 、 char byte 。 long ,string 都不能作用于swtich。 15 . GC是什么? 为什么要有GC? [难] GC是垃圾收集的意思(Gabage Collection) Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的, Java语言没有提供释放已分配内存的显示操作方法。 16 . 什么叫方法重载 [中] 方法重载就是一个同名方法,有多种不同的签名 说白了就是一个同名方法可以传入不同个数或类型的参数 之间可以互相调用 17 . 数组有没有length()这个方法? String有没有length()这个方法? [中] 数组没有length()这个方法,有length的属性。String有有length()这个方法 18 . 什么是抽象类抽象类 [中] 仅提供一个类型的部分实现。抽象类可以有实例变量,以及一个或多个构造函数。抽象类可以同时有抽象方法和具体方法。一个抽象类不会有实例,这些构造函数不能被客户端调用来创建实例。一个抽象类的构造函数可以被其子类调用,从而使一个抽象类的所有子类都可以有一些共同的实现,而不同的子类可以在此基础上有其自己的实现。 19 . 抽象类的用途 [中] 1 ) 具体类不是用来继承的。 Scott Meyers曾指出,只要有可能,不要丛具体类继承。 2 ) 假设有 2 个具体类,类A和类B,类B是类A 的子类,那么一个最简单的修改方案是应当建立一个抽象类(或java接口)C,然后让类A和类B成为抽象类C的子类。 3 ) 抽象类应当拥有尽可能多的共同代码。以提高代码的复用率。 4 ) 抽象类应当拥有尽可能少的数据。 20 .java中接口有什么用? [难] java不允许多重继承,也就是说一个子类只能有一个父类,Son extends FatherA,FatherB 是错误的 为了弥补这点不足,java允许实现多个接口,Son extends FatherA implements AnotherFatherA,AnotherFatherB是允许的 接口中的方法没有实体,就这一点而言就相当于abstact class ,如: interface ainter{ void dosth( int i); } ainter是一个接口,它仅仅声明了一个方法dosth,而没有具体实现它 class aclass implements ainter { public void dosth( int i) { } } aclass实现了ainter这个接口,因此它必须实现ainter中的方法dosth 21 . 什么叫方法重载 [易] 方法重载就是一个同名方法,有多种不同的签名 说白了就是一个同名方法可以传入不同个数或类型的参数 之间可以互相调用 22 . 垃圾回收机制的原理? [难] 在JAVA中 ,JAVA VM 每隔一段时间就会查看每一块由NEW分配的内存空间,看指向它的有效引用是否存在,如果这个引用不存在,系统会自动将这块空间归入空闲内存区.这个过程被称为 垃圾收集. 23 .. 什么叫面向对象? [中] 面向对象是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。开发一个软件是为了解决某些问题,这些问题所涉及的业务范围称作该软件的问题域。其应用领域不仅仅是软件,还有计算机体系结构和人工智能等。 24 . 面向对象的涉及方法有哪些? [中] OOA-Object Oriented Analysis 面向对象的分析 OOD-Object Oriented Design 面向对象的设计 OOI-Object Oriented Implementation 面向对象的实现 25 . jvm工作原理 [难] 运行jvm 字符码的工作是由解释器来完成的。解释执行过程分三步进行: 代码的装入、代码的校验、和代码的执行。 装入代码的工作由“类装载器 class loader”完成。类装载器负责装入运 行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被调 用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了 通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他 类。在本台计算机的所有类都在同一地址空间中,而所有从外部引进的类 ,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间 获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。 当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内 存布局。解释器为符号引用与特定的地址空间建立对应关系及查询表。通 过在这一阶段确定代码的内布局,java很好地解决了由超类改变而使子类 崩溃的问题,同时也防止了代码的非法访问。 随后,被装入的代码由字节码校验器进行检查。校验器可以发现操作数栈 益处、非法数据类型转化等多种错误。通过校验后,代码便开始执行了。 java字节码的执行有两种方式: 1 ) 即时编译方式:解释器先将字节编译成机器码,然后再执行该机器码 。 2 )解释执行方式:解释器通过每次解释并执行一小段代码来完成java字节 码程序的所有操作。 26 . .java中输入输出流有哪些相关的类? [难] Input和Output 1 . stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型: 1.1 以字节为导向的stream 以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型: 1 ) input stream: 1 ) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用 2 ) StringBufferInputStream:把一个String对象作为InputStream 3 ) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作 4 ) PipedInputStream:实现了pipe的概念,主要在线程中使用 5 ) SequenceInputStream:把多个InputStream合并为一个InputStream 2 ) Out stream 1 ) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 2 ) FileOutputStream:把信息存入文件中 3 ) PipedOutputStream:实现了pipe的概念,主要在线程中使用 4 ) SequenceOutputStream:把多个OutStream合并为一个OutStream 1.2 以Unicode字符为导向的stream 以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型: 1 ) Input Stream 1 ) CharArrayReader:与ByteArrayInputStream对应 2 ) StringReader:与StringBufferInputStream对应 3 ) FileReader:与FileInputStream对应 4 ) PipedReader:与PipedInputStream对应 2 ) Out Stream 1 ) CharArrayWrite:与ByteArrayOutputStream对应 2 ) StringWrite:无与之对应的以字节为导向的stream 3 ) FileWrite:与FileOutputStream对应 4 ) PipedWrite:与PipedOutputStream对应 以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。 如CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。 1.3 两种不现导向的stream之间的转换 InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。 2 . stream添加属性 2.1 “为stream添加属性”的作用 运用上面介绍的Java中操作IO的API,我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。 如果我们要往一个文件中写入数据,我们可以这样操作: FileOutStream fs = new FileOutStream(“test.txt”); 然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,如果我们想实现“先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中”的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和FilterOutStream的子类,为FileOutStream添加我们所需要的功能。 2.2 FilterInputStream的各种类型 2.2 . 1 用于封装以字节为导向的InputStream 1 ) DataInputStream:从stream中读取基本类型( int 、 char 等)数据。 2 ) BufferedInputStream:使用缓冲区 3 ) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber( int ) 4 ) PushbackInputStream:很少用到,一般用于编译器开发 2.2 . 2 用于封装以字符为导向的InputStream 1 ) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream 2 ) BufferedReader:与BufferedInputStream对应 3 ) LineNumberReader:与LineNumberInputStream对应 4 ) PushBackReader:与PushbackInputStream对应 2.3 FilterOutStream的各种类型 2.2 . 3 用于封装以字节为导向的OutputStream 1 ) DataIOutStream:往stream中输出基本类型( int 、 char 等)数据。 2 ) BufferedOutStream:使用缓冲区 3 ) PrintStream:产生格式化输出 2.2 . 4 用于封装以字符为导向的OutputStream 1 ) BufferedWrite:与对应 2 ) PrintWrite:与对应 3 . RandomAccessFile 1 ) 可通过RandomAccessFile对象完成对文件的读写操作 2 ) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写 3 ) 可以直接跳到文件中指定的位置 4 . I/O应用的一个例子 import java.io.*; public class TestIO{ public static void main(String[] args) throws IOException{ BufferedReader in = new BufferedReader( new FileReader( "F:\\nepalon\\TestIO.java" )); String s, s2 = new String(); while ((s = in.readLine()) != null ) s2 += s + "\n" ; in.close(); BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); System.out.println( "Enter a line:" ); System.out.println(stdin.readLine()); StringReader in2 = new StringReader(s2); int c; while ((c = in2.read()) != - 1 ) System.out.println(( char )c); in2.close(); try { DataInputStream in3 = new DataInputStream( new ByteArrayInputStream(s2.getBytes())); while ( true ) System.out.println(( char )in3.readByte()); } catch (EOFException e){ System.out.println( "End of stream" ); } try { BufferedReader in4 = new BufferedReader( new StringReader(s2)); PrintWriter out1 = new PrintWriter( new BufferedWriter( new FileWriter( "F:\\nepalon\\ TestIO.out" ))); int lineCount = 1 ; while ((s = in4.readLine()) != null ) out1.println(lineCount++ + ":" + s); out1.close(); in4.close(); } atch(EOFException ex){ System.out.println( "End of stream" ); } try { DataOutputStream out2 = new DataOutputStream( new BufferedOutputStream( new FileOutputStream( "F:\\nepalon\\ Data.txt" ))); out2.writeDouble( 3.1415926 ); out2.writeChars( "\nThas was pi:writeChars\n" ); out2.writeBytes( "Thas was pi:writeByte\n" ); out2.close(); DataInputStream in5 = new DataInputStream( new BufferedInputStream( new FileInputStream( "F:\\nepalon\\ Data.txt" ))); BufferedReader in5br = new BufferedReader( new InputStreamReader(in5)); System.out.println(in5.readDouble()); System.out.println(in5br.readLine()); System.out.println(in5br.readLine()); } catch (EOFException e){ System.out.println( "End of stream" ); } 27 . 构造器Constructor是否可被(覆盖)override? [难] 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。 28 . JAVA反射机制作用是什么? [难] 可以于运行时加载、探知、使用编译期间完全未知的 classes。换句话说,Java程序可以加载一个运行时才得知名称 的 class ,获悉其完整构造(但不包括methods定义),并生成其 对象实体、或对其fields设值、或唤起其methods1。 29 . web应用程序体系结构是怎样的? [难] 一般分为表示层、业务层、数据存取层 30 . .GET和POST有什么区别? [难] GET是明码传递,POST是暗码传递 31 . HTTP协议的特点? [中] 使用端口发送和接受消息 。端口是协议发送和接收数据的信道或机制 , 80 是默认端口 通过这种协议传递数据服务器不会保存连接信息,因此又称为连接信息。 32 . 如何通过RandomAccessFile操作文件 [难] RandomAccessFile rf = new RandomAccessFile( "F:\\nepalon\\ rtest.dat" , "rw" ); for ( int i= 0 ; i< 10 ; i++) rf.writeDouble(i* 1.414 ); rf.close(); rf = new RandomAccessFile( "F:\\nepalon\\ rtest.dat" , "r" ); for ( int i= 0 ; i< 10 ; i++) System.out.println( "Value " + i + ":" + rf.readDouble()); rf.close(); rf = new RandomAccessFile( "F:\\nepalon\\ rtest.dat" , "rw" ); rf.seek( 5 * 8 ); rf.writeDouble( 47.0001 ); rf.close(); rf = new RandomAccessFile( "F:\\nepalon\\ rtest.dat" , "r" ); for ( int i= 0 ; i< 10 ; i++) System.out.println( "Value " + i + ":" + rf.readDouble()); rf.close(); } } 32 . 静态方法有什么好处? [难] ( 1 )在Java里,可以定义一个不需要创建对象的方法,这种方法就是静态方法。要实现这样的效果,只需要在类中定义的方法前加上 static 关键字。例如: public static int maximum( int n1, int n2) 使用类的静态方法时,注意: a) 在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。 b) 静态方法不能以任何方式引用 this 和 super 关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时, this 所引用的对象根本没有产生。 ( 2 )静态变量是属于整个类的变量而不是属于某个对象的。注意不能把任何方法体内的变量声明为静态,例如: fun() { static int i= 0 ; } ( 3 )一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且之被执行一次,静态块常用来执行类属性的初始化。例如: static { } 33 . Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? [中] Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判断两个对象是否相等。 34 . JAVA中的静态方法有什么理解? [难] 在Java里,可以定义一个不需要创建对象的方法,这种方法就是静态方法。要实现这样的效果,只需要在类中定义的方法前加上 static 关键字。例如: public static int maximum( int n1, int n2) 使用类的静态方法时,注意: a) 在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。 b) 静态方法不能以任何方式引用 this 和 super 关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时, this 所引用的对象根本没有产生。 ( 2 )静态变量是属于整个类的变量而不是属于某个对象的。注意不能把任何方法体内的变量声明为静态,例如: fun() { static int i= 0 ; } ( 3 )一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且之被执行一次,静态块常用来执行类属性的初始化。例如: static { } 35 . JSP中动态INCLUDE与静态INCLUDE的区别? [难] 动态INCLUDE用jsp:include动作实现 <jsp:include page= "included.jsp" flush= "true" />它总是会检查所含文件中的变化, 适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file= "included.htm" %> 36 . Java有没有 goto ? java中的保留字,现在没有在java中使用。 37 . 启动一个线程是用run()还是start()? [难] 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 38 . swtich是否能作用在 byte 上,是否能作用在 long 上,是否能作用在String上? [易] switch (expr1)中,expr1是一个整数表达式。应该是 int 、 short 、 char byte 。 long ,string 都不能作用于swtich。 39 . try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的code会不会被执行,什么时候被执行,在 return 前还是后? [难] 会执行,在 return 前执行。 40 . 两个对象值相同(x.equals(y) == true ),但却可有不同的hash code,这句话对不对? 不对,有相同的hash code。 [易] \ 41 . char 型变量中能不能存贮一个中文汉字?为什么? [难] 可以,因为java中以unicode编码,一个 char 占 16 个字节,所以放一个中文是没问题的 42 . Java中的线程有四种状态分别是是什么? [难] 运行、就绪、挂起、结束。 43 . java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? [难] 字节流,字符流。 字节流继承于InputStream \ OutputStream, 字符流继承于InputStreamReader \ OutputStreamWriter。 44 . 静态变量和实例变量的区别? [中] static i = 10 ; class A a; a.i = 10 ; 45 . 什么是java序列化,如何实现java序列化? [难] 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。 序列化的实现: 将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法, implements Serializable只是为了标注该对象是可被序列化 46 . 是否可以从一个 static 方法内部发出对非 static 方法的调用? [难] 不可以,如果其中包含对象的method();不能保证对象初始化. 47 . 在JAVA中,如何跳出当前的多重嵌套循环? [难] 用 break ; return 方法。 48 . 面向对象的特征有哪些方面 [中] 1 .抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2 .继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3 .封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4 . 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 49 . String是最基本的数据类型吗? [中] 基本数据类型包括 byte 、 int 、 char 、 long 、 float 、 double 、 boolean 和 short 。 java.lang.String类是 final 类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 50 . int 和 Integer 有什么区别 [中] Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为 int 提供的封装类。Java为每个原始类型提供了封装类。 51 . 运行时异常与一般异常有何异同? [ 难] 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 52 . &和&&的区别。 [ 中] &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 53 . final , finally , finalize的区别。 [中] final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally 是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 Jsp/servlet面试题 1 . 四种会话跟踪技术是什么?(jsp) (中) 答:cookie,url重写,session,隐藏表单域。 2 .不同客户端可不可以共享Session?不可以 (易) Jps和Servlet之间可不可以用session传值?可以 3 .简介cookie的有关知识 (中) 浏览器与WEB服务器之间是使用HTTP协议进行通信的,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的连接。因此当一个请求发送到WEB服务器时,无论其是否是第一次来访,服务器都会把它当作第一次来对待,这样的不好之处可想而知。为了弥补这个缺陷,Netscape 开发出了cookie这个有效的工具来保存某个用户的识别信息,因此人们昵称为“小甜饼”。cookies是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段:Netscape Navigator使用一个名为cookies.txt本地文件保存从所有站点接收的Cookie信息;而IE浏览器把Cookie信息保存在类似于C: \windows\cookies的目录下。当用户再次访问某个站点时,服务端将要求浏览器查找并返回先前发送的Cookie信息,来识别这个用户。 cookies给网站和用户带来的好处非常多: 1 、Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径 2 、Cookie能告诉在线广告商广告被点击的次数 ,从而可以更精确的投放广告 3 、Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点 4 、Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务 JSP是使用如下的语法格式来创建cookie的: Cookie cookie_name = new Cookie( "" Parameter "" , "" Value "" ); 例如:Cookie newCookie = new Cookie( "" username "" , "" zheng "" ); response.addCookie(newCookie); 4 .在浏览器的打开时再新打开一个浏览器还是同一个session吗? (中) 对IE而言不是同一个SESSION 5 .描述Cookie和Session的作用,区别和各自的应用范围 (中) Cookie和Session都可以用来在多个页面之间共享数据,区别是Cookie保存在客户端,可以设置比较长的保存时间.而Session保存在服务器端,通常生存时间较短。如果客户端禁用了Cookie,Cookie将无法工作,而session不受这一影响。一般来说保密性高、保存时间短的信息适合用session来存放,而Cookie适合存放需要长期保存的非敏感数据。 6 .如何实现购物车添加新项,又不使购物车中原有项目被取消? (易) 可以将购物车存放在session当中 7 .Cookie的过期时间如何设置? (易) 使用setMaxAge( int exp)方法 8 .如果BROWSER已关闭了cookies,在JSP中我如何打开session? (中) 如果Cookie被禁用,session将通过url重写的方式来传送,所以不会影响session的使用 9 .include指令和include动作的区别 (中) 10 . Jsp有哪些常用动作?作用分别是什么?(jsp) (中) 答:JSP有 6 种常用基本动作 jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个JavaBean。 jsp:setProperty:设置JavaBean的属性。 jsp:getProperty:输出某个JavaBean的属性。 jsp:forward:把请求转到一个新的页面。 jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。 11 . "forward与redirect区别? (中) Forward是在服务器端进行分发,分发后地址栏无变化,用户看不到分发后的地址.而redirect是在客户端进行的页面重定向,地址栏上会显示重定向后的网页.forward的页面只能是在同一个web应用程序之内,而重定向可以定位到外部资源.forward后还是同一个request请求,而重定向后以前的request请求就不存在了. 12 .Jsp和Servlet中的请求转发分别如何实现? (易) Jsp中使用<jsp:forward>动作,servlet中使用RequestDistpatcher对象的forward方法" 13 .什么是web容器?(易) 答:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。 14 .应用服务器有那些? (中) 答:BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,JBoss,Tomcat。" 15 .请说出JSP的内置对象及方法 (中) 答:request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。 response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等) out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。 pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。 session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息 applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息 config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。 page表示从该页面产生的一个servlet实例。 16 .使用JSP如何获得客户浏览器的信息? (易) request对象的getXXXX方法" 17 .B/S与C/S的联系与区别。 (中) 答:C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。 C/S 与 B/S 区别: 1).硬件环境不同: C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务. B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行 2).对安全要求不同 C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息. B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。 3).对程序架构不同 C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑. B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000 等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟. 4).软件重用不同 C/S 程序可以不可避免的整体性考虑, 构件的</ div <>
1 . BeanFactory的作用是什么? [中] BeanFactory是配置、创建、管理bean的容器,有时候也称为bean上下文。Bean与bean的依赖关系,也是由BeanFactory负责维护的。 2 . bean在spring的容器中两种基本行为是什么? [中] Singleton:单态 Non-singleton或prototype:原型 3 . spring配置文件中的ref元素的作用是什么?它的两个基本属性是什么? [中] 用于指定属性值为spring容器中的其它bean.两个基本属性是bean和local 4 . 什么是DWR?它有哪些功能? [中] DWR(Direct Web Remoting)是一个WEB远程调用框架. 可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript DWR根据Java类来动态生成JavaScrip代码. 支持Dom Trees,支持Spring,支持commons-logging 5 . Ajax的工作原理 ? [难] 在会话的开始,浏览器加载Ajax引擎 请求动作通过JavaScript调用Ajax引擎来代替. 引擎负责绘制用户界面以及与服务器端通讯。 Ajax引擎采用异步交互过程--不用等待服务器的通讯。 6 . XMLHttpRequest对象是什么,它有哪些常用方法? [难] 一个 JavaScript 对象。是Ajax 的核心。 该对象的方法和属性。 open():建立到服务器的新请求。 send():向服务器发送请求。 abort():退出当前请求。 readyState:提供当前 HTML 的就绪状态。 responseText:服务器返回的请求响应文本。. 7 . XMLHttpRequest有哪些属性, 它的值分代表什么?[ 中] 8 . 什么是Ajax? [易] AJAX(Asynchronous JavaScript and XML),它不是一门新的语言或技术,而是多种技术的综合,包括: Javascript XHTML CSS DOM XML XSTL XMLHttpRequest 9 . 同步与异步的区别? [ 难] 普通B/S模式(同步)AJAX技术(异步) 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事,而异步则是 请求通过事件触发->服务器处理->处理完毕 同步是阻塞模式,异步是非阻塞模式。 同步(发送方发出数据后,等接收方发回) 异步(发送方发出数据后,不等接收方发回响应) 10 . Struts+Hibernate+Spring开发模式中Hibernate扮演的角色 [中] 答:Hibernate扮演的是数据持久层 它的作用是实现持久化对象和数据库表 之间的映射,形成持久化对象和数据库表中数据的一个转换平台 11 . 什么是Hibernate 的抓取策略 [难] 抓取策略是指当应用程序需要利用关联关系进行对象获取的时候。 12 . 何为容器 [中] 容器就是符合某种规范的能够提供一系列服务的管理器。 13 . Spring实现了那几种模式 [中] 答: 工厂模式 和 单例模式 14 :Hibernate实体对象生命周期的三种状态 [难] 答 Transient(瞬态) ,persistent(持久态)和Detached(游历态) 15 : HQL查询参数的处理方法 [中] 答:直接将参数拼写为HQL语句 通过参数名称来标识参数 16 . Hibernate实体之间的关联关系的三种形式 [中] 答 一对一关联 一对多关联 多对多关联 17 . Hibernate具用的三种检索方式 [难] 答:HQL检索方式 QBC检索方式 SQL检索方式 18 . spring 中<Bean>的depends-on属性是什么 [中] Depends-on用于当前Bean初始化之前显示的强制一个或多个bean被初始化 19 . spring 中的BeanWrapper类是什么 [难] BeanWrapper类是一个对JavaBean进行各种操作的工具类 BeanWrapper本身是一个接口BeanWrapperImpl实现了BeanWrapper 20 . <set>元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值? [难] 答:save-update 21 . Hibernate中session什么时候是游离态 [中] 答:session.close();方法后 22 . Hibernate中映射文件<hibernate-mapping> inverse属性和cascade属性的区别 [中] 答:inverse属性只存在于集合标记的元素中集合元素包括<set/>,<map/>,<list/>,<array/>,<bag/> Inverse属性的作用是是否将对集合对象的修改反射到数据库中 inverse=” false ”时修改反射到数据库中 inverse=” true ” 时修改不反射到数据库中 Cascade属性的作用是描述关联对象进行操作时的级联特性,因此只有涉及到关系的元素才有cascade属性 23 . : Hibernate中Session对象的load()方法和get()方法的区别(请列举出两点)[难] 答:①记录不存在时 get()方法会返回空( null ),而load()方法将会抛出一个HibernateException异常 ② load()方法查询数据时会先找Hibernate的内部缓存和二级缓 存中的现有数据,get()方法在内部缓存中没有打到相对应的数据时装直接执行SQL语句 进行查询 24 . : Hibernate中HQL属于什么语言 [易] 答:HQL是面向对象的查询语言,它可以查询以对象形式存在的数据。 25 . Hibernate简介以及主要功能 [中] 答:Hibernate是采用ORM模式实现数据持久层的一个优秀的JAVA组件,它提供了 强大,高效的将JAVA对象进行持久化操作的服务 26 . 简述Hibernate的优点 [难] 答:开源和免费的License,我可以在需要的时候研究源代码,改写源代码,进行功能的定制。轻量级封装,避免引入过多复杂的问题,调试容易,也减轻程序员的负担。 具有可扩展性,API开放,当本身功能不够用的时候,可以自己编码进行扩展。 27 . 怎样构建SessionFactory [难] 答: Hibernate的SessionFactory接口提供Session类的实例,Session类用于完成对数据库的操作。 由于SessionFactory实例是线程安全的(而Session实例不是线程安全的),所以每个操作都可以共用同一个SessionFactory来获取Session。Hibernate配置文件分为两种格式,一种是xml格式的配置文件,另一种是Java属性文件格式的配置文件 28 . :从XML文件读取配置信息构建SessionFactory的具体步骤如下。 [难] ( 1 )创建一个Configuration对象,并通过该对象的configura()方法加载Hibernate配置文件,代码如下。 Configuration config = new Configuration().configure(); configura()方法:用于告诉Hibernate加载hibernate.cfg.xml文件。Configuration在实例化时默认加载classpath中的hibernate.cfg.xml,当然也可以加载名称不是hibernate.cfg.xml的配置文件,例如wghhibernate.cfg.xml,可以通过以下代码实现。 Configuration config = new Configuration().configure( "wghhibernate.cfg.xml" ); ( 2 )完成配置文件和映射文件的加载后,将得到一个包括所有Hibernate运行期参数的Configuration实例,通过Configuration实例的buildSessionFactory()方法可以构建一个惟一的SessionFactory,代码如下: SessionFactory sessionFactory = config.buildSessionFactory(); 构建SessionFactory要放在静态代码块中,因为它只在该类被加载时执行一次。 29 . 写出使用构造方法进行注入的关键代码 [难] <bean id=”constructBean” class =”com.huang.ConstructBean”> <constructor-arg><ref bean=”bean_1”/></ constructor-arg > <constructor-arg><ref bean=”bean_2”/></ constructor-arg > <constructor-arg><ref bean=”bean_3”/></ constructor-arg > </bean> 30 . 什么是IOC? [难] 不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在Spring 框架中是 IOC 容器) 负责将这些联系在一起。 就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控,控制权由应用代码中转到了外部容器,控制权的转移,就是所谓的反转。 31 . 编程题: 写一个Singleton出来。 [难] Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 第一种形式: 定义一个类,它的构造函数为 private 的,它有一个 static 的 private 的该类变量,在类初始化时实例话,通过一个 public 的getInstance方法获取对它的引用,继而调用其中的方法。 public class Singleton { private Singleton(){} private static Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } } 第二种形式: public class Singleton { private static Singleton instance = null ; public static synchronized Singleton getInstance() { if (instance== null ) instance= new Singleton(); return instance; } } String tempStr = "" ; try { tempStr = new String(str.getBytes( "ISO-8859-1" ), "GBK" ); tempStr = tempStr.trim(); } catch (Exception e) { System.err.println(e.getMessage()); } return tempStr; } 32 . J2EE是技术还是平台还是框架? [中] J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。 33 . 我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859- 1 等,如何输出一个某种编码的字符串? [难] Public String translate (String str) { String tempStr = "" ; try { tempStr = new String(str.getBytes( "ISO-8859-1" ), "GBK" ); tempStr = tempStr.trim(); } catch (Exception e) { System.err.println(e.getMessage()); } return tempStr; } 34.如何使用静态工厂方法来创建Bean的实例 [易] <bean id=”staticFactoryBean” class =”com.huang.StaticFactoryBean” factory-method=”静态方法名”/> 相当于: StaticFactoryBean staticFactoryBean=StaticFactoryBean.静态方法名 使用实例化的工厂方法来创建Bean的实例 <!—注意此时bean的 class 属性为空--> <bean id=”dynamicFactory” class =”com.huang.DynamicFactory”/> <bean id=”dynamiceFactoryBean” factory-bean=”dynamicFactory” Factory-method=”方法名”/> 相当于: DynamicFactory dynamicFactory= new DynamicFactory(); DynamiceFactoryBean dynamiceFactoryBean=dynamicFactory.方法名 35 . 从Java属性文件读取配置信息构建SessionFactory的具体步骤如下: [难] ( 1 )创建一个Configuration对象,此时Hibernate会默认加载classpath中的配置文件hibernate.properties,代码如下。 Configuration config = new Configuration(); ( 2 )由于在配置文件中缺少相应的配置映射文件的信息,所以此处需要通过编码方式加载,这可以通过Configuration对象的addClass()方法实现,具体代码如下。 config.addClass(BranchForm. class ); addClass()方法用于加载实体类。 ( 3 )完成配置文件和映射文件的加载后,将得到一个包括所有Hibernate运行期参数的Configuration实例,通过Configuration实例的buildSessionFactory()方法可以构建一个惟一的SessionFactory,代码如下。 SessionFactory sessionFactory = config.buildSessionFactory(); 36 . spring框架的 7 个模块是什么? [ 难] 答: ( 1 ) spring AOP --面象切面编程 ( 2 )spring DAO --数据访问对象 ( 3 )spring ORM --对象关系影射 ( 4 )spring Contect -- 上下文配置,向Spring框架提供上下文信息 ( 5 )spring WEB - -WEB上下文模块 ( 6 )\spring WEB-MVC --实现了MVC ( 7 )spring CORE –核心容器提供Spring框架基本功能 37 . 什么是AOP 请祥述 [中] 答: 是面向切面编程 AOP 把软件系统分为两个部分:核心关注点和横切关注点。所谓的核心关注点,是业务处理的主要流程,也就是说这个解决方案要做的事。所谓横切关注点,是与核心业务无关的部分,它把常发生在核心关注点的多处,而各处基本相似,如日志,事务,权限等 。 38 . Hinbernate和EJB的区别 [中] 答:Hibernate可以用在任何JDBC使用的场合,例如Java应用程序的数据库访问代码,DAO接口的实现类,甚至可以是BMP里面的访问数据库的代码。从这个意义上来说,Hibernate和EB不是一个范畴的东西,也不存在非此即彼的关系。 39 . 一般情况下,关系数据模型与对象模型之间有哪些匹配关系 [难] 答:表对应类 记录对应表的对象 表的字段对应类的属性 40 . 事务隔离级别是由谁实现的? [难] 答:数据库系统‘ 41 . 什么是IOC [难] 答:IOC 是控制反转,实现了对象之间的依赖关系的转移成而使程序的菘耦合 42 . 在Spring中给属性有几种赋值方式 请祥叙 [难] 答:有四种 分别是 ( 1 )普通属性赋值 ( 2 )集合属性赋值 ( 3 )Properties赋值 ( 4 )Map 属性赋值 43 . 在Spring说说Bean的alias元素和name属性有什么区别 [难] 答: <bean>元素name属性可以一次为<bean>定义多个别名 例:<bean id=”beanName” name=”alias_1,alias_2”/> <alias>元素一次只能定义一个别名 例:<alias name=”beanName” alias=”toName”/> 注意: alias元素name属性是bean实例名 44 . Bean 的作用域用几种,请祥叙 [难] 答: 用 5 种 分别是: 1 . singleton IOC容器只会创建一个Bean的唯一的实例 2 . prototype IOC容器在每次请求该Bean的时候都创建一个新的实例 3 . request 在一次Http请求中 IOC容器会返回该Bean的同一个实例,而对于不同的用户请求,则会返回不同的实例 4 . session 在一次Http请求Session 中 IOC容器会返回该Bean的同一个实例,而对于不同的用户Session,则会返回不同的实例 5 . global session在一个全局Http请求Session 中 45 . 简述什么是ORM [中] 答:ORM的全称是Object-Relational Mapping 翻译成中文就是“对象-关系映射” ORM组件的主要功能就是实现实体域对象的持久化并封装数据库访问的细节 ORM本身并不是一个组件,它是具用某种功能的组件的总称,也可以说是一种框 架结构 46 .:struts中的几个关键对象的作用(说说几个关键对象的作用) [中] struts中的几个关键对象:Action Global(设置语言靠它了) ModuleConfig(获取mapping), 47 .Action的作用 [中] Action的作用是接受用户的请求,通过调用业务方法实现业务处理的功能。 48 . 在通常情况下软件系统由表示层,业务层,持久层和数据库层组成,Struts属于哪一层? [难] Struts属于表示层组件,它的作用主要体现在以下几个方面: 1 ) 输出用户界面和接收用户的输入,实现与用户的交互。 2 ) 调用业务方法,完成业务处理,还要包括处理后的显示工作。 48 :Struts标签库由哪些组件组成? [难] 标签库是组合在一起的一组JSP自定义标签。 标签库由以下组件组成: 1 ) 标签处理程序 2 ) 标签库描述符(TLD)文件 3 ) 应用程序部署描述符(web.xml)文件 4 ) JSP页面中标签库的声明 49 . 用<bean:write>读出一个URL和一个名称, [难] 用<html:link>的话怎么组合起来。 即要达到这样的效果 <a href= "<bean:write name=" data " property=" url ">" > <bean:write name= "data" property= "tilte" > </a> <html:link page= "<bean:write name=" data " property=" url ">" > <bean:write name= "data" property= "title" /> </html:link> 会报出属性data无值的错误!(page= "<bean:write name=" data " property=" url ">" 中的data无值。) 50 :怎样才能配置<html:button>的资源文件? [难] 在资源文件 ApplicationResourses.properties 中加入 label.login=login 在jsp页面写: <html:button name= "btn_login" ><bean:message key= "label.login" /></html:button> 这样显示页面时,button上就会显示label.login的对应内容“login” 51 . 说说struts框架,的方法的工作原理或流程 [易] 答: 对于采用Struts框架的web应用, 在web应用启动时会加载并初始化ActionServlet,ActionServlet从struts-config.xml中读取配置信息, 把它们存放到各种配置对象中,例如把Action的映射信息存放在ActionMapping对象中。 当ActionServlet接收到客户请求时,执行以下流程: 1 .检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效信息; 2 .如果ActionForm实例不存在,就创建一个ActionForm对象并在其中保存客户提交的表单内容; 3 .根据配置信息决定是否调用ActionForm的validate()方法; 4 .如果ActionForm的validate()方法返回 null 或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功; 5 .ActionServlet根据ActionMapping实例包含的映射信息将请求转发给Action(如果Action实例不存在,就先创建Action实例),然后调用Action的excute()方法; 6 .Action的excute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件; 7 .ActionForward对象指向的JSP组件生成动态网页,返回给客户。 52 : strust的Action是不是线程安全的? [难] 答:线程安全就是你可以在多线程环境下使用它,而不需要你来对它进行特殊的处理。action都是继承至servlet的,由于servlet就是线程不安全的(指多个线程共享一个servlet对象,所以),所以不要再action中定义类变量和实例变量,否则其他线程改变了这些值,可本线程还在使用 53 :MVC,分析一下struts是如何实现MVC的 [难] 从MVC角度来看看struts的体系结构(Model 2 )与工作原理: 1 )模型(Model) 在Struts的体系结构中,模型分为两个部分:系统的内部状态和可以改变状态的操作(事务逻辑)。内部状态通常由一组ActinForm Bean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean调用。比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。 小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。 建议用户将事务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。 2 )视图(View) 视图主要由JSP建立,struts包含扩展自定义标签库(TagLib),可以简化创建完全国际化用户界面的过程。目前的标签库包括:Bean Tags、HTML tags、Logic Tags、Nested Tags 以及Template Tags等。 3 )控制器(Controller) 在struts中,基本的控制器组件是ActionServlet类中的实例servelt,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。对于业务逻辑的操作则主要由Action、ActionMapping、ActionForward这几个组件协调完成的,其中Action扮演了真正的业务逻辑的实现者,ActionMapping与ActionForward则指定了不同业务逻辑或流程的运行方向。struts-config.xml 文件配置控制器。 54 :简述什么是Struts [中] Struts只是一个MVC框架(Framework),用于快速开发Java Web应用。Struts实现的重点在C(Controller),包括ActionServlet/RequestProcessor和我们定制的Action,也为V(View)提供了一系列定制标签(Custom Tag)。但Struts几乎没有涉及M(Model),所以Struts可以采用JAVA实现的任何形式的商业逻辑。 Spring是一个轻型容器(light-weight container),其核心是Bean工厂(Bean Factory),用以构造我们所需要的M(Model)。在此基础之上,Spring提供了AOP(Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean工厂的扩展ApplicationContext更加方便我们实现J2EE的应用;DAO/ORM的实现方便我们进行数据库的开发;Web MVC和Spring Web提供了Java Web应用的框架或与其他流行的Web框架进行集成。 就是说可将两者一起使用,达到将两者自身的特点进行互补。 55 :Struts有哪些主要功能:[难] 1 .包含一个controller servlet,能将用户的请求发送到相应的Action对象。 2 . JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。 3 . 提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。 Struts项目的目标是为创建Java web应用提供一个开放源代码的framework。Struts framework的内核是基于例如Java Servlets, JavaBeans, ResourceBundles, 和 XML,以及各种 Jakarta Commons包的标准技术的灵活的控制层。 Struts提供了它自身的控制器组件,并整合了其他技术,以提供模型和视图。对于模型,同大多数的第三方软件包一样,如Hibernate, iBATIS, 或者 Object Relational Bridge,Struts能够和标准数据连接技术相结合,如JDBC和EJB。对于视图,Struts与JavaServer Pages协同工作,包含JSTL和JSF。 56 :Stuts框架中控制器组件的类主要有哪些? [难] ActionServlet , RequestProcessor , Action, ActionMapping, ActionForward 41 :Validator的组成与作用 [难] Validator框架主要包括以下几个部分: 1 ) 实现各种验证规则的Java类 2 ) 配置文件 3 ) 资源文件 4 ) JSP自定义标签 Validator组件可以很好地解决用户输入数据的验证问题,但它并不是一个独立运行的组件,它可以被嵌入到目前大部分的Web应用开发框架中。Validator组件的验证方式有多种,既可以通过JavaScript脚本实现用户输入数据的页面验证,也可以实现在后台处理程序中的Java验证 57 . ActionForm的作用?[难] ActionForm属于一种数据传输对象,联系了前台页面与后台的Action方法,实现了前台与后台之间的数据转换和传递。它的作用主要体现在以下几个方面: 1 ) 在显示页面的时候用于完成页面中各种控件的初始化工作。 2 ) 在用户提交请求的时候,ActionForm又代表了用户所提交的数据,供Action以及后续的业务处理方法使用 ActionForm还有另外一个作用就是对用户提交数据的合法性进行验证 Java 基础就业题库 1 . 类和对象的区别? [易] 类是对象的抽象,是模型概念,而对象是实实在在存在的事物,是现实中存在的实体 2 . Java类库中八个标准包分别是什么? [易] java.lang 提供常用的类、接口、一般异常、系统等编程语言的核心内容。 java.util 包含日期、日历、向量、堆栈等实用工具。 java.io 包含输入输出流类、文件类等与输入输出I/O有关的类。 java.awt 包含窗口和屏幕元素类,事件处理接口等与图形用户界面有关的内容。 java.applet 提供为编写applet小程序所需要的类。 java.text 提供与文本有关的类。 java.net 包含url类等与网络传输有关的东西。 java.sql 提供与数据库应用相关的类和接口。 3 . 接口和抽象类有什么区别? [中] 接口是公开的,不能包含私有的方法或变量,而抽象类是可以有私有方法或私有变量的, 实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法, 接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承, 接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用. 一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。 4 . 说说java中的内存分配? [难] Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。 堆内存用于存放由 new 创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。 引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用 new 产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。但是在写程序的时候,可以人为的控制 5 . Character类有哪些常用方法? [难] charValue() 返回字符对象对应的值。 digit( char , int ) 以指定基数返回字符 ch 对应的数值。 equals(Object) 比较该对象和指定对象。 forDigit( int , int ) 确定以指定基数指定的数对应的字符。 getNumericValue( char ) 返回此字符对应的 Unicode 的非负整型值。 getType( char ) 返回一个表示字符种类的值。 hashCode() 返回此字符对应的哈希码。 isDefined( char ) 判定一个字符在 Unicode 中是否有定义。 isDigit( char ) 判定指定字符是否为数字。 isIdentifierIgnorable( char ) 判定指定字符在 Java 标识符中或 Unicode 标识符中是否应看作是一个可忽略字符。 isISOControl( char ) 判定指定字符是否为 ISO 控制字符。 isJavaIdentifierPart( char ) 判定指定字符是否为 Java 标识符中除首字符外的字符。 isJavaIdentifierStart( char ) 判定指定字符是否可作为 Java 标识符的首字符。 isJavaLetter( char ) 判定指定字符是否为 Java 字母,若是,它可作为 Java 语言中一个标识符的首字符。 不推荐使用该方法。 isJavaLetterOrDigit( char ) 判定指定字符是否为 Java 字母或数字,若是,它可作为 Java 语言中的一个标识符除首字符外的字符。 不推荐使用该方法。 isLetter( char ) 判定指定字符是否为字母。 isLetterOrDigit( char ) 判定指定字符是否为字母或数字。 isLowerCase( char ) 判定指定字符是否为小写字符。 isSpace( char ) 判定指定字符是否为 ISO-LATIN- 1 空格。 不推荐使用该方法。 isSpaceChar( char ) 判定指定字符是否为 Unicode 空白字符。 isTitleCase( char ) 判定指定字符是否为标题字符。 isUnicodeIdentifierPart( char ) 判定指定字符是否为 Unicode 标识符中除首字符外的字符。 isUnicodeIdentifierStart( char ) 判定指定字符是否可作为 Unicode 标识符首字符。 isUpperCase( char ) 判定指定字符是否为大写字符。 isWhitespace( char ) 据 Java 语言,判定指定字符是否为空格。 toLowerCase( char ) 将给定字符映射为对应的小写字符,若没有对应的小写字符,返回此字符本身。 toString() 返回表示此字符值的串对象。 toTitleCase( char ) 将字符参数转换为标题字符。 toUpperCase( char ) 将字符参数转换为大写字符。 5 .Boolean类有哪些方法? booleanValue() 返回 Boolean 对象对应的布尔值。 equals(Object) 当且仅当参数非空,且是包含与此对象相同的布尔值的布尔对象时,返回 true 。 getBoolean(String) 当且仅当以参数命名的系统属性存在,且等于 "true" 时,返回为 true 。 hashCode() 返回此布尔值对应的哈希码。 toString() 返回表示当前布尔值的一个串对象。 valueOf(String) 返回表示指定串的布尔值。 6 . String s = new String( "xyz" );创建了几个String Object? [中] 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 7 . String与StringBuffer有什么区别? [难] 从表面看来String类只用一个加号(+)便完成了字符串的拼接,而StringBuffer类却要调用一个append()方法,是否实现起来更简洁,更单纯呢?其实不然,让我们了解一下程序运行内部发生了哪些事情: 经编译后程序的bytecode(字节码)展示出了实质: 在用String类对象直接拼接时,JVM会创建一个临时的StringBuffer类对象,并调用其append()方法完成字符串的拼接,这是因为String类是不可变的,拼接操作不得不使用StringBuffer类(并且--JVM会将 "You are nice." 和 "I love you so much." 创建为两个新的String对象)。之后,再将这个临时StringBuffer对象转型为一个String,代价不菲!可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的str了,这个引用的名称没变,但它指向了新的String对象。 而如果直接使用StringBuffer类,程序将只产生两个对象:最初的StringBuffer和拼接时的String( "I love you so much." ),也不再需要创建临时的StringBuffer类对象而后还得将其转换回String对象。 short s1 = 1 ; s1 = s1 + 1 ;有什么错? short s1 = 1 ; s1 = s1 + 1 ; (s1+ 1 运算结果是 int 型,需要强制转换类型) short s1 = 1 ; s1 += 1 ;有什么错? short s1 = 1 ; s1 += 1 ;(可以正确编译) 8 . 是否可以继承String类? [难] String类是 final 类故不可以继承。 9 . throw 与 throws 有什么区别? [中] throws 是用来声明一个方法可能抛出的所有异常信息 throw 则是指抛出的一个具体的异常类型。 通常在一个方法(类)的声明处通过 throws 声明方法(类)可能抛出的异常信息,而在方法(类)内部通过 throw 声明一个具体的异常信息。 throws 通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw 则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛出。 throws 语句 throws 用来标明一个成员函数可能抛出的各种 "异常" 。对大多数Exception子类来说,Java编译器会强迫你声明在一个成员函数中抛出的 "异常" 的类型。如果 "异常" 的类型是Error或RuntimeException,或它们的子类,这个规则不起作用,因为这copy;在程序 的正常部分中是不期待出现的。如果你想明确地抛出一个RuntimeException,你必须用 throws 语句来声明它的类型。这就重新定义了成员函数的定义语法:type method-name(arg-list) throws exception-list { }下面是一段程序,它抛出了一个 "异常" , 但既没有捕捉它,也没有用 throws 来声明。这在编译时将不会通过。 try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的code会不会被执行,什么时候被执行,在 return 前还是后? 会执行,在 return 前执行。 10 . 常见的runtime exception有哪些?。 [中] ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException NullPointException 11 . 介绍JAVA中的Collection FrameWork(包括如何写自己的数据结构)? [难] 答:Collection FrameWork如下: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements) Map提供key到value的映射 12 . ArrayList和Vector的区别,HashMap和Hashtable的区别 [难] 答:就ArrayList与Vector主要从二方面来说. 一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 二.数据增长:当需要增长时,Vector 默认增长为原来一培,而ArrayList却是原来的一半 就HashMap与HashTable主要从三方面来说。 一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2 引进的Map接口的一个实现 二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 三.值:只有HashMap可以让你将空值作为一个表的条目的key或value 13 . Math.round( 11.5 )等於多少? Math.round(- 11.5 )等於多少? [难] Math.round( 11.5 )== 12 Math.round(- 11.5 )==- 11 round方法返回与参数最接近的长整数. 14 . swtich是否能作用在 byte 上,是否能作用在 long 上,是否能作用在String上? [难] switch (expr1)中,expr1是一个整数表达式。应该是 int 、 short 、 char byte 。 long ,string 都不能作用于swtich。 15 . GC是什么? 为什么要有GC? [难] GC是垃圾收集的意思(Gabage Collection) Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的, Java语言没有提供释放已分配内存的显示操作方法。 16 . 什么叫方法重载 [中] 方法重载就是一个同名方法,有多种不同的签名 说白了就是一个同名方法可以传入不同个数或类型的参数 之间可以互相调用 17 . 数组有没有length()这个方法? String有没有length()这个方法? [中] 数组没有length()这个方法,有length的属性。String有有length()这个方法 18 . 什么是抽象类抽象类 [中] 仅提供一个类型的部分实现。抽象类可以有实例变量,以及一个或多个构造函数。抽象类可以同时有抽象方法和具体方法。一个抽象类不会有实例,这些构造函数不能被客户端调用来创建实例。一个抽象类的构造函数可以被其子类调用,从而使一个抽象类的所有子类都可以有一些共同的实现,而不同的子类可以在此基础上有其自己的实现。 19 . 抽象类的用途 [中] 1 ) 具体类不是用来继承的。 Scott Meyers曾指出,只要有可能,不要丛具体类继承。 2 ) 假设有 2 个具体类,类A和类B,类B是类A 的子类,那么一个最简单的修改方案是应当建立一个抽象类(或java接口)C,然后让类A和类B成为抽象类C的子类。 3 ) 抽象类应当拥有尽可能多的共同代码。以提高代码的复用率。 4 ) 抽象类应当拥有尽可能少的数据。 20 .java中接口有什么用? [难] java不允许多重继承,也就是说一个子类只能有一个父类,Son extends FatherA,FatherB 是错误的 为了弥补这点不足,java允许实现多个接口,Son extends FatherA implements AnotherFatherA,AnotherFatherB是允许的 接口中的方法没有实体,就这一点而言就相当于abstact class ,如: interface ainter{ void dosth( int i); } ainter是一个接口,它仅仅声明了一个方法dosth,而没有具体实现它 class aclass implements ainter { public void dosth( int i) { } } aclass实现了ainter这个接口,因此它必须实现ainter中的方法dosth 21 . 什么叫方法重载 [易] 方法重载就是一个同名方法,有多种不同的签名 说白了就是一个同名方法可以传入不同个数或类型的参数 之间可以互相调用 22 . 垃圾回收机制的原理? [难] 在JAVA中 ,JAVA VM 每隔一段时间就会查看每一块由NEW分配的内存空间,看指向它的有效引用是否存在,如果这个引用不存在,系统会自动将这块空间归入空闲内存区.这个过程被称为 垃圾收集. 23 .. 什么叫面向对象? [中] 面向对象是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。开发一个软件是为了解决某些问题,这些问题所涉及的业务范围称作该软件的问题域。其应用领域不仅仅是软件,还有计算机体系结构和人工智能等。 24 . 面向对象的涉及方法有哪些? [中] OOA-Object Oriented Analysis 面向对象的分析 OOD-Object Oriented Design 面向对象的设计 OOI-Object Oriented Implementation 面向对象的实现 25 . jvm工作原理 [难] 运行jvm 字符码的工作是由解释器来完成的。解释执行过程分三步进行: 代码的装入、代码的校验、和代码的执行。 装入代码的工作由“类装载器 class loader”完成。类装载器负责装入运 行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被调 用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了 通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其他 类。在本台计算机的所有类都在同一地址空间中,而所有从外部引进的类 ,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间 获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。 当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内 存布局。解释器为符号引用与特定的地址空间建立对应关系及查询表。通 过在这一阶段确定代码的内布局,java很好地解决了由超类改变而使子类 崩溃的问题,同时也防止了代码的非法访问。 随后,被装入的代码由字节码校验器进行检查。校验器可以发现操作数栈 益处、非法数据类型转化等多种错误。通过校验后,代码便开始执行了。 java字节码的执行有两种方式: 1 ) 即时编译方式:解释器先将字节编译成机器码,然后再执行该机器码 。 2 )解释执行方式:解释器通过每次解释并执行一小段代码来完成java字节 码程序的所有操作。 26 . .java中输入输出流有哪些相关的类? [难] Input和Output 1 . stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型: 1.1 以字节为导向的stream 以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型: 1 ) input stream: 1 ) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用 2 ) StringBufferInputStream:把一个String对象作为InputStream 3 ) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作 4 ) PipedInputStream:实现了pipe的概念,主要在线程中使用 5 ) SequenceInputStream:把多个InputStream合并为一个InputStream 2 ) Out stream 1 ) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 2 ) FileOutputStream:把信息存入文件中 3 ) PipedOutputStream:实现了pipe的概念,主要在线程中使用 4 ) SequenceOutputStream:把多个OutStream合并为一个OutStream 1.2 以Unicode字符为导向的stream 以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型: 1 ) Input Stream 1 ) CharArrayReader:与ByteArrayInputStream对应 2 ) StringReader:与StringBufferInputStream对应 3 ) FileReader:与FileInputStream对应 4 ) PipedReader:与PipedInputStream对应 2 ) Out Stream 1 ) CharArrayWrite:与ByteArrayOutputStream对应 2 ) StringWrite:无与之对应的以字节为导向的stream 3 ) FileWrite:与FileOutputStream对应 4 ) PipedWrite:与PipedOutputStream对应 以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。 如CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。 1.3 两种不现导向的stream之间的转换 InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。 2 . stream添加属性 2.1 “为stream添加属性”的作用 运用上面介绍的Java中操作IO的API,我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。 如果我们要往一个文件中写入数据,我们可以这样操作: FileOutStream fs = new FileOutStream(“test.txt”); 然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,如果我们想实现“先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中”的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和FilterOutStream的子类,为FileOutStream添加我们所需要的功能。 2.2 FilterInputStream的各种类型 2.2 . 1 用于封装以字节为导向的InputStream 1 ) DataInputStream:从stream中读取基本类型( int 、 char 等)数据。 2 ) BufferedInputStream:使用缓冲区 3 ) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber( int ) 4 ) PushbackInputStream:很少用到,一般用于编译器开发 2.2 . 2 用于封装以字符为导向的InputStream 1 ) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream 2 ) BufferedReader:与BufferedInputStream对应 3 ) LineNumberReader:与LineNumberInputStream对应 4 ) PushBackReader:与PushbackInputStream对应 2.3 FilterOutStream的各种类型 2.2 . 3 用于封装以字节为导向的OutputStream 1 ) DataIOutStream:往stream中输出基本类型( int 、 char 等)数据。 2 ) BufferedOutStream:使用缓冲区 3 ) PrintStream:产生格式化输出 2.2 . 4 用于封装以字符为导向的OutputStream 1 ) BufferedWrite:与对应 2 ) PrintWrite:与对应 3 . RandomAccessFile 1 ) 可通过RandomAccessFile对象完成对文件的读写操作 2 ) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写 3 ) 可以直接跳到文件中指定的位置 4 . I/O应用的一个例子 import java.io.*; public class TestIO{ public static void main(String[] args) throws IOException{ BufferedReader in = new BufferedReader( new FileReader( "F:\\nepalon\\TestIO.java" )); String s, s2 = new String(); while ((s = in.readLine()) != null ) s2 += s + "\n" ; in.close(); BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); System.out.println( "Enter a line:" ); System.out.println(stdin.readLine()); StringReader in2 = new StringReader(s2); int c; while ((c = in2.read()) != - 1 ) System.out.println(( char )c); in2.close()