• 面试题3


    1. javaString是最基本的数据类型吗?

    String不是最基本的数据类型,基本数据类型包括byteintcharlongfloatdoublebooleanshort

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer

    2. intinteger有什么区别?

    int 是基本类型,直接存数值,进行初始化时int类的变量初始为0

    integer是对象,用一个引用指向这个对象,Integer的变量则初始化为null

    3. 运行时异常与一般异常有何异同。

    Throwable是所有Java程序中错误处理的父类,有两种资类:ErrorException

    Error表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出).假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的.

    Exception表示可恢复的例外,这是可捕捉到的

    Java提供了两类主要的异常:runtime exceptionchecked exception

    checked exceptionchecked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误.

    runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等.处理RuntimeException的原则是:假如出现RuntimeException,那么一定是程序员的错误.例如,可以通过检查数组下标和数组边界来避免数组越界访问异常.

    出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。

    如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。异常处理的目标之一就是为了把程序从异常中恢复出来。

     

    4. 请列出jsp的内置对象及方法。

    JSP一共有9个内置对象:requestresponsesessionapplicationoutpagecontextconfigpageexception

    request对象javax.servlet.http.HttpServletRequest类的一个实例。客户端的请求信息封装在resquest中发送给服务器端。request的作用域是一次请求。

    请求方式:request.getMethod()请求的资源:request.getRequestURI()请求用的协议:request.getProtocol()请求的文件名:request.getServletPath()请求的服务器的IPrequest.getServerName()请求服务器的端口:request.getServerPort()客户端IP地址:request.getRemoteAddr()客户端主机名:request.getRemoteHost()

    response对象javax.servlet.http.HttpServletResponse的一个实例。服务端 的相应信息封装在response中返回。

    重定向客户端请求 response.sendRedirect(index.jsp)

    session对象javax.servlet.http.HttpSession的一个实例。在第一个JSP页面被装载时自动创建,完成会话期管理。

    session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。

    获取Session对象编号 session.getId()

    添加objSession对象 session.setAttribute(String key,Object obj)

    获取Sessionsession.getAttribute(String key)

    application对象javax.servlet.ServletContext的一个实例。

    实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在。

    添加objApplication对象 application.setAttribute(String key,Object obj)

    获取Application对象中的值 application.getAttribute(String key)

    out对象javax.servlet.jsp.jspWriter的一个实例。用于浏览器输出数据。

    输出各种类型数据 out.print()

    输出一个换行符 out.newLine()

    关闭流 out.close()

    pageContext 对象javax.servlet.jsp.PageContext的一个对象。作用是取得任何范围的参数,通过它可以获取 JSP页面的outrequestreponsesessionapplication 等对象。

    config 对象javax.servlet.ServletConfig的一个对象。主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。

    cookie 对象Web服务器保存在用户硬盘上的一段文本。唯一的记录了用户的访问信息。

    Cookie对象传送到客户端 Cookie c = new Cookie(username",john");

    读取保存到客户端的Cookie response.addCookie(c)

    exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用。

    5. spring有哪几个模块组成?

    Spring有七大功能模块,分别是Spring CoreAOPORMDAOMVCWEBContext

    Spring Core

    Core模块是Spring的核心类库,Spring的所有功能都依赖于该类库,Core主要实现IOC功能,Sprign的所有功能都是借助IOC实现的。

    AOP

    AOP模块是SpringAOP库,提供了AOP(拦截器)机制,并提供常用的拦截器,供用户自定义和配置。

    ORM

    Spring ORM模块提供对常用的ORM框架的管理和辅助支持,Spring支持常用的Hibernateibtasjdao等框架的支持,Spring本身并不对ORM进行实现,仅对常见的ORM框架进行封装,并对其进行管理

    DAO模块 

    Spring 提供对JDBC的支持,对JDBC进行封装,允许JDBC使用Spring资源,并能统一管理JDBC事物,并不对JDBC进行实现。

    WEB模块 

    WEB模块提供对常见框架如Struts1WEBWORKStruts 2),JSF的支持,Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器。

    Context模块

    Context模块提供框架式的Bean访问方式,其他程序可以通过Context访问SpringBean资源,相当于资源注入。

    MVC模块

    WEB MVC模块为Spring提供了一套轻量级的MVC实现,在Spring的开发中,我们既可以用Struts也可以用Spring自己的MVC框架,相对于StrutsSpring自己的MVC框架更加简洁和方便。

    6. HTTP请求的GETPOST方式的区别?

    GET方法:

    使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器:

    /test/demo_form.jsp?name1=value1&name2=value2

    特点:

    ·        GET请求能够被缓存

    ·        GET请求会保存在浏览器的浏览记录中

    ·        GET请求的URL能够保存为浏览器书签

    ·        GET请求有长度限制

    ·        GET请求主要用以获取数据

    POST方法:

    使用POST方法时,查询字符串在POST信息中单独存在,和HTTP请求一起发送到服务器:

    POST/test/demo_form.jsp HTTP/1.1

    Host:w3schools.com

    name1=value1&name2=value2

    特点:

    ·        POST请求不能被缓存下来

    ·        POST请求不会保存在浏览器浏览记录中

    ·        POST请求的URL无法保存为浏览器书签

    ·        POST请求没有长度限制

    GETPOST的区别:


    GET

    POST

    点击返回/刷新按钮

    没有影响

    数据会重新发送(浏览器将会提示用户数据被从新提交

    添加书签

    可以

    不可以

    缓存

    可以

    不可以

    编码类型(Encoding type)

    application/x-www-form-urlencoded

    application/x-www-form-urlencoded or multipart/form-data. 请为二进制数据使用multipart编码

    历史记录

    没有

    长度限制

    没有

    数据类型限制

    只允许ASCII字符类型

    没有限制。允许二进制数据

    安全性

    查询字符串会显示在地址栏的URL中,不安全,请不要使用GET请求提交敏感数据

    因为数据不会显示在地址栏中,也不会缓存下来或保存在浏览记录中,所以看POST求情比GET请求安全,但也不是最安全的方式。如需要传送敏感数据,请使用加密方式传输

    可见性

    查询字符串显示在地址栏的URL中,可见

    查询字符串不会显示在地址栏中,不可见

     

    更多getpost详细说明

     

    7. SERVLET APIforward()和redirect()的区别?

    前者仅是容器中控制权的转向, 在客户端浏览器地址栏中不会显示出转向后的地址;

    者则是完全的跳转, 浏览器将会得到跳转的地址, 并重新发送请求链接。 这样, 从浏览器的地址栏中可以看到跳转后的链接地址。 所以, 前者更加高效, 在前者可以满足需要时, 尽量使用 forward()方法, 并且, 这样也有助于隐藏实际的链接。 在有些情况下, 比如, 需要跳转到一个其它服务器上的资源, 则必须使用sendRedirect()方法。

    8. jsp中动态INCLUDE与静态INCLUDE的区别?

    动态INCLUDE

           用法:<jsp:include page="included.jsp" flush="true" />

           说明:它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数,先编译之后再进行处理。

     

           原因:1、静态include的结果是把其他jsp引入当前jsp,两者合为一体。

                 2、静态include纯粹是把代码写在外面的一种共享方法,所有的变量都是可以和include它的主文件共享,两者高度紧密结合,不能有变量同名的冲突.而页面设置也可以借用主文件的.

    静态INCLUDE

         用法:<%@ include file="included.htm" %>

         说明:include伪码实现,定不会检查所含文件的变化,适用于包含静态页面,直接将内容先包含后处理。

         原因:1、动态include的结构是两者独立,直到输出时才合并( 看看jsp生成的java文件就可以知道了)

    2、动态includejsp文件独立性很强,是一个单独的jsp文件,需要使用的对象,页面设置,都必须有自己创建,当然,还好它和include它的页面的request范围是一致的。

    9. JVM的工作原理尤其是调优处理。

    JVM工作原理和特点主要是指操作系统装入JVM是通过jdkJava.exe来完成,通过下面4步来完成JVM环境.

    1.创建JVM装载环境和配置

    2.装载JVM.dll

    3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例

    4.调用JNIEnv实例装载并处理class类。

    10. Redismemcache各自的优缺点?

    ① Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcache相比一个最大的区别。

    ② Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcache只是简单的K/V缓存。

    ③ 他们的扩展都需要做集群;实现方式:master-slaveHash

    ④ 100k以上的数据中,Memcache性能要高于Redis

    ⑤ 如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcache。当然,这和你的应用场景和数据特性有关。

    ⑥ 如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis,因为这两个特性Memcache都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。

    ⑦ RedisMemcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上面Memcache更强

    11. 简单说说hibernatemybatis的区别?

    ① Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。

    ② Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。

    ③ iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。

    ④ iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

    跟多详情

    12. 为什么出现Mavenmaven的优缺点,maven打包与普通打包有什么不同点

    优点如下:

    ① 简化了项目依赖管理:

    ② 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作

    ③ 便于与持续集成工具(jenkins)整合

    ④ 便于项目升级,无论是项目本身升级还是项目使用的依赖升级。

    ⑤ 有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。

    ⑥ maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等

    缺点如下:

    ⑦ maven是一个庞大的构建系统,学习难度大

    ⑧ maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。

    ⑨ 当依赖很多时,m2eclipse 老是搞得Eclipse很卡。

    ⑩ 中国的网络环境差,很多repository无法访问,比如google codejboss 仓库无法访问等。

    maven更详细介绍

     

    13. 你是如何理解控制反转(IOC)依赖注入(DI)的?

    IoCInversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。

    DIDependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

    详细介绍

    14. 什么叫做SQL注入,如何防止?请举例说明?

    SQL注入是常见的利用程序漏洞进行攻击的方法。导致sql注入攻击并非系统造成的,主要是程序中忽略了安全因素,利用sql语言漏洞获得合法身份登陆系统

    例如:

    "Select * from users where name='"+uName+"' and pwd='"+uPwd+"' "

    如用户在t_name中输入tomor 1=1 就可以进入系统了。

    生成语句:

    Select * from users where name = tomor 1=1and pwd=123

    防止sql注入的方法有如下几点:

    使用参数化过滤语句

    web应用程序的开发过程中所有阶段实施代码安全检察

    使用存储过程

    15. 编程题:写一个Singleton出来。

    第一种:饱汉模式

    public class SingleTon {  

      

        private SingleTon(){  

              

        }  

      

        //实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间     

        private final static SingleTon instance = new SingleTon();  

        public static SingleTon getInstance(){  

         

            return instance;  

        }  

    }  

    第二种:饥汉模式

    public class SingleTon {  

      

        private SingleTon(){  

      

    }  

    private static instance = null;//new SingleTon();   

        public static synchronized SingleTon getInstance(){  

        if(instance == null){  

            instance = new SingleTon();  

            }  

            return instance;  

    }  

     

    16. 已知商品的关系模型:G (GNO,GNAME,GSALES,GPRICE,GTIME),GNO为商品编号,GANME为商品名称,GSALES为商品销售量,GPRICE为商品价格,GTIME为商品上架时间,按要求写SQL语句,假设数据库是mysql,创建这张商品表的sql。取商品销售额排名前5的商品名称和上架时间。

     

    创建表

    CREATE TABLE `G`  (

      `GNO` varchar(10) NOT NULL,

      `GNAME` varchar(20) NULL,

      `GSALES` decimal(10, 2) NULL,

      `GPRICE` decimal(10, 2) NULL,

      `GTIME` datetime(0) NULL,

      PRIMARY KEY (`GNO`)

    );

    查询销售额前5的商品名称和上架时间

    select GNAME,GTIME from g order by GSALES desc limit 0,5

     

    17. 逻辑题:现在小明一家过一座桥,过桥的时候是黑夜,所以必须有灯。现在小明过桥要一秒,小明的弟弟过桥要3秒,小明的爸爸要6秒,小明的妈妈过桥要8秒,小明的爷爷要12秒。每次此桥最多过两人,而过桥的速度依过桥的最慢者而定,而且灯在点燃后30秒就会熄灭。请问小明一家如何过桥请说明步骤。

    小明和弟弟过去,小明回来,4分钟

    妈妈和爷爷过去,弟弟回来,15分钟

    爸爸和小明过去,小明回来,7分钟

    小明和弟弟过桥,3分钟

    合计4+15+7+3=29分钟

     




    查看原文:http://www.coder306.cn/?p=156
  • 相关阅读:
    vue2.0 + vux (六)NewsList 资讯页 及 NewsDetail 资讯详情页
    vue2.0 + vux (五)api接口封装 及 首页 轮播图制作
    vue2.0 + vux (四)Home页
    vue2.0 + vux (三)MySettings 页
    vue2.0 + vux (二)Footer组件
    vue2.0 + vux (一)Header 组件
    vue2 + typescript2 自定义过滤器
    flexible.js + makegrid.js 自适应布局
    vue-router钩子beforeRouteEnter函数获取到this实例
    weex 项目搭建
  • 原文地址:https://www.cnblogs.com/coder306/p/13087693.html
Copyright © 2020-2023  润新知