zoukankan      html  css  js  c++  java
  • 面试题集第一季

     笔试v2.1 时间(限制1hour)

    一、java基础

    1.以下程序的输出结果是什么? (de)    考察点:字符串处理方法的应用

    /**
    * Returns a new string that is a substring of this string. The
    * substring begins at the specified <code>beginIndex</code> and
    * extends to the character at index <code>endIndex - 1</code>.
    * Thus the length of the substring is <code>endIndex-beginIndex</code>.
    * <p>
    * Examples:
    * <blockquote><pre>
    * "hamburger".substring(4, 8) returns "urge"
    * "smiles".substring(1, 5) returns "mile"
    * </pre></blockquote>

    这是底层源码的注释和实例:截取长度从零开始,endIndex-1就是数组索引值-1

    2.下列程序的输出结果是什么?   考察点:==和equals的使用   true false true true

    == 是关系运算符,equals()是方法,结果都返回布尔值;

    Object的==和equlas()比较的都是地址值,且作用相同

    ==作用:

    1、基本类型,比较值是否相等;2、引用类型,比较内存的地址值是否相等;3、不能比较没有父子关系的两个对象

    equals()方法的作用:

    JDK中的类一般已经重写了equals方法,比较的是内容;

    自定义的类如果没有重写equals,将调用父类默认的equals方法,将调用Object的equals方法,进行比较的同时使用了this == obj

    可以按照相对应的需求逻辑,重写equals方法,(一般情况下,重写equals方法,必然需要重写hashCode方法)

     3.下列程序输出结果是什么?    if里面只能是true or false   这里明显出现了错误   肯定什么都不会输出

     4. 以下代码将得到什么结果?   考察点:字符串的处理   hello,world

          

     5.以下程序的运行结果是什么?  请作具体分析:

            推荐答案:  考察点(作用域),变量名虽然相同,但只在各自的作用域里面起作用,main方法里面只输出hello,不会输出world,第一个test静态方法没有返回值调用了也没有输出值

     7、try{}里有一个return 语句,紧跟在try后面的finally里面的code会不会被执行,什么时候执行?在return之后还是之前?  考察点:try、catch、finally带return的执行顺序总结

            推荐答案: 先执行try里面的code,暂时保存return返回的内容之后在执行finally里面的code      

          finally中的代码总会被执行。

       当try、catch中有return时,也会执行finally。return的时候,要注意返回值的类型,是否受到finally中代码的影响。

        finally中有return时,会直接在finally中退出,导致try、catch中的return失效。

       8、以下的代码执行后的结果是什么?   (考察点: i-- 和 i++的使用)  答案:5,4

           

     9、关于函数重载,下面说法的是那个?  (考察点:重写和重载的区别) B

      (A) 重载函数的函数名必须相同

    (B)重载函数的返回值必须相同

      (C) 重载的函数体可以不同

    (D)重载函数必须在参数和个数或类型有所不同

       重载:    在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。

       重写: 

    1.发生在父类与子类之间
    2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
    3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
    4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常

    二 、java Web

    1、jsp内置有哪些对象,分别有什么作用?

            参考答案: 

      1、Request对象:对应java类javax.servlet.http.HttpServletRequest;客户端的请求信息,Http协议头信息,cookie,请求参数等;

      2、Response对象:对应java类javax.servlet.http.HttpServletResponse对象,用于服务端响应客户端的请求,返回请求的处理之后的信息;

      3、out对象:对应java类javax.servlet.jsp.JspWriter;用于服务端传输内容到客户端的输出流

      4、Config对象:对应java类javax.servlet.ServletConfig;初始化时,jsp引擎向jsp页面传递的信息

      5、Session对象:对应java类javax.servlet.http.HttpSession;客户端与服务端之间的会话临时存储

      6、Application对象:应用的声明周期信息

      7、Exception对象:对应java类java.lang.Throwabl;页面发生异常,产生的异常对象

      8、page对象:对应java类java.lang.Object;指向jsp页面本身

      9、PageContext对象:对应java类java.servlet.jsp.PageContext;页面的上下文   

    2、在html中,有一个城市下拉框;你怎么获取当前选中的城市的value值和名称(用jq或者js)

     参考如下:

     

     3、JSP和Servlet有什么不同点和区别

    参考答案:

    JSP:

    是servlet的一个拓展,本质上还是servlet;

    每个jsp页面就是一个servlet实例

    jsp页面被web容器编译成servlet,Servlet(配置php环境的都知道),Servlet在负责响应用户请求

    Servlet:

    一种服务端的java应用程序

    用与web容器加载和管理

    用于生成动态Web内容

    负责处理客户端请求

    区别: 

      内置对象不同,获取内置对象的方式方法不同;

    Servlet适用于输出web数据对请求和业务做逻辑处理,jsp比较适用于在html页面中嵌入java代码,方便视图的显示

    4、Servlet是否线程安全?如何避免(这个常被问到)

        首先Servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例对应客户端多个请求。所以Servlet是线程不安全的(采用的单例模式)。

         如何避免:

       1,实现 SingleThreadModel 接口的servlet是线程安全的
     2,用synchronized同步对共享数据版的操作
     3,避免使用实例变量
     Servlet的优势在于多线程,高并发。第一种方法其实就是扼杀了其并发性能权,所以不推荐在高并发的业务环境下使用。

      5、请写出常用jstl标签。包括定义变量,判断、迭代、多重分支判断

    <c:redirect>标签通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持c:param标签。

    <c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象。

    <c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。

    <c:set var="url" value="123"></c:set>  定义变量 set  类似于js定义变量

    多重分支判断:

    <c:if test="${score ge 90 and score le 100}" var=“f1” scope=“page”>A</c:if>
    <c:choose>本身只当做<c:when>和<c:otherwise>的父标签
    <c:when><c:choose>的子标签,用来判断条件是否成立

      三、j2EE 框架

    1.简述Struts2框架下的开发流程(从客户端发起请求到最后返回具体的结果,这期间分别经历那些阶段,这些阶段分别干了些什么工作,越详细越好)

     

     2.Struts2的Action类继承的基类是什么?

    3.Hibernate的工作原理是什么?为什么要使用Hibernate

       推荐答案:

        工作原理:

      1.启动框架,读取配置文件;通过Configuration().configure(“Hibernate.cfg.xml”)方法的调用,读取并解析hibernate.cfg.xml配置文件

            2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>进行映射我们将要操作的对象

      3.通过config.buildSessionFactory() //Session的工厂模式,创建SessionFactory

      4.sessionFactory.openSession();//通过Session的工厂模式继而打开Sesssion链接事务

      5.session.beginTransaction();//创建事务Transation

      6.persistent operate持久化操作

      7.session.getTransaction().commit();//提交事务

      8.关闭Session

      9.关闭SesstionFactory

    为什么要使用:    

      1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

      2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作

      3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

      4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

    4 MyBatis的工作原理是什么?为什么要使用MyBatis

    这张图很形象的解释了整个过程

     

    mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)来构建SqlSessionFactory(SqlSessionFactory是线程安全的);

    然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。

    说明:SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接(Hibernate 底层也是如此)。

    详细流程如下:

    1、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。

    2、SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。

    3、SqlSession对象完成和数据库的交互:
    a、用户程序调用mybatis接口层api(即Mapper接口中的方法)
    b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
    c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
    d、JDBC执行sql。

    e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。

    为什么使用:

    1、数据库连接创建、关闭频繁,资源浪费影响性能(连接池解决);

    2、sql语句硬编码,不宜维护;

    3、预编译的Statement占有位符号传参存在硬编码,不易维护

    4、结果集解析存在硬编码,SQL变化导致解析代码变化,不易维护。(截数据记录封装到pojo对象解析较为方便)

    5.以上两者的区别在哪?请写明各自优缺点。

      5.1 开发方面

            在项目开发过程当中,就速度而言:

                hibernate开发中,sql语句已经被封装,直接可以使用,加快系统开发;

                Mybatis 属于半自动化,sql需要手工完成,稍微繁琐;

            但是,凡事都不是绝对的,如果对于庞大复杂的系统项目来说,发杂语句较多,选择hibernate 就不是一个好方案。

        5.2 sql优化方面

            Hibernate 自动生成sql,有些语句较为繁琐,会多消耗一些性能;

            Mybatis 手动编写sql,可以避免不需要的查询,提高系统性能;

        5.3 对象管理比对

            Hibernate 是完整的对象-关系映射的框架,开发工程中,无需过多关注底层实现,只要去管理对象即可;

            Mybatis 需要自行管理 映射关系;

        5.4 缓存方面    

    相同点:

    Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓    存方案,创建适配器来完全覆盖缓存行为。

    不同点:

    Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。

    MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。

    各自优势:

    Hibernate优势

    1. Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。

    2. Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。

    3. Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。

    4. Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

    Mybatis优势

    1. MyBatis可以进行更为细致的SQL优化,可以减少查询字段。

    2. MyBatis容易掌握,而Hibernate门槛较高。

      Mybatis:小巧、方便、高效、简单、直接、半自动化

      Hibernate:强大、方便、高效、复杂、间接、全自动化

    6.Spring有哪些特点?为什么使用Spring

    1.方便解耦,简化开发
    通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
    2.AOP编程的支持
    通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
    3.声明事物的支持
    在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
    4.方便程序的测试
    可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
    5.方便集成各种优秀框架
    Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
    6.降低Java EE API的使用难度
    Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
    7.Java 源码是经典学习范例
    Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
    好处:
    在我们进入细节以前,让我们看一下Spring可以给一个工程带来的一些好处:
    Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题。Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
    Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。
    Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
    Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
    使用Spring构建的应用程序易于单元测试。
    Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
    Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
    Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
    Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
    总结起来,Spring有如下优点:
    1.低侵入式设计,代码污染极低
    2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
    3.Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
    4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
    5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
    6.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部

    7.Spring的依赖注入有哪几种方式  

      依赖注入有三种方式:

    · 使用属性的setter方法注入  这是最常用的方式;

    · 使用构造器注入;

    · 使用Filed注入(用于注解方式).

    四、设计模式

    1、请你列举所熟悉的设计模式,并指出应用场合。

    单例模式:控制对象个数

    装饰者模式:java的IO系统中使用了较多的装饰模式,主要用于给一个对象添加更多更好的功能,比如说给输入输出流添加缓冲

    工厂模式:需要使用对象的时候使用工厂来创建对象

    抽象工厂模式:可以创建多个系统的对象

    适配器模式:在不同的系统之间做耦合的作用

    建造者模式:将创建过程封装起来

    2、请手写一个单列模式

    懒汉式:

            Class singelton{

      private static SinglePattern instance;
      private SinglePattern(){}
      public static synchronized SinglePattern getInstance(){
      if(instance == null){
      instance = new SinglePattern();
      }
      return instance;
      }

    }

    五、数据库

    1、请简述 truncate 和 delete,drop语句的异同;

    一、delete

    1、delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。

    2、delete可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录。

    3、delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不变。

    二、truncate

    1、truncate是DDL,会隐式提交,所以,不能回滚,不会触发触发器。

    2、truncate会删除表中所有记录,并且将重新设置高水线和所有的索引,缺省情况下将空间释放到minextents个extent,除非使用reuse storage,。不会记录日志,所以执行速度很快,但不能通过rollback撤消操作(如果一不小心把一个表truncate掉,也是可以恢复的,只是不能通过rollback来恢复)。

    3、对于外键(foreignkey )约束引用的表,不能使用 truncate table,而应使用不带 where 子句的 delete 语句。

    4、truncatetable不能用于参与了索引视图的表。

    三、drop

    1、drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。

    2、drop语句删除表结构及所有数据,并将表所占用的空间全部释放。

    3、drop语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态

    2、要求用一句sql 查询出 每个部门所含的员工人数,没有的也要显示出来!

    SELECT c.deptno,c.dname,t.num from dept as c
    LEFT JOIN (SELECT deptno,count(*) as num
    from emp GROUP BY deptno) as t on c.deptno = t.deptno;

    dept 部门表,emp员工表,

    查询结果如下图所示:

     

    觉得写的可以的,给个赞赏!谢谢各位看官

  • 相关阅读:
    记一次5000并发的调试过程
    Thread Local Area内存溢出的处理方法
    关于不停机部署方案的选择
    Spring Cloud版本选择
    python学习记录-机器学习
    SAM宏观生态学空间分析帮助文档
    arcgis raster clip and mask difference 栅格 提取 clip 和 mask 方法的区别
    R语言 重命名目录下所有文件
    R语言并行运算示例 parallel 包
    R语言查看栅格值
  • 原文地址:https://www.cnblogs.com/Dsir/p/12892652.html
Copyright © 2011-2022 走看看