第一部分 Java基础
第二部分 Java进阶

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>