美文网首页
精选Java面试55题

精选Java面试55题

作者: 磨陀货_ | 来源:发表于2019-05-15 18:25 被阅读0次
    1.简单讲一下java的跨平台原理?

       跨平台就是让我们的程序在不同的操作系统上执行不同的代码。通过Java虚拟机来完成。我们的java代码是在不同Java虚拟机JVM上运行的,不同操作系统安装不同虚拟机

    2.Java中有几种基本数据类型?都有哪些?占多少字节?

    Java中有8种基本数据类型
           byte(字节)        shot(短整型)        int(整型)        long(长整型)
           float(浮点型)        double(双精度)       char(字符型)        boolean(布尔型)

    3.面向对象的特征有哪些方面?

    四大基本特征
    封装:
    继承:
    多态:
    抽象:

    4.有了基本数据类型,为什么换需要包装类型?

       Java是一个面向对象的语言,而基本数据类型不具备面向对象的特性。
       基本数据类型不能为null;

    5.说一下“==”和equals方法究竟有什么区别?

       == 用来判断两个变量之间的值是否相等。变量可以分为基本数据类型变量,引用类型。如果是基本数据类型的变量直接比较值,而引用类型要比较对应的引用的内存地址

       equals用来比较两个对象长得是否一样。判断两个对象的某一些特征是否一样。实际上就是调用对象的equals方法进行比较。

    6.讲一下String和StringBuilder的区别(final)?StringBuffer和StringBuilder的区别?

       String是内容不可变的字符串。 StringBuilder,StringBuffer是内容可以改变的字符串。

    7.讲一下HashMap HashTable的区别? HashTable和ConcurrentHashMap的区别?

    相同点:
       HashMap和HashTable都可以使用来key - value的数据。

    区别:
       1.HashMap是可以把null作为key或者value的,而HashTable是不可以的。
       2.HashMap是线程不安全的,效率较高。而HashTable是线程安全的,效率较低

    8.讲一下什么是设计模式?常用的设计模式有哪些?

       设计模式就是经过前人无数次的实践总结出的,设计过程中可以反复使用的、可以解决特定问题的设计方法。

    单例(饱汉模式、饿汉模式)
       1.构造方法私有化,让除了自己类中能创建外其他地方都不能创建
       2.在自己的类中创建一个单实例(饱汉模式是一出来就创建单实例,而饿汉模式是需要的时候才创建)
       3.提供一个方法获取该实例对象(创建时间需要进行方法同步)

    工厂模式、代理模式、装饰者模式。

    9.VectorArrayList LinkedList的区别?

           ArrayList底层使用是数组。LinkedList使用的是链表。
       ArrayList使用在查询较多,插入删除较少。LinkedList使用查询较少,插入删除较多。

    10.讲一下http get 和post 请求的区别?

       Get和Post请求都是http的请求方式,用户通过不同的http的请求方式完成对资源(url)的不同操作,GET,POST,PUT,DELETE就对应这资源的查,改,增,删四个操作。
       具体点数哦get一般用于获取/查询资源信息,而post一般用于更新资源信息

       1.Get请求提交数据会在地址栏显示出来,而Post请求不会再地址栏显示。
       2.传输数据的大小。Get请求由于浏览器对地址栏长度有限制导致传输的数据有限制,而Post请求不会
       3.安全性。Post的安全性要比Get安全性高。因为数据地址呈现相关

    11.说一下你对servlet的理解?或者servlet是什么?

       Servlet,全称Java Servlet,使用Java编写的服务器端程序。而Servlet都要实现Servlet这个接口。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。Servlet运行于Java的应用服务器中

    12.简单说一下servlet的生命周期?

       servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期有javax.servlet.Servlet接口的init,service和destroy方法表达。
    Servlet启动时,开始加载servlet生命周期开始。Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doxxx方法(doGet,doPost)等,当服务器决定将实例销毁的时候(服务器关闭)调用器destroy方法。

    13.Servlet API中forward()与redirect()的区别?

       1.forward是服务器端的转向,而redurect是客户端的跳转
       2.使用forward浏览器的地址不会发生改变,而redurect会发生改变
       3.forward是一次请求中完成,而redurect是重新发起请求
       4.forward是在服务器端完成,而不用客户端重新发起请求,效率较高

    14.JSP和Servlet有哪些相同点和不同点?

       JSP是Servlet技术的扩展,所有的jsp文件都会被翻译为一个继承HttpServlet的类,也就是jsp最终也是一个Servlet。这个Servlet对外提供服务
       Servlet和Jsp最主要的不同点在于 JSP侧重于视图,Servlet主要用于控制逻辑

       Servlet如果要时间html的功能,必须使用Weiter输出对应的html,比较麻烦。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件,做界面展示比较方便而嵌入逻辑比较复杂。

    15.jsp有哪些内置对象?作用分别是什么?

    九大内置对象:
           request:用户端请求,次请求会包含来自GET/POST请求的参数
           response:网页传回用户端的回应
           pageContext:网页的数据是在这里管理
           session:与请求有关的会话期
           application:servlet正在执行的内容
           out:用来传送回应的输出
           config: servlet的构架部件
           page:JSP网页本身
           exception:针对错误网页,未捕捉的例外

    四大作用域:pageContext、request、session、application 可以通过jstl从四大作用域中取值

    jsp传递值request、session、application、cookie也能传值

    16.说一下session和cookie的区别?你在项目中都有哪些地方使用了?

       cookie和session都是处理http超文本协议的无状态问题,解决页面之间不共享信息的问题,

       二者区别在于 session在处理中文方面比cookie更方便,session可以存储对象,cookie不能。

       cookie的值是存在浏览器网址栏里的相对不安全,session值则是存在服务器里,操作相对安全一些

       cookie只有String,session是Object。cookie有大小4k,session没有限制

    17.简单介绍一下Ajax?

    Ajax--异步的javascript和xml
        通过Ajax与服务器进行数据交换,Ajax可以使页面实现局部更新

        HttpRequest对象,使用这个对象可以异步向服务器发送请求,获取响应,完成局部更新。

    使用场景:
        登录失败时不跳转页面。注册时提示用户是否存在,二级揽联动等等。

    18.jQuery的常用选择器?
    • 基本选择器
             id选择器
                  $(“#myDiv”).html(“”);
             类选择器
                 $(“.myClass”).html(“”);
             元素选择器
                 $(“div”).html(“”);
             所有元素选择器 没用
                 console.debug($(“*”));
             多个元素选择器
                 $(“div,span”).html(“”);
    • 层次选择器(上下级关系)
             id为book li所有都有效果
                 $(“#book li”).css(“color”,”pink”);
             父类元素匹配下面所有子元素, 对子类有效果 孙子不行
                 $(“#book > li”).css(“color”,”yellow”);
             元素from外面相邻的input有效果
                 $(“form + input”).val(“xxx”);
             form外面所有同辈所有input有效果
                 $(“form ~ input”).val(“xxx”);
    19.Jquery的Ajax和原生Js实现Ajax有什么关系?

        jQuery中的Ajax也是通过原生的js封装的。封装完成后让我们使用起来更加便利,不用考虑底层实现或兼容性等处理。

        如果采用原生的js实现Ajax是非常麻烦的,并且每次都是一样的。如果我们不适用jQuery我们也要封装Ajax对象的方法和属性。有像jQuery这些已经封装完成,并进过很多企业实际的框架,比较可靠并且开源。我们就不需要封装,直接使用成熟的框架(jQuery)即可。

    20.什么是MVC模式?

        MVC全名是 Model View Controller,是模型(model)---视图(view)---控制器(controller)的缩写。
        一种软件设计典范,

    最简单经典的就是JSP(view) +Servlet(controller) + JavaBean(model)

    1.当控制器收到来自用户的请求
    2.控制器调用JavaBean完成业务
    3.完成业务后通过控制器跳转JSP页面的方式个用户反馈信息
    4.JSP 给用户做出响应。----控制器都是核心

    21.简单讲一下SpringMVC的执行流程?
    旭旭提供
       核心控制器捕获请求、查找Handler、执行Handler、选择ViewResolver,通过ViewResolver渲染视图并返回

       1.用户向服务器发送请求,请求被Spring前端控制Servlet DispatcherServlet捕获

       2.DispatcherServlet·对请求URL进行解析,得到请求资源标识符(RUI),然后根据该RUI,调用HandlerMapping获取该Handler配置的所有相关对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

       3.DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。(注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler()方法);

       4.获取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作;【将请求转换成一个对象,将对象转换为指定的响应信息。数据转换。数据根式化。数据验证】

       5.Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象;

       6.根据返回的ModelAndView,选择一个合适的ViewReolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet;

       7.ViewResolver结合Model和View,来渲染视图;

       8.将渲染结果返回个客户端;

    22.strus2springMVC有什么不同?

       目前企业中使用SpringMvc的比例已经远远超过Struts2,那么两者到底有什么区别,是很多初学者比较关注的问题,下面我们就来对SpringMvc和Struts2进行各方面的比较:

       1. 核 心控制器(前端控制器、预处理控制器):对于使用过mvc框架的人来说这个词应该不会陌生,核心控制器的主要用途是处理所有的请求,然后对那些特殊的请求 (控制器)统一的进行处理(字符编码、文件上传、参数接受、异常处理等等),spring mvc核心控制器是Servlet,而Struts2是Filter。

       2.控制器实例:Spring Mvc会比Struts快一些(理论上)。Spring Mvc是基于方法设计,而Sturts是基于对象,每次发一次请求都会实例一个action,每个action都会被注入 属性,而Spring更像Servlet一样,只有一个实例,每次请求执行对应的方法即可(注意:由于是单例实例,所以应当避免全局变量的修改,这样会产生线程安全问题)。

       3. 管理方式:大部分的公司的核心架构中,就会使用到spring,而spring mvc又是spring中的一个模块,所以spring对于spring mvc的控制器管理更加简单方便,而且提供了全 注解方式进行管理,各种功能的注解都比较全面,使用简单,而struts2需要采用XML很多的配置参数来管理(虽然也可以采用注解,但是几乎没有公司那 样使用)。

       4.参数传递:Struts2中自身提供多种参数接受,其实都是通过(ValueStack)进行传递和赋值,而SpringMvc是通过方法的参数进行接收。

       5.学习难度:Struts更加很多新的技术点,比如拦截器、值栈及OGNL表达式,学习成本较高,springmvc 比较简单,很较少的时间都能上手。

       6.intercepter 的实现机制:struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3 mvc就容易实现restful url。struts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间 也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。

       7.spring mvc处理ajax请求,直接通过返回数据,方法中使用注解@ResponseBody,spring mvc自动帮我们对象转换为JSON数据。而struts2是通过插件的方式进行处理

       在SpringMVC流行起来之前,Struts2在MVC框架中占核心地位,随着SpringMVC的出现,SpringMVC慢慢的取代struts2,但是很多企业都是原来搭建的框架,使用Struts2较多。

    23.说一下Spring中的两大核心?

    Spring是什么?
       Spring是J2EE应用程序框架,是轻量级的loC和AOP的容器框架(相对于重量级的EJB),主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。

       1、IOC(Inversion of Control )或DI(Dependency Injection)
       IOC控制权反转
           原来:我的Service需要调用DAO,Service就需要创建DAO
           Spring:Spring发现你Service依赖于dao,就给你注入.
        核心原理:就是配置文件+反射(工厂也可以)+容器(map)

    2、AOP:面向切面编程
       核心原理:使用动态代理的设计模式在执行方法前后或出现异常做加入相关逻辑。
       我们主要使用AOP来做:
           1、事务处理
            2、权限判断
            3、日志
            4、....

    24.AOP是什么?你都拿它做什么?
    • AOP:面向切面编程
          核心原理:使用动态代理的设计模式在执行方法前后或出现异常做加入相关逻辑。
          我们主要使用AOP来做:
              1、事务处理 执行方法前,开启事务、执行完成后关闭事务、出现异常后回滚事务
              2、权限判断 在执行方法前,判断是否具有权限
              3、日志 在执行前进行日志处理
              4、....
    25.讲一下Spring的事务传播特性
    26 Spring事务的隔离级别
    27 什么是ORM?
    28 iBatis(mybatis)与Hibernate有什么不同?
    29 Hibernate映射对象的状态
    30 介绍一下Hibernate的缓存?
    31 简单讲webservice使用的场景?
    32说一下linux下面的一下常用命令?
    33你是使用什么来连接远程的Linux服务器的?
    34 Restful和SOAP的区别
    35 什么情况下采用全文检索,全文检索为什么快?你都用到了哪些技术
    36 redis对象保存方式?
    37 Redis数据淘汰机制
    38.数据库的分类及常用的数据库

    数据库分为:关系型数据库和非关系型数据库

       关系型:mysql oracle sqlserver等
       非关系型:redis,memcache,mogodb,hadoop等

    39简单介绍一下关系数据库三范式?

       范式就是规范,就是关系型数据库在设计表时,要遵循的三个规范。
       要想满足第二范式必须先满足第一范式,要满足第三范式必须先满足第二范式。

       第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。列数据的不可分割

       二范式(2NF)要求数据库表中的每个行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。(主键)

       满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。(外键)

    反三范式,有的时候为了效率,可以设置重复或者可以推导出的字段.
    订单(总价)和订单项(单价)

    40事务四个基本特征或 ACID 特性。

       事务是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。

    一个转账必须 A账号扣钱成功,B账号加钱成功,才算正真的转账成功。
       事务必须满足四大特征:原子性,一致性,隔离性持久性/持续性

    原子性:表示事务内操作不可分割。要么都成功、要么都是失败.
    一致性:要么都成功、要么都是失败.后面的失败了要对前面的操作进行回滚。
    隔离性:一个事务开始后,不能后其他事务干扰。
    持久性/持续性:表示事务开始了,就不能终止。

    41说一下msyql的分页?Oracle的分页?
    42简单讲一下数据库的存储过程的使用场景?
    43JDBCPreparedStatement相比Statement的好处
    44数据库连接池作用

       1.限定数据库的个数,不会导致由于数据库连接过多导致系统运行缓慢或崩溃

       2.数据库连接不需要每次都去创建或销毁,节约了资源

       3.数据库连接不需要每次都去创建,响应时间更快

    45有没有做过数据库优化方面的事情?

    做过mysql数据库的优化、其他数据库类似

    定位:查找、定位慢查询
    优化手段:

       a) 创建索引:创建合适的索引,我们就可以现在索引中查询,查询到以后直接找对应的记录。

       b) 分表 :当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,采用水平分表和垂直分表来优化

       c) 读写分离:当一台服务器不能满足需求时,采用读写分离的方式进行集群。

       d) 缓存:使用redis来进行缓存

       e) 一些常用优化技巧

    46如何定位慢查询

       在项目自验项目转测试之前,在启动mysql数据库时开启慢查询,并且把执行慢的语句写到日志中,在运行一定时间后。通过查看日志找到慢查询语句。

    要找出项目中的慢Sql时
    1、关闭数据库服务器(关闭服务)
    2、把慢查询记录到日志中


    旭旭提供

    3、设置慢查询时间


    旭旭提供

    4、找出日志中的慢查询SQL
    使用explain 慢查询语句,来详细分析语句的问题.


    旭旭提供
    47数据库优化之遵循范式?

    数据库表设计时需要遵循方式

    表的范式,是首先符合1NF, 才能满足2NF , 进一步满足3NF
          1NF: 即表的列的具有原子性,不可再分解,即列的信息,不能分解.只要数据库是关系型数据库(mysql/oracle/db2/sysbase/sql server),就自动的满足1NF.关系型数据库中是不允许分割列的。
          2NF:表中的记录是唯一的.通常我们设计一个主键来实现
          3NF:即表中不要有冗余数据, 就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放.(外键)
          反3NF :没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。 订单和订单项、相册浏览次数和照片的浏览次数

    48选择合适的存储引擎

       在开发中,我们经常使用的存储引擎 myisam / innodb/ memory

    MyISAM存储引擎
       如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用myisam存储引擎. 比如 bbs 中的 发帖表,回复表.

    INNODB存储引擎:
       对事务要求高,保存的数据都是重要数据,我们建议使用INNODB,比如订单表,账号表.

    Memory 存储
       我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory, 速度极快.

    问 MyISAM 和 INNODB的区别(主要)
       1. 事务安全 myisam不支持事务而innodb支持
       2. 查询和添加速度 myisam不用支持事务就不用考虑同步锁,查找和添加和添加的速度快
       3. 支持全文索引 myisam支持innodb不支持
       4. 锁机制 myisam支持表锁而innodb支持行锁(事务)
       5. 外键 MyISAM 不支持外键, INNODB支持外键. (通常不设置外键,通常是在程序中保证数据的一致)


    旭旭提供
    49数据库优化之创建合适的索引?

    索引(Index)是帮助DBMS高效获取数据的数据结构。

    分类:普通索引/唯一索引/主键索引/全文索引
       普通索引:允许重复的值出现
       唯一索引:除了不能有重复的记录外,其它和普通索引一样(用户名、用户身份证、email,tel)
       主键索引:是随着设定主键而创建的,也就是把某个列设为主键的时候,数据库就会給改列创建索引。这就是主键索引.唯一且没有null值

       全文索引:用来对表中的文本域(char,varchar,text)进行索引, 全文索引针对MyIsam
       explain select * from articles where match(title,body) against(‘database’);【会使用全文索引】

    50数据库优化之分表?

       一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多。一台服务器满足不要要求是就可以集群处理。Mysql的集群处理技术最常用的就是读写分离。


    旭旭提供

    主从同步
       数据库最终会把数据持久化到磁盘,如果集群必须确保每个数据库服务器的数据是一直的。能改变数据库数据的操作都往主数据库去写,而其他的数据库从主数据库上同步数据。

    读写分离
       使用负载均衡来实现写的操作都往主数据去,而读的操作往从服务器去。

    51 语句优化小技巧

    DDL优化:

       1 、通过禁用索引来提供导入数据性能 。 这个操作主要针对有数据库的表,追加数据
           //去除键
           alter table test3 DISABLE keys;
          //批量插入数据
          insert into test3 select * from test;
          //恢复键
          alter table test3 ENABLE keys;

    2、 关闭唯一校验
       set unique_checks=0 关闭
       set unique_checks=1 开启

    3、修改事务提交方式(导入)(变多次提交为一次)
       set autocommit=0 关闭
       //批量插入
       set autocommit=1 开启

    DML优化(变多次提交为一次)
          insert into test values(1,2);
          insert into test values(1,3);
          insert into test values(1,4);
          //合并多条为一条
          insert into test values(1,2),(1,3),(1,4)
    DQL优化
       Order by优化
          1、多用索引排序
          2、普通结果排序(非索引排序)Filesort
       group by优化
          是使用order by null,取消默认排序
       子查询优化
          在客户列表找到不在支付列表的客户
          /#在客户列表找到不在“支付列表”的客户 , 查询没买过东西的客户
    explain
    select * from customer where customer_id not in (select DISTINCT customer_id from payment); #子查询 -- 这种是基于func外链

       explain
       select * from customer c left join payment p on(c.customer_id=p.customer_id) where p.customer_id is null -- 这种是基于“索引”外链

    • Or优化
      在两个独立索引上使用or的性能优于
         1、 or两边都是用索引字段做判断,性能好!!
         2、 or两边,有一边不用,性能差
         3、 如果employee表的name和email这两列是一个复合索引,但是如果是 :name='A' OR email='B' 这种方式,不会用到索引!

    • limit优化
      select film_id,description from film order by title limit 50,5;

    select a.film_id,a.description from film a inner join (select film_id from film order by title limit 50,5)b on a.film_id=b.film_id

    52 jdbc批量插入几百万数据怎么实现?

    1.每次提交为特定次数提交
    2.使用批量操作


    旭旭提供
    53 mybaits中#和$的区别

       $:要求必须传对象过来(它里面拿的是这个对象的属性) #:可以随意取

       $:是直接拼接字符串 #:是使用占位符的方式

    结论:能用#就用#,如果有#搞不定的就用拼接字符串

    54 什么是B+树,什么是B-树
    55 说几个java8的新特性

    相关文章

      网友评论

          本文标题:精选Java面试55题

          本文链接:https://www.haomeiwen.com/subject/huzxaqtx.html