第一章 面向对象
第二章 异常
第三章 数组
第四章 常用类
第五章 集合
第六章 IO流
第七章 线程
第八章 反射
第九章 Socket编程

企业java面试题及答案(82~113题)

 

81、以下哪句是对索引的错误描述(C)

A.选择性差的索引只会降低 DML 语句的执行速度

B.选择性强的索引只有被 Access Path 使用到才是有用的索引

C.过多的索引只会阻碍性能的提升,而不是加速性能

D.在适当的时候将最常用的列放在复合索引的最前面

E.索引和表的数据都存储在同一个 Segment 中

 

82、关于锁 locks,描述正确的是(A)

A.当一个事务在表上防止了共享锁(shared lock),其他事务,能阅读表里的数据

B.当一个事务在表上防止了共享锁(shared lock),其他事务,能更新表里的数据

C.当一个事务在表上防止了排他锁(exclusive lock),其他事务,能阅读表里的数据

D.当一个事务在表上防止了排他锁(exclusive lock),其他事务,能更新表里的数据

 

83、如下那种情况下,Oracle不会使用 Full Table Scean(D)

A.缺乏索引,特别是在列上使用了函数,如果要利用索引,则需要使用函数索引。

B.当访问的数据占整个表中的大部分数据时。

C.如果时一个表的 high water mark 数据块数少于初始化参数 DB_FILE_MULTIBLOCK_READ_COUNT。

D.本次查询可以用到该张表的一个引用,但是该表具有多个索引包含用于过滤的字段。

 

84、System.out.println(3/2);System.out.println(3.0/2); System.out.println(3.0/2.0); 分别会打印什么结果?

1

1.5

1.5

 

85、SpringMVC拦截器用过吗?什么场景会用到,过滤器,拦截器,监听器有什么区别?

拦截器:是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强。使用场景:解决请求的共性问题(乱码问题、权限验证问题)。

 

过滤器:Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登录、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。

 

监听器:现在来说说 Servlet 的监听器 Listener,其中有一个监听器是监听上下文的,它实现了javax.servlet.ServletContextListener接口,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。

 

86、ThreadLocal 的原理和应用场景

每一个ThreadLocal能够放一个线程级别的变量,可是它本身能够被多个线程共享使用,并且又能够达到线程安全的目的,且绝对线程安全。

ThreadLocal的应用场景:最常见的ThreadLocal使用场景为用来解决数据库连接、Session 管理等

 

87、简述 TCP 的三次握手

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

  • 第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态, 等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers)。
  • 第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即SYN+ACK 包,此时服务器进入 SYN_RECV 状态。
  • 第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据

 

88、SpringMVC request接收设置是线程安全的吗?

是线程安全的,request、response 以及 requestContext 在使用时不需要进行同步。而根据 spring的默认规则,controller对于BeanFactory而言是单例的。即controller只有一个, controller 中的request等实例对象也只有一个。

 

89、列举 Maven 常见的六种依赖范围

  • compile: 编译依赖范围(默认),对其三种都有效。
  • test: 测试依赖范围,只对测试 classpath 有效。
  • runtime: 运行依赖范围,只对测试和运行有效,编译主代码无效,例如 JDBC。
  • provided: 已提供依赖范围,只对编译和测试有效,运行时无效,例如 selvet-api。
  • system: 系统依赖范围.谨慎使用.例如本地的,maven 仓库之外的类库文件。
  • import(maven2.0.9 以上): 导入依赖范围,不会对其他三种有影响。

 

90、Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么?

Mybatis使用#{}经过预编译的,是安全的,防止sql 注入。

Mybatis拦截器只能拦截四种类型的接口:Executor、StatementHandler、ParameterHandler和ResultSetHandler。这是在Mybatis的Configuration中写死了的,如果要支持拦截其他接口就需要我们重写Mybatis的Configuration。

Mybatis可以对这四个接口中所有的方法进行拦截。

Mybatis拦截器常常会被用来进行分页处理。
​​​​​​​​​​

91、简单解释自动装配的各种模式,或者叫装配方式

在Spring框架中共有5种自动装配:

  • no:这是 Spring 框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。
  • byName:该选项可以根据bean名称设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。
  • byType:该选项可以根据bean类型设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的 bean。如果找到的话,就装配这个属性,如果没找到的话就报错。
  • constructor:造器的自动装配和 byType 模式类似,但是仅仅适用于与有构造器相同参数 的bean,如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
  • autodetect:该模式自动探测使用构造器自动装配或者 byType 自动装配。首先,首先会尝试找合适的带参数的构造器,如果找到的话就是用构造器自动装配,如果在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byTpe的自动装配方式。

 

92、mvc的各个部分都有哪些技术来实现?如何实现的?

MVC是Model-View-Controller的简写。Model代表的是应用的业务逻辑(通过 JavaBean,EJB组件实现),View 是应用的表示面(由JSP页面产生),Controller是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

 

93、反射机制一般应用在什么场景?

  • 逆向代码,例如反编译
  • 与注解相结合的框架,例如Retrofit
  • 单纯的反射机制应用框架,例如EventBus 2.x
  • 动态生成类框架,例如Gson

 

94、设计Java程序,假设有50瓶饮料,喝完三个空瓶可以换一瓶饮料,依次类推,请问总共喝了多少饮料。

 

class Buy {
    public static void main(String[] args) {
        int n = 50;
        int i = 0;
        while (true) {
            n -= 3;
            n++;
            if (n < 3) {
                System.out.println("共喝了" + (50 + i) + "瓶");
                break;
            }
        }
    }
}

 

95、根据某年某月某日,输出这是一年中第几天。

 

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.print("请输入3个整数,分别表示年月日:");
    int year = in.nextInt();
    int month = in.nextInt();
    int day = in.nextInt();
    int sum = 0;
    int[][] a = {
            {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
            {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    };
    for (int i = 0; i < month - 1; i++) {
        if (year % 4 == 0 & year % 100 != 0 | year % 400 == 0)
            sum = sum + a[1][i];
        else
            sum = sum + a[0][i];
    }
    sum = sum + day;
    System.out.println(year + "年" + month + "月" + day + "是这一年的第" + sum + "天");
}

 

96、利润与奖金,某公司销售 10 万元到 20 万元的奖金 10%,在 20 万元的奖金 10 万元以上的奖金 7.5%,到 40 万元超出 20 万元的部分奖金为 5%,到 60 万元的超出 40 万元的部分奖金 3%,到 100 万元的超出 60 万元部分奖金 1%,请输出说的奖金。

 

public class Test {
    public static void main(String[] args) {
        float money = 0;
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入利润:");
        float num = scan.nextInt();
        if (num <= 100000) {
            money = (float) (num * 0.1);
        } else if (num <= 200000) {
            money = (float) ((num - 100000) * 0.075 + 100000 * 0.1);
        } else if (num <= 400000) {
            money = (float) ((num - 200000) * 0.5 + 100000 * 0.175);
        } else if (num <= 600000) {
            money = (float) ((num - 400000) * 0.3 + 100000 * 0.175 + 200000 * 0.5);
        } else if (num <= 1000000) {
            money = (float) ((num - 600000) * 0.015 + 100000 * 0.175 + 200000 * 0.5 + 200000 * 0.3);
        } else {
            money = (float) ((num - 1000000) * 0.01 + 100000 * 0.175 + 200000 * 0.5 + 200000 * 0.3 + 400000 * 0.015);
        }
        System.out.println("奖金:" + money);
    }
}

 

97、除了懒汉式和饿汉式你还了解那些单例模式?

 

//双重检查锁模式
public class DoubleCheckLock {
    private static DoubleCheckLock instance = null;

    private DoubleCheckLock() {
    }

    public static DoubleCheckLock getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckLock.class) {
                if (instance == null) {
                    instance = new DoubleCheckLock();
                }
            }
        }
        return instance;
    }
}

//静态内部类方式
public class StaticInner {
    private static StaticInner instance;

    public static StaticInner getInstance() {
        return SingletonHolder.STATIC_INNER;
    }

    private static class SingletonHolder {
        private static final StaticInner STATIC_INNER = new StaticInner();
    }
}

 

​​​​​​​98、简述SSH的概念以及主要的设计思想?

SSH是Struts+Spring+Hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架。

 

集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的 Web 应用程序。

 

其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理Struts和Hibernate。

 

具体做法是:用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的 Java对象,然后编写基本的DAO(Data Access Objects)接口,并给出 Hibernate的DAO实现,采用Hibernate架构实现的DAO类来实现Java类与数据库之间的转换和访问,最后由Spring 做管理。

 

​​​​​​​99、Linux下如何让命令在后台执行?

要让程序在后台执行,只需在命令行的最后加上“&”符号。例如:$ find . -name abc -print&

 

100、​​​​​​​Linux中rm -i 与 rm -r 个实现什么功能?

rm –i: 交互模式删除文件,删除文件前给出提示。

rm -r:递归处理,将指定目录下的所有文件与子目录一并处理。

 

​​​​​​​101、什么是乐观锁,什么是悲观锁,两者的区别是什么?

悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

 

乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

 

两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

 

​​​​​​​102、日志打印的log4j的配置中%t表示什么?

答案:%t 输出产生该日志事件的线程名。

扩展:%M 是输出方法的名字、%m 是输出代码指定的日志信息。指定的打印信息的具体格式 ConversionPattern,具体参数:

  • %m输出代码中指定的消息
  • %p输出优先级,即 DEBUG,INFO,WARN,ERROR,FATAL
  • %r输出自应用启动到输出该 log 信息耗费的毫秒数
  • %c输出所属的类目,通常就是所在类的全名
  • %t输出产生该日志事件的线程名
  • %n输出一个回车换行符,Windows 平台为"rn”,Unix 平台为"n”
  • %d 输出日志时间点的日期或时间,默认格式为 ISO8601,也可以在其后指定格式,比如:%d{yyyy MM dd HH:mm:ss,SSS}
  • %l输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
  • %x输出和当前线程相关联的 NDC(嵌套诊断环境),尤其用到像 java servlets 这样的多客户多线程的应用中。
  • %%输出一个”%”字符
  • %F输出日志消息产生时所在的文件名称
  • %M输出执行方法
  • %L输出代码中的行号

 

103、Spring中什么时候引起NotWritablePropertyException和Could not open calss path resource[ApplicationContext.xml]

出现NotWritablePropertyException异常的原因一般是在ApplicationContext.xml中 property name的错误等相关问题。

 

​​​​​​​104、关于Web应用程序,下列说法错误的是(B)

A. WEB-INF目录存在于web应用的根目录下

B. WEB-INF目录与classes目录平行

C. web.xml在WEB-INF目录下

D. Web应用程序可以打包为war文件

 

​​​​​​​105、有关Servlet的生命周期说法正确的有(CD)

A. Servlet 的生命周期由 Servlet 实例控制

B. init()方法在创建完 Servlet 实例后对其进行初始化,传递的参数为实现 ServletContext 接口的对象

C. service()方法响应客户端发出的请求

D. destroy()方法释放Servlet实例

 

​​​​​​​106、有关会话跟踪技术描述正确的是(ABC)

A. Cookie是Web服务器发送给客户端的一小段信息,客户端请求时,可以读取该信息发送到服务器端

B. 关闭浏览器意味着会话 ID 丢失,但所有与原会话关联的会话数据仍保留在服务器上,直至会话过期

C. 在禁用 Cookie 时可以使用 URL 重写技术跟踪会话

D. 隐藏表单域将字段添加到 HTML 表单并在客户端浏览器中显示

 

​​​​​​​107、以下web.xml片断(D)正确地声明servlet上下文参数

A.

<init-param>

<param-name>MAX</param-name>

<param-value>100</param-value>

</init-param>

B.

<context-param>

<param name="MAX" value="100" />

<context-param>

C.

<context>

<param name="MAX" value="100" />

<context>

D.

<context-param>

<param-name>MAX</param-name>

<param-value>100</param-value>

<context-param>

 

​​​​​​​108、以下(A)可用于检索session属性userid的值

A. session. getAttribute (“userid”);

B. session. setAttribute (“userid”);

C. request. getParameter (“userid”);

D. request. getAttribute (“userid”);

 

109、下列 JSP 代码,以下(CD)可放置在1处,不会发生编译错误

 

<html>
<body>
<%
for(int i = 0; i < 10; i++) {
//1
}
%>
</body>
</html>

 

A. <%= i %>

B. <b>i</b>

C. %><%= i %><%

D. 不写任何内容

 

110、​​​​​​​考虑下面两个JSP文件代码片断:

test1.jsp:

 

<HTML>
<BODY>
<% pageContext.setAttribute(“ten”,new Integer(10));%>
//1
</BODY>
</HTML>

 

test2.jsp:

 

数字为:<%= pageContext.getAttribute(”ten”)%>

 

以下(C)放置在 test1.jsp 中的//1 处,当请求 test1.jsp 时正确输出 test2.jsp 中的内容。

A. <jsp:include page=”test2.jsp”  />

B. <jsp:forword page=”test2.jsp”  />

C. <%@ include file=”test2.jsp”  %>

D. pageContext对象的scope属性为page,所以test2.jsp不能访问 test1.jsp定义的属性

 

111、​​​​​​​有关JSP隐式对象,以下(ACD)描述正确。

A. 隐式对象是 WEB 容器加载的一组类的实例,可以直接在 JSP 页面使用

B. 不能通过config对象获取 ServletContext 对象

C. response对象通过sendRedirect方法实现重定向

D. 只有在出错处理页面才有 exception 对象

 

解释:jsp 的九大内置对象分别是:config、request、response、out、page、pageContext、session、exception、application。其中exception 是特殊的内置对象,只有当在 jsp 中添加 isErrorPage="true"属性时如下配置时才可以使用。该属性一般出现在设定的错误界面。

 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isErrorPage="true" %>

 

112、​​​​​​​考虑下面 JSP 文件代码片断:

 

<HTML>
<BODY>
<jsp:include page=”test2.jsp”>
    <jsp:param name=”username”  value=”zhangsan”/>
</jsp:include>
</BODY>
</HTML>

 

以下(C)代码片断放置在 test2.jsp 中不会导致错误。

A. <jsp:getParam name=”username”/>

B. <jsp:include param =”username”/>

C. <%=request.getParameter(“username”)%>

D. <%=request.getAttribute(“username”)%>

解释:<jsp:include page=”test2.jsp”>属于动态调用test2.jsp界面,相当于动态去请求test2.jsp 所生成的Servlet,在请求的同时携带了请求参数“username”,我们知道在Servlet中获取请求携带的参数就是通过request.getParameter(key)来获取的,因此C正确。

 

113、​​​​​​​以下是login.jsp文件的代码片断:

 

<%@ page isELIgnored="false"%>
<html>
<body>
<FORM action="login.jsp" method="GET">
    <input type="text" name="name" value="${param['name']}">
    <input type="submit" value="提交">
</FORM>
<P>
    用户名为: ${param.name}
</body>
</html>
全部教程