一周面试错题整理(二)

本文整理了一周内的面试错题,涵盖了Java多线程安全的并发容器、MySQL数据库索引原理、JDBC的Statement使用、分布式游戏服务器的通信方式、Java内存模型、JVM内存区域等多个知识点。例如,讨论了ConcurrentHashMap、Hashtable与线程安全,以及JDBC的PreparedStatement与Statement的区别。此外,还涉及了JMS消息队列在分布式系统中的作用,以及Java的反射、线程状态转换、Socket编程、ArrayList与LinkedList的区别等内容,旨在帮助读者巩固Java核心技术。
摘要由CSDN通过智能技术生成

1、下面哪些具体实现类可以用于存储键,值对,并且方法调用提供了基本的多线程安全支持:(AE)

A、java.util.cocurrent.ConcurrentHashMap

B、java.util.Map

C、java.util.TreeMap

D、java.util.SortMap

E、java.util.Hashtable

F、java.util.HashMap

分析:

  • Hashtable是线程安全的哈希表,它是通过synchronized来保证线程安全的;即,多线程通过同一个“对象的同步锁”来实现并发控制。Hashtable在线程竞争激烈时,效率比较低(此时建议使用ConcurrentHashMap)。当一个线程访问Hashtable的同步方法时,其它线程如果也在访问Hashtable的同步方法时,可能会进入阻塞状态。
  • Collections.synchronizedMap()使用了synchronized同步关键字来保证对Map的操作是线程安全的。
  • ConcurrentHashMap是线程安全的哈希表。在JDK1.7中它是通过“锁分段”来保证线程安全的,本质上也是一个“可重入的互斥锁”(ReentrantLock)。多线程对同一个片段的访问,是互斥的;但是,对于不同片段的访问,却是可以同步进行的。在JDK1.8中是通过使用CAS原子更新、volatile关键字、synchronized可重入锁实现的。

2、mysql数据库,game_order表表结构如下,下面哪些sql能使用到索引(BCDE)

A、select * from game_order where plat_game_id=5 and plat_id=134

B、select * from game_order where plat_id=134 and plat_game_id=5 and plat_order_id=’100’

C、select * from game_order where plat_order_id=’100’

D、select * from game_order where plat_game_id=5 and plat_order_id=’100’ and plat_id=134

E、select * from game_order where plat_game_id=5 and plat_order_id=’100’

分析:

  • 这道题目想考察的知识点是MySQL组合索引(复合索引)的最左优先原则。最左优先就是说组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到。只要组合索引最左边第一个字段出现在Where中,那么不管后面的字段出现与否或者出现顺序如何,MySQL引擎都会自动调用索引来优化查询效率。
  • 根据最左匹配原则可以知道B-Tree建立索引的过程,比如假设有一个3列索引(col1,col2,col3),那么MySQL只会会建立三个索引(col1),(col1,col2),(col1,col2,col3)。
  • 所以题目会创建三个索引(plat_order_id)、(plat_order_id与plat_game_id的组合索引)、(plat_order_id、plat_game_id与plat_id的组合索引)。根据最左匹配原则,where语句必须要有plat_order_id才能调用索引(如果没有plat_order_id字段那么一个索引也调用不到),如果同时出现plat_order_id与plat_game_id则会调用两者的组合索引,如果同时出现三者则调用三者的组合索引。
  • 题目问有哪些sql能使用到索引,Where后出现了plat_order_id字段的SQL语句都会调用到索引,只不过是所调用的索引不同而已,所以选BCDE。如果题目说清楚是调用到三个字段的复合索引,那答案才是BD。

3、下面有关jdbc statement的说法错误的是?(C)

A、JDBC提供了Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程

B、对于PreparedStatement来说,数据库可以使用已经编译过及定义好的执行计划,由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象”

C、PreparedStatement中,“?” 叫做占位符,一个占位符可以有一个或者多个值

D、PreparedStatement可以阻止常见的SQL注入式攻击

分析:

一个占位符有一个值

Statement、PreparedStatement和CallableStatement的区别

  • Statement、PreparedStatement和CallableStatement都是接口(interface)。 
  • Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。 
  • Statement接口提供了执行语句和获取结果的基本方法; 
  • Statement: 普通的不带参的查询SQL;支持批量更新,批量删除; 
  • PreparedStatement: 可变参数的SQL,编译一次,执行多次,效率高; 安全性好,有效防止Sql注入等问题; 支持批量更新,批量删除; 
  • CallableStatement: 继承自PreparedStatement,支持带参数的SQL操作; 支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持; 
  • Statement每次执行sql语句,数据库都要执行sql语句的编译 ,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。

PreparedStatement是预编译的,使用PreparedStatement有几个好处 :

  • 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。 
  • 安全性好,有效防止Sql注入等问题。 
  • 对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;
  • 代码的可读性和可维护性。

4、下列说法正确的是(C)

A、WebLogic中开发消息Bean的non-persistent 方式可以保证消息的可靠

B、EJB容器发生错误,non-persistent方式下JMS容器仍然会将消息发送

C、EJB容器发生错误,persistent方式下JMS容器仍然会将消息发送

D、EJB容器发生错误,两种方式下JMS容器仍会在MDB可用的时候将消息发送

分析:

weblogic中开发消息Bean时的persistent与non-persisten的差别:

  • persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来。
  • non-persistent方式的消息将被丢弃

J2EE中容器充当中间件的角色,主要的容器包括:

  • WEB容器:给处于其中的应用程序组件(jsp,servlet)提供一个环境,使jsp,servlet直接与容器中的环境变量接***互,不必关注其它系统问题。主要由WEB服务器来实现。 例如:tomcat,weblogic,websphere等
  • EJB容器:Enterprise java bean容器。供给运行在其中的组件EJB各种管理功能,满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理,并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
  • WEB容器更多的是跟基于HTTP的请求打交道。而EJB容器更多的和数据库、其它服务打交道。但他们都是把与外界的交互实现从而减轻应用程序的负担。例如SERVLET不用关心HTTP的细节,直接引用环境变量session,request,response就行、EJB不用关心数据库连接速度、各种事务控制,直接由容器来完成。

5、在一个基于分布式的游戏服务器系统中,不同的服务器之间,哪种通信方式是不可行的(A)?

A、管道

B、消息队列

C、高速缓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值