面试题精选一

很长时间没有来维护了,哎,身在项目啊。

问答题:
一、一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?
答案:一个 Java 源文件中可以有多个类,但是只能有一个public类,而且如果有public类的话,这个文件的名字要和这个类的名字一样.如果没有public类,文件名可以不和这个类一样.
为什么:要知其然还要知其所以然!
    提示:从软件架构设计和安全性设计上得出的结论.
1.    每个编译单元(文件)只能有一个public   类.这么做的意思是,每个编译单元只能有一个公开的接口,而这个接口就由其public   类来表示.你可以根据需要,往这个文件里面添加任意多个提供辅助功能的package   权限的类.但是如果这个编译单元里面有两个或两个以上的public   类的话,编译器就会报错.
2.    public类的名字必须和这个编译单元的文件名完全相同,包括大小写.所以对Widget类,文件名必须是Widget.java,不能是widget.java   或WIDGET.java.如果你不遵守,编译器又要报错了.
3.    编译单元里面可以没有public   类,虽然这种情况不常见,但却是可以
的.这时,你就能随意为文件起名字了.
二、equals() 和 “==”的区别
    答案:String中  equals() 比较的是两个字符串内容  而==比较的是两个字符串的内存地址.
为什么:要知其然还要知其所以然!
    1.提示:机制是什么?
    2.如果打不上来,要进一步引导:
    比如:    s1=new String("we are students");
        s2="We are students";
        这两个是一样的吗?(不一样)
        new是用新建一个对象的方法.而后一种是放在常量池中的.
    当下次再用这种方法去创建的时候,就会去常量池里面找,所以
        s2="We are students";
               s3="We are students";
    这两个是相同的,指向常量池中的"We are students".
    3.进一步问:    s1=new String("we are students");
        s4=new String(s1);
        这两个是不同的对象,尽管他们的内容是一样的.
    4.请对3的答案做一个生动的比喻
    就像有两个人,他们的名字是相同的,但是并不是一样的人.
    5.进一步问:
    String s = "Hello world!";
    许多人都做过这样的事情,但是,我们到底声明了什么?
    第一种回答:声明了一个String,内容是“Hello world!”.这样模糊的回答通常是概念不清的根源.
    正确答案:这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个 String类型的对象.这就是真正发生的事情.我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量.所以,如 果在刚才那句语句后面,如果再运行一句:
    String string = s;
    我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象.
三、是否可以继承String这个类
答案:不可以.因为String类是final.
    为什么:要知其然还要知其所以然!
    1.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading
    2. 进一步问:
    String s = "a" + "b" + "c" + "d" + "e";共创建了几个对象?
赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量 对于常量,编译时就直接存储它们的字面值而不是它们的引用 在编译时就直接讲它们连接的结果提取出来变成了"abcde" 该语句在class文件中就相当于String s = "abcde" 然后当JVM执行到这一句的时候, 就在String pool里找 如果没有这个字符串,就会产生一个
3. 进一步问:
但是如果改成 String s = a+b+c+d+e;?
答案: 3个对象,但只有一个String对象
三个对象分别为
1 StringBuilder
2 new char[capacity]
3 new String(value,0,count);
四、Hibernate与iBatis的作用是什么,他们的区别是什么呢?
    答案:
1.Hibernate和iBateis都是做数据持久化的框架,就等于是一个O/R Mapping解决方案.
有了这框架,只要配置下映射文件,就不需要手写sql语句了.
Hibernate是全自动化的,可以说O/R做的相当全面了.
2.iBateis和Hibernate相比,iBatis最大的特点就是小巧,上手很快.如果你不需要太多复杂的功能,ibatis是能满足你的要求又足够灵活的最简单的解决方案.
3. ibatis可以做大型项目,但开发量会比hibernate多,hibernate只适合做中小型项目,因为其性能是个大问题,当然能把hibernate性能优化的很好是例外,
4. Hibernate本身不提供直接执行UPDATE或DELETE语句的API. Hibernate提供的是状态管理, 只有持久化状态下的对象才可以执行update和delete,否则会抛异常,而ibatis不同,他不是通过状,态去管理对象与数据库的关联,而是直接通过jdbc,也就是直接执行sql,hibernate这种方式比较低效率,不过要求不高是没什么问题的,所以hibernate也提供jdbc的支持,满足不同情况用不同的方式
    两者的特点:
Hibernate的特点:
Hibernate功能强大,数据库无关性好,O/R(对象/关系)映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快.Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO(实体类) 和数据库表之间的映射,以及SQL 的自动生成和执行.程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 提供的方法完成持久层操作.程序员甚至不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行.Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行,但是Hibernate现在已经是主流O/R Mapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于iBATIS.
iBATIS的特点:
iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美.iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改.当系统属于二次开发,无法对数据库结构做到控制和修改,那iBATIS的灵活性将比Hibernate更适合.系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标.在这种情况下iBATIS会有更好的可控性和表现.

现在就市场来说,hibernate的需求要大于ibatas的需求,而hibernate对个人能力的要求更高,即使公司使用ibatas,你在hibernate的基础上也能快速掌握.

五、描述Websphere.Weblogic.Tomcat.Apache.JBoss的特点
    Weblogic.Tomcat.Apache.JBoss 都基于java的基础架构
    概括的说:
Weblogic是一个企业级的应用服务器,其中包括j2ee中的各类应用如jsp,servlet,ejb等,Tomcat是一个初级的应用服务器,不支持EJB,如需EJB功能须用jboss,Apache只是一个web服务器,解释静态网页Html.JBoss含有Jsp和Servlet容器,也就可以做web容器,也包含EJB容器,是完整的J2EE应用服务器
JBoss 是一个运行EJB的J2EE应用服务器.它是开放源代码的项目,遵循最新的J2EE规范.从JBoss项目开始至今,它已经从一个EJB容器发展成为一个 基于的J2EE的一个web操作系统(operating systemfor web),它体现了J2EE规范中最新的技术,含有Jsp和Servlet容器,也就可以做web容器,也包含 EJB容器,是完整的J2EE应用服务器.
Weblogic是BEA公司的产品,是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器WebLogic是用于开发、集成、部署和管理大型分布式Web应用、 网络应用和数据库应 用的Java应用服务器.将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中.
Websphere是IBM公司的产品,基于J2EE的,对Jsp,Servlet,ejb的支持非常好!不过挺复杂的!
WebSphere 是随需应变的电子商务时代的最主要的软件平台.它使您的公司可以开发、部署和整合新一代的电子商务应用,如B2B 电子商务,并支持从简单的网页内容发布到企业级事务处理的商业应用,含有Jsp和Servlet容器,也就可以做web容器,也包含EJB容器,是完整的 J2EE应用服务器
IIS是微软的Internet Information Server的简称!主要是用来提供Web服务的,当然是针对它自己的产品asp的
什么是IIS
首先,Internet Information Server的缩写为(IIS)是一个World Wide Web server.Gopher server和FTP server全部包容在里面. IIS意味着你能发布网页,并且有ASP(Active Server Pages)、JAVA、VBscript产生页面,有着一些扩展功能.IIS支持一些有趣的东西,象有编辑环境的界面(FRONTPAGE)、有全文检 索功能的(INDEX SERVER)、有多媒体功能的(NET SHOW) 其次,IIS是随Windows NT Server 4.0一起提供的文件和应用程序服务器,是在Windows NT Server上建立Internet服务器的基本组件.它与Windows NT Server完全集成,允许使用Windows NT Server内置的安全性以及NTFS文件系统建立强大灵活的Internet/Intranet站点.Tomcat含有Jsp和Servlet容器,但不包含EJB容器
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,目前最新版本是6.0.14.
Tomcat 是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成.由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范.因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器.
Apache是世界使用排名第一的Web服务器.它可以运行在几乎所有广泛使用的计算机平台上.Apache 源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一.Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷.Apache的特点是简 单、速度快、性能稳定,并可做代理服务器来使用. 本来它只用于小型或试验Internet网络,后来逐步扩充到各种Unix系统中,尤其对 Linux的支持相当完美.Apache有多种产品,可以支持SSL技术,支持多个虚拟主机.Apache是以进程为基础的结构,进程要比线程消耗更多的 系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器.到目前为止Apache仍然是世界上用的最多的Web服务器,市场占有率达60%左 右.世界上很多著名的网站如Amazon.com、Yahoo!、W3 Consortium、Financial Times等都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、 Windows、Linux系统平台上)以及它的可移植性等方面.
六、DB索引的种类,使用问题,和建立索引的思路是什么
    答案:
三种索引,唯一索引、主键索引、聚集索引
随时发生的增、删、改操作中,索引的存在会大大增加工作量,因此,合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来,才能产生最佳的优化方案.
主键时常作为where子句的条件,应在表的主键列上建立聚聚集索引,尤其当经常用它作为连接的时候.
有大量重复值且经常有范围查询和排序、分组发生的列,或者非常频繁地被访问的列,可考虑建立聚聚集索引.
经常同时存取多列,且每列都含有重复值可考虑建立复合索引来覆盖一个或一组查询,并把查询引用最频繁的列作为前导列,如果可能尽量使关键查询形成覆盖查询.
如果知道索引键的所有值都是唯一的,那么确保把索引定义成唯一索引.
在一个经常做插入操作的表上建索引时,使用fillfactor(填充因子)来减少页分裂,同时提高并发度降低死锁的发生.如果在只读表上建索引,则可以把fillfactor置为100.
在选择索引字段时,尽量选择那些小数据类型的字段作为索引键,以使每个索引页能够容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必须遍历的索引页面降到最小.此外,尽可能地使用整数为键值,因为它能够提供比任何数据类型都快的访问速度.
七、谈谈Hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的
八、Java中实现多态的机制是什么?
    答案:
    靠的是父类和接口的定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定.就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法而不是引用变量类型中的定义的方法.
九、iBATIS一词来源于?是什么?
答案:“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目.最初侧重于密码软件的开发,现在是一个基于Java的持久层框架.
十、对Spring的理解
    答案:
Spring实现了工厂模式的工厂类(在这里有必要解释清楚什么是工厂模式),这个类名为 BeanFactory(实际上是一个接口),在程序中通常BeanFactory的子类ApplicationContext.Spring相当于一个大的工厂类,在其配置文件中通过<bean>元素配置用于创建实例对象的类名和实例对象的属性
Spring提供了对IOC良好支持,IOC是一种编程思想,是一种架构艺术,利用这种思想可以很好地实现模块之间的解耦.IOC也称为DI(Depency Injection)
设定Spring提供了对AOP技术的良好封装, AOP称为面向切面编程,就是系统中有很多各不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入权限判断,加入异常处理,这种应用称为AOP.实现AOP功能采用的是代理技术,客户端程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明,有两种方式可以实现相同的方法声明,一是实现相同的接口,二是作为目标的子类在,JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类,如果要为某个类生成子类,则可以用CGLI B.在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以Advice对象进行提供,显然要创建出代理对象,至少需要目标类和Advice类.spring提供了这种支持,只需要在spring配置文件中配置这两个元素即可实现代理和aop功能,例如,
<bean id="proxy" type="org.spring.framework.aop.ProxyBeanFactory">
            <property name="target" ref=""></property>
            <property name="advisor" ref=""></property>
</bean>
?
填空:
一、相对Hibernate和Apache OJB等“一站式”(  ORM   )解决方案而言,ibatis 是一种(   “半自动化”   )的(   ORM   )实现.
二、ibatis所用的EL(Expression Language)表达式是(   OGNL(Object-Graph Navigation Language)   ).
三、struts的工作流程是:服务器启动后,根据(   web.xml   )文件加载(   ActionServlet   )读取(  struts-config.xml  )文件内容到内存.它的核心是基于(   拦截器   )原理.
四、一个HTTP请求报文由(   请求行(request line)   )、 (   请求头部(header)   )、(   空行   )和请求数据4个部分组成,请求数据不在(   GET/ POST   )方法中使用,而是在(   GET/POST   )方法中使用.(   GET/POST   )方法适用于需要客户填写表单的场合.与请求数据相关的最常使用的请求头是(   Content-Type   )和(   Content-Length   ).使用(   GET/POST   )时,传递参数长度受限制.
五、如果计算2乘以32等于几,最有效率的计算方法为(   2<<5   ).
?
附加:
一、Struts优缺点
优点:
实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.
有丰富的tag可以用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率
页面导航.使系统的脉络更加清晰.通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处.尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显.
提供Exception处理机制.
数据库链接池管理.
支持I18N.
缺点
转到展示层时,需要配置 forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器
Struts 的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求.所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题.
测试不方便 . Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现.不过有一个Junit的扩展工具Struts TestCase可以实现它的单元测试.
类型的转换 . Struts的FormBean把所有的数据都作为String类型,它可以使用工具 Commons-Beanutils进行类型转化.但它的转化都是在Class级别,而且转化的类型是不可配置的.类型转化时的错误信息返回给用户也是非常困难的.
对Servlet的依赖性过强. Struts处理Action时必需要依赖ServletRequest 和ServletResponse,所有它摆脱不了Servlet容器.
前端表达式语言方面.Struts集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据.可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱.
对Action执行的控制困难. Struts创建一个Action,如果想控制它的执行顺序将会非常困难.甚至你要重新去写Servlet来实现你的这个功能需求.
对Action 执行前和后的处理. Struts处理Action的时候是基于class的hierarchies,很难在action处理前和后进行操作.
对事件支持不够.在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实际是一个表单只能对应一个事件,struts这种事件方式称为application event,application event和component event相比是一种粗粒度的事件
二、说说struts1与struts2的区别
都是MVC的WEB框架
地方打发斯蒂芬struts1的老牌框架,应用很广泛,有很好的群众基础,使用它开发风险很小,成本更低!struts2虽然基于这个框架,但是应用群众并多,相对不成熟,未知的风险和变化很多,开发人员相对不好招,使用它开发项目的风险系数更大,用人成本更高!
struts2毕竟是站在前辈的基础设计出来,它会改善和完善struts1中的一些缺陷,struts1中一些悬而未决问题在struts2得到了解决.
struts1的前端控制器是一个Servlet,名称为ActionServlet,struts2的前端控制器是一个filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter.
struts1的action需要继承Action类,struts2的action可以不继承任何类;struts1对同一个路径的所有请求共享一个Action实例,struts2对同一个路径的每个请求分别使用一个独立Action实例对象,所有对于struts2的Action不用考虑线程安全问题.在struts1中使用formbean封装请求参数,在struts2中直接使用action的属性来封装请求参数.struts1中的多个业务方法放在一个Action中时(即继承DispatchAction时),要么都校验,要么都不校验;对于struts2,可以指定只对某个方法进行校验,当一个Action继承了ActionSupport且在这个类中只编写了validateXxx()方法,那么则只对Xxx()方法进行校验.(一个请求来了的执行流程进行分析,struts2是自动支持分模块开发,并可以不同模块设置不同的url前缀,这是通过 package的namespace来实现的;struts2是支持多种类型的视图;struts2的视图地址可以是动态的,即视图的名称是支持变量方式的,举例,论坛发帖失败后回来还要传递boardid.视图内容显示方面:它的标签用ognl,要el强大很多,在国际化方面支持分模块管理,两个模块用到同样的 key,对应不同的消息;) 与Struts1不同,Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的.struts配置文件中的redirect视图的url不能接受参数,而struts2配置文件中的 redirect视图可以接受参数.
三、写Hibernate的一对多和多对一双向关联的orm配置的思路
解决方案一,按照Object[]数据取出数据,然后自己组bean
解决方案二,对每个表的bean写构造函数,比如表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1 filed1,type2 field2) ,然后在hql里面就可以直接生成这个bean了.
四、介绍一下Hibernate的二级缓存
(1)首先要问一下清楚什么是缓存
(2)其次再问有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存
(3)最后再问如何配置Hibernate的二级缓存.
缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用.下面是缓存的伪代码:
引出hibernate的第二级缓存,用下面的伪代码分析了Cache的实现原理
Dao
{
    hashmap map = new map();
    User getUser(integer id)
    {
        User user = map.get(id)
        if(user == null)
        {
            user = session.get(id);
            map.put(id,user);
        }
        return user;
    }
}
Dao
{
    Cache cache = null
    setCache(Cache cache)
    {
        this.cache = cache
    }
    User getUser(int id)
    {
        if(cache!=null)
        {
            User user = cache.get(id);
            if(user ==null)
            {
                user = session.get(id);
                cache.put(id,user);
            }
            return user;
        }
        return session.get(id);
    }
}
Hibernate的Session就是一种缓存,我们通常将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部.由于Session代表一次会话过程,一个Session与一个数据库连接相关连,所以Session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关闭.并且Session是线程不安全的,被多个线程共享时容易出现问题.通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,因此,Hibernate的Session这一级缓存的缓存作用并不明显,应用价值不大.Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存.我们希望的是一个人使用过,其他人也可以使用,session没有这种效果.
二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等.在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中.明白了二级缓存原理和有了这个思路后,很容易配置起Hibernate的二级缓存.扩展知识:一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate 的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致.
五、Jdo是什么?
答案:
JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API.JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用).这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上.另外,JDO很灵活,因为它可以在任何数据底层上运行.JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强.
六、j2ee常用的设计模式?说明工厂模式.
    Java中的23种设计模式:
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式),
Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),
Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),
Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),
Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),
Observer(观察者模式), State(状态模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作.首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法.然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例.当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例.
七、开发中都用到了那些设计模式?用在什么场合?
    一般来讲:
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心.通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作.主要用到了MVC的设计模式.用来开发JSP/Servlet或者J2EE的相关应用.简单工厂模式等.
八、BS与CS的联系与区别
    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 程序可以不可避免的整体性考虑,构件的重用性不如在B/S要求下的构件的重用性好.
  B/S 对的多重结构,要求构件相对独立的功能.能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子.
5.系统维护不同
  C/S 程序由于整体性,必须整体考察,处理出现的问题以及系统升级.升级难.可能是再做一个全新的系统.
  B/S 构件组成,方面构件个别的更换,实现系统的无缝升级.系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.
6.处理问题不同
  C/S 程序可以处理用户面固定,并且在相同区域,安全要求高需求,与操作系统相关.应该都是相同的系统.
  B/S 建立在广域网上,面向不同的用户群,分散地域,这是C/S无法作到的.与操作系统平台关系最小.
7.用户接口不同
  C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高
  B/S 建立在浏览器上,有更加丰富和生动的表现方式与用户交流.并且大部分难度减低,减低开发成本.
8.信息流不同
  C/S 程序一般是典型的中央集权的机械式处理,交互性相对低.
B/S 信息流向可变化,B-B B-C B-G等信息、流向的变化,更像交易中心.
九、J2EE是技术还是平台还是框架?什么是J2EE?
答案:J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台.
J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术.
十、请对以下在J2EE中常用的名词进行解释(或简单描述)
答案:
web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题.主要有WEB服务器来实现.
例如:
TOMCAT,WEBLOGIC,WEBSPHERE等.该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准.我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器.
EJB容器:Enterprise java bean 容器.更具有行业领域特色.他提供给运行在其中的组件EJB各种管理功能.只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理.并且可以通过现成的接口来获得系统级别的服务.例如邮件服务、事务管理.
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能.
JMS:(Java Message Service)JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播.
JTA:(Java Transaction API)JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可.
JAF:(Java Action FrameWork)JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略.
RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务.
例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用.当然这是要通过一定的规范才能在异构的系统之间进行通信.RMI是JAVA特有的.
十一、如何设定的weblogic的热启动模式(开发模式)与产品发布模式?
答案:可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一.或者修改服务的启动文件或者commenv文件,增加set PRODUCTION_MODE=true.
十二、如何启动时不需输入用户名与密码?
答案:修改服务启动文件,增加 WLS_USER和WLS_PW项.也可以在boot.properties文件中增加加密过的用户名和密码.
十三、客服端调用EJB对象的几个基本步骤
    答案:
设置JNDI服务工厂以及JNDI服务地址系统属性,查找Home接口,从Home接口调用Create方法创建 Remote接口,通过Remote接口调用其业务方法.
?
上机题:
一、    编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为 .jad.
答案: listFiles方法接受一个FileFilter对象,这个FileFilter对象就是过虑的策略对象,不同的人提供不同的FileFilter实现,即提供了不同的过滤策略.
由本题总结的思想及策略模式的解析:
class jad2java{
    1. 得到某个目录下的所有的java文件集合
        1.1 得到目录 File srcDir = new File("d:\\java");
        1.2 得到目录下的所有java文件:
File[] files = srcDir.listFiles(new MyFileFilter());
        1.3 只想得到.java的文件:
class MyFileFilter implememyts FileFilter{
                public boolean accept(File pathname){
                    return pathname.getName().endsWith(".java")
                }
            }
    2.将每个文件复制到另外一个目录,并改扩展名
        2.1 得到目标目录,如果目标目录不存在,则创建之
        2.2 根据源文件名得到目标文件名,注意要用正则表达式,注意.的转义。
        2.3 根据表示目录的File和目标文件名的字符串,得到表示目标文件的File。
        //要在硬盘中准确地创建出一个文件,需要知道文件名和文件的目录。
        2.4 将源文件的流拷贝成目标文件流,拷贝方法独立成为一个方法,方法的参数采用抽象流的形式。
        //方法接受的参数类型尽量面向父类,越抽象越好,这样适应面更宽广。
}
3.分析listFiles方法内部的策略模式实现原理
File[] listFiles(FileFilter filter){
File[] files = listFiles();
            //Arraylist acceptedFilesList = new ArrayList();
            File[] acceptedFiles = new File[files.length];
            int pos = 0;
            for(File file: files){
                boolean accepted = filter.accept(file);
                if(accepted){
                    //acceptedFilesList.add(file);
                    acceptedFiles[pos++] = file;
                }
            }
        Arrays.copyOf(acceptedFiles,pos);
        //return (File[])accpetedFilesList.toArray();
}

二、    第1个人10,第2个比第1个人大2岁,依次递推,请用递归方式计算出第8个人多大?
答案:
package cn.itcast;
import java.util.Date;
public class A1 {
    public static void main(String [] args)
    {
        System.out.println(computeAge(8));
    }
    public static int computeAge(int n)
    {
        if(n==1) return 10;
        return computeAge(n-1) + 2;
    }
}


三、    如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。
答案:
int engishCount;
int chineseCount;
int digitCount;
for(int i=0;i<str.length;i++)
{
    char ch = str.charAt(i);
    if(ch>='0' && ch<='9')
    {
        digitCount++
    }
    else if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z'))
    {
        engishCount++;
    }
    else
    {
        chineseCount++;
    }
}

四、说明生活中遇到的二叉树,用java实现二叉树
这是组合设计模式。
我有很多个(假设10万个)数据要保存起来,以后还需要从保存的这些数据中检索是否存在某个数据,假如存在数组中,那么,碰巧要找的数字位于99999那个地方,那查找的速度将很慢,因为要从第1个依次往后取,取出来后进行比较。
平衡二叉树可以很好地解决这个问题,但二叉树的遍历(前序,中序,后序)效率要比数组低很多.

四、    有三个小孩放炮竹。A每一秒一放、B每两秒一放、C每三秒一放,现在给每个小孩100个炮竹,请编程计算当C放完最后一个炮竹,一共会听到多少响。(两个或者三个炮竹一起放只有一响!)
答案:
最简单的一种
炮竹数大于等于人数
M(人数),N(炮竹数),X(炮竹响数)
X = N*(1+M)/2

炮竹数小于等于人数
M(人数),N(炮竹数),X(炮竹响数)
X = N*(1+M)/2 + 1

你可能感兴趣的:(java,框架,DB,J2EE,面试题)