一、单选题
1、redis中,一个字符串类型的值最大容量是多少();
A、64M
B、128M
C、256M
D、512M
答案:D;
难度:简单;
考察知识点: redis的数据类型String的基础知识。
2、如下代码,执行结果是();
public class Demo {
public static void main(String[] args) {
SingleAlone.getInstance();
System.out.println("count1=" + SingleAlone.count1);
System.out.println("count2=" + SingleAlone.count2);
}
}
class SingleAlone {
private static SingleAlone singleAlone = new SingleAlone();
public static int count1;
public static int count2=0;
private SingleAlone() {
count1++;
count2++;
}
public static SingleAlone getInstance() {
return singleAlone;
}
}
A、count1=1, count2=1
B、count1=1, count2=0
C、count1=0, count2=0
D、count1=1, count2=2
答案:B;
难度:中等。
考察知识点:Java基础,java的加载顺序。
3、如下代码,执行结果是();
String str1 = 'a' + 3+ "Hello";
String str2 = "Hello" + 'a' +3;
A、str1=a3Hello, str2=Helloa3
B、str1=100Hello, str2=Helloa3
C、str1=a3Hello, str2=Hello100
D、str1=100Hello, str2=Hello100
答案:B。
难度:中等。
考察点:Java基础, char 字符型存放字符常量,底层使用 16 位无符号整型表示,所以对于 str1 运算时 ‘a’ + 3 会被转换成 int 运算,然后进行字符串拼接;而 str2 两次都进行字符串拼接操作。
4、下面说法哪些不正确();
A、内部类不能有自己的成员方法和成员变量。
B、内部类可用 abstract 修饰符定义为抽象类,也可以用 private 或 protected 定义。
C、内部类可作为其他类的成员,而且可以访问它所在类的成员。
D、除 static 内部类外,不能直接在内部类中声明 static 成员(static 常量除外)。
答案:A 。
难度:简单。
考察点: Java基础,内部类是指在一个类的内部嵌套定义的类,与普通类一样具有自己的成员方法和成员变量,成员和方法是类存在且有意义的前提。
5、 以下不是合法的标识符( );
A、 STRING
B、 x3x;
C、 void
D、 de$f
答案:C。
难度:简单。
考察点: Java基础,标识符:26个英文字母(大、小写),数字,下划线,美元符号$, 但是不能以数字开头。
6、下列关于构造方法的叙述中,错误的是( );
A. Java语言规定构造方法名与类名必须相同
B. Java语言规定构造方法没有返回值,但不用void声明
C. Java语言规定构造方法只能通过new自动调用
D. Java语言规定构造方法不可以重载
答案:D ;
难度:简单;
考察点:Java基础。
7、构造函数何时被调用();
A、类定义时
B、创建对象时
C、调用对象方法时
D、使用对象的变量时
答案:B ;
难度:简单;
考察点:Java基础。
8、一个线程可以由哪种线程状态直接达到运行状态();
A、阻塞状态(对象lock池中)
B、阻塞状态(对象wait池中)
C、就绪状态
D、死亡状态
答案:C ;
难度:简单;
考察点: Java基础,线程知识。
9、 下面哪个不能直接导致一个线程停止执行?( );
A、调用 yield() 方法
B、在一个对象上调用 wait() 方法
C、在一个对象上调用 notify () 方法
D、在一个对象上调用 Interrupt() 方法
答案:C ;
难度:简单;
考察点: Java基础,线程知识。
10、线程通过( )方法可以休眠一段时间,然后恢复运行();
A. run
B. setPrority
C. yield
D. sleep
答案:D ;
难度:简单;
考察点:Java基础,线程知识。
二、多选题
1、表类型为innoDB的数据库,支持以下哪几种锁();
A、表锁
B、行锁
C、页锁
D、重入锁
答案:AB;
难度:简单;
考察知识点: mysql基础。
2、下列说法错误的有()
A. 在类方法中可用this来调用本类的类方法
B. 在类方法中调用本类的类方法时可直接调用
C. 在类方法中只能调用本类中的类方法
D. 在类方法中绝对不能调用实例方法
答案:ACD;
难度:简单;
考察知识点: java基础。
3、MySQL中InnoDB支持的事务隔离级别有();
A、未提交读
B、已提交读
C、可重复读
D、串行化
答案:ABCD;
难度:中等;
考察知识点:数据库,MySQL中InnoDB支持的事务隔离级别为:
未提交读(read uncommitted):一个事务可以读取到,另外一个事务尚未提交的变更。
已提交读(read committed):一个事务提交后,其变更才会被另一个事务读取到。
可重复读(repeatable read):在一个事务执行的过程中所读取到的数据,和事务启动时所看到的一致。
串行化(serializable):当操作一行数据时,读写分别都会加锁。当出现读写锁互斥时,会排队串行执行。
4、synchronized 的常用方式有哪几种();
A、修饰实例方法
B、修饰静态方法
C、修饰类
D、修饰代码块
答案:ABD;
难度:简单;
考察知识点:Java基础,线程锁的知识。修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁。修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
5、Java 常见的内部类有哪几种();
A、静态内部类
B、成员内部类
C、方法内部类
D、匿名内部类
答案:ABCD;
难度:简单;
考察知识点:java内部类的基础。
6、javax.Servlet的包中,属于类的是();
A.Servlet
B.GenericServlet
C.ServletException
D.ServletContext
答案:BC;
难度:简单;
考察知识点:Java基础,ServletContext 和 ServletRequest 是该包下的接口
7、下面哪三个描述是正确的?()
A. 默认构造器有和它所在类相同的访问修饰词.
B. 默认构造器调用其父类的无参构造器.
C. 如果一个类没有无参构造器,编译器会它创建一个默认构造器.
D. 只有当一个类没有任何构造器时,编译器会为它创建一个默认构造器
答案:ABD;
难度:简单;
考察知识点:java的基础。
8、在Java中,下面关于抽象类的描述正确的是();
A.抽象类可以被实例化
B.如果一个类中有一个方法被声明为抽象的,那么这个类必须是抽象类
C.抽象类的方法都必须是抽象的
D.声明抽象类必须带有关键字abstract
答案:BD;
难度:简单;
考察知识点:java内部类的基础,抽象类不允许直接被实例化。
9、下面关于网络通信正确的描述是();
A、TCP/IP协议是一种不可靠的网络通信协议。
B、UDP协议是一种可靠的网络通信协议。
C、TCP/IP协议是一种可靠的网络通信协议。
D、UDP协议是一种不可靠的网络通信协议。
答案:CD;
难度:简单;
考察知识点:java基础,网络通信协议。
10、下面关于数组的说法,正确的是( )。
A、数组是最简单的复合数据类型,是一系列数据的集合
B、声明数组时,必须分配内存
C、数组的元素可以是值(基本数据类型)、对象或其他数组
D、一个数组中的所有值都必须是相同的类型
答案:ACD ;
难度:简单;
考察知识点:java基础,数组的特性。
三、填空题
1、redis的内存淘汰机制有 。
答案:noeviction、allkeys-lru、volatile-lru、 allkeys-random、volatile-random、volatile-ttl;
难度:中等;
考察知识点:redis的内存淘汰机制。
2、栈的结构特点是 ,队列的结构特点 。
答案:先进先出,先进后出;
难度:简单;
考察知识点:数据结构栈和队列的特性。
3、创建型设计模式有 。
答案:单例、工厂、原型、建造者模式;
难度:简单;
考察知识点:设计模式的类型:创建型、结构型、行为型。
4、并发编程的三个特性是 。
答案:原子性、可见性、有序性。
难度:简单;
考察知识点:java基础,并发知识。
5、类加载过程顺序是 。
答案:加载、连接、初始化。
难度:中等;
考察知识点:jvm虚拟机,类加载器。
四、判断题
1、一张表,表类型是InnoDB,里面ID为自增主键,先插入99条数据后,再删除了第99、98、97条数据,重启Mysql,新插入一条数据,这条数据的ID是97。
答案:对;
难度:简单;
考察知识点:数据库,Mysql有两种引擎类型,MyISAM和InnoDB。MyISAM把自增主键的最大ID保存在文件里,重启后最大值ID不会丢失。InnoDB 把自增主键的最大ID保存在内存中,所以重启会导致最大ID丢失。
2、表数据量大,查询视图时为了加快查询效率,可以给视图创建索引。
答案:错;
难度:简单;
考察知识点:数据库,视图是虚拟的表,不能被索引,也不会有关联的触发器或默认值。
3、主键索引是唯一索引,那主键索引和唯一索引查询效率一样的。
答案:错。
难度:中等。
考察知识点:数据库,在MySQL中,唯一索引查询会回表找到主键索引记录的数据,所以主键的效率高于唯一索引。
4、select count(*) from 的效率小于select count(1) from 的效率。
答案:错。
难度:中等。
考察知识点:数据库,在MySQL中count(*)经过优化之后,与 count(1) 区别不大。
5、String str1=“123”,则System.out.println(“123” == str1.substring(0))输出为true。
答案:对。
难度:中等。
考察知识点:java基础,String 的 substring 方法实现里面有个 index == 0 的判断,当 index 等于 0 就直接返回当前对象,否则新 new 一个 sub 的对象返回。
五、名词解释
1、Java 中的泛型的“类型擦除”是什么?
难度:中等。
考察知识点:java基础。泛型是通过类型擦除来实现的,编译器在编译时擦除了所有泛型类型相关的信息,所以在运行时不存在任何泛型类型相关的信息,譬如 List 在运行时仅用一个 List 来表示。泛型擦除具体来说就是在编译成字节码时首先进行类型检查,接着进行类型擦除(即所有类型参数都用他们的限定类型替换,包括类、变量和方法),接着如果类型擦除和多态性发生冲突时就在子类中生成桥方法解决,接着如果调用泛型方法的返回类型被擦除则在调用该方法时插入强制类型转换。
2、AQS是什么?
难度:中等。
考察知识点:java并发编程。AQS 的全称为(AbstractQueuedSynchronizer),AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore…。
六、解答题
1、假设要开发一个购物车下单的功能,针对不同用户进行不同处理:
1)普通用户需要收取运费,运费是商品价格的 10%,无商品折扣;
2)购买过会员卡A的用户同样需要收取商品价格 10%
的快递费,但购买两件以上相同商品时,第三件享受一定折扣;
3)购买过会员卡B的用户免运费,无商品折扣。
在可见的需求内,可能还会有不同的下单方式,请设计代码实现下单流程。
难度:中等。
考察知识点:设计模式和代码设计。利用工厂模式 + 模板方法模式,消除 if…else 和重复代码并提高代码的扩展性。
2、 给定一棵树,怎么判断是二叉搜索树?
/**
* 节点
*/
public class TreeNode {
public Integer t;
public TreeNode left, right;
public TreeNode(Integer t) {
this.t = t;
left = null;
right = null;
}
}
/**
* 树
*/
public class SimpleTree {
private TreeNode root;
private int size;
public void add(Integer t) {...}
// TODO 是否是二叉搜索树
public boolean isBST() {
}
}
难度:较难。
考察知识点:数据结构和算法,二叉搜索树的特性以及前中后序遍历。参考答案如下:
/**
* 判断是否是BST
* @return
*/
public boolean isBST() {
return isBST(this.root, null);
}
/**
* 中序遍历来判断BST,
* 在遍历时通过保留前一个指针 prev,
* 据此来实现判断BST的解法,初始时 prev = NULL。
* @param root
* @param prev
* @return
*/
private boolean isBST(TreeNode root, TreeNode prev) {
// 遍历到节点为空
if (null == root) {
return true;
}
// 左节点遍历
if (!isBST(root.left, prev)) {
return false;
}
// 右节点大于左节点则不是BST
if (null != prev && root.value < prev.value) {
return false;
}
// 右节点遍历
return isBST(root.right, root);
}