Java面试题

208 阅读11分钟

1.选择题

1.1.下列选项中,用于在定义子类时声明父类名的关键字是(C)

A. interface		B. package			C. extends			D. class

1.2.System.out.println("1" + 2 - 3)的输出结果应该是(D)

A. 0		B. 49			C. 523			D. 无法编译

1.3.下面哪个是对称加密算法(B)

A. BASE64		B. AES			C. RSA			D. MD5

1.4.下面程序的运行结果是(D)

public static void main(String[] args) {

    String s1 = "hello";
    String s2 = "he" + new String("llo");

    System.err.println(s1 == s2);
    System.err.println(s1.equals(s2));

}
A. true true		B. true false		C. false false			D. false true

1.5.以下代码执行后输出结果为(B)

public class ExceptionTest {
    public void method() {
        
        try {
            
            System.out.println("进入到try块");
            
        } catch (Exception e) {
            
            System.out.println("异常发生了!");
            
        } finally {
            
            System.out.println("进入到finally块");
            
        }
        
        System.out.println("后续代码");
        
    }

    public static void main(String[] args) {
        
        ExceptionTest test = new ExceptionTest();
        
        test.method();
        
    }
}
A. 进入到try块  异常发生了!  进入到finally块  后续代码		B. 进入到try块  进入到finally块  后续代码
C. 进入到try块  后续代码			D. 异常发生了!  后续代码

1.6.下列外部类定义中,不正确的是(C)

A. class x {...}								B. class x extends y {...}
C. static class x implements y1,y2 {...}		D. public class x extends Applet {...}

1.7.对于java类型变量char c,short s,float f,double d,表达式c * s + f + d的结果类型为(D)

A. float		B. char			C. short		D. double

1.8.下面关于垃圾收集的描述哪个是错误的(D)

A. 使用垃圾收集的程序不需要明确释放对象		B. 现代垃圾收集能够处理循环引用问题
C. 垃圾收集能提高程序员效率					D. 使用垃圾收集的语言没有内在泄漏问题

1.9.(D)

A. List		B. Set		C. SortedSet		D. Map

1.10.下面关于垃圾收集的说法正确的是(D)

A. 一旦一个对象成为垃圾,就立刻被收集掉			B. 对象空间被收集掉之后,会执行该对象的finalize方法
C. finalize方法和C++的析构函数是完全一回事情		D. 一个对象成为垃圾是因为不再有引用指着它,但是线程并非如此

1.11.代码行float t=5.1;int i=t,不正确的是(B)

A. 代码不能编译			B. 代码编译, i被设置为5
C. 第二行若改为 int i=(byte)t,并结合D选项,则可编译		D. 第一行若改为 float t=5.1f,并结合C选项,则可编译

1.12.关于Java语言中的final关键字的使用,下列说法正确的是(C)

A. 在使用final关键字定义的方法里面使用final关键字定义变量
B. 使用final关键字定义变量,必须在变量定义的同时给定变量的具体数值,完成变量初始化
C. final关键字可以用来修饰方法,表明此方法不可以被子类重写
D. 使用final关键字定义变量,必须同时使用static关键字

1.13.关于访问权限,说法正确的是(A)

A. 类A和类B在同一包中,类B有个protected的方法testB,类A不是类B的子类(或子类的子类),类A可以访问类B的方法testB
B. 类A和类B在同一包中,类B有个protected的方法testB,类A不是类B的子类(或子类的子类),类A不可以访问类B的方法testB
C. 访问权限大小范围:public > 包权限 > protected > private
D. 访问权限大小范围:public > 包权限 > private > protected

1.15.下列说法正确的是(C)

A. volatile,synchronized都可以修改变量,方法以及代码块
B. volatile,synchronized在多线程中都会存在阻塞问题
C. volatile能保证数据的可见性,但不能完全保证数据的原子性,synchronized即保证了数据的可见性也保证了原子性
D. volatile解决的是变量在多个线程之间的可见性、原子性,而sychroized解决的是多个线程之间访问资源的同步性

1.16.下面关于this()和super()说法正确的是(A)

A. super()和this()类似,区别是:super从子类中调用父类的构造方法,this()在同一类内调用其它方法
B. thissuper可以同时出现在一个构造函数里面
C. super()必须放在构造方法内第一行,this()不需要
D. super()不能在static环境中使用,this()可以

1.17.关于以下面代码的说明,正确的是(C)

class StaticStuff{

    static int x = 10;

    static {x += 5;}

    public static void main(String args[]) {
        
        System.out.println("x =" + x);
        
    }

    static {x /= 3;}
    
}
A. 4行与9行不能通过编译,因为缺少方法名和返回类型
B. 9行不能通过编译,因为只能有一个静态初始化器
C. 编译通过,执行结果为: x=5
D. 编译通过,执行结果为: x=3

1.18.关于HashMap类的描述,以下不正确的是(B)

A. HashMap不能保证随着时间的推移Map中的元素次序不变
B. HashMap不允许键或者值是null
C. HashMap不是线程安全的
D. HashMap的数据结构为数组 + 链表

1.19.以下关于集合类ArrayList、LinkedList、HashMap描述错误的是(C)

A. HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值
B. ArrayList和LinkedList均实现了List接口
C. 添加和删除元素时,ArrayList的表现更佳
D. ArrayList的访问速度比LinkedList快

1.20.指出下列程序运行的结果(B)

class Example {

    String str = new String("good");

    char[] ch = {'a', 'b', 'c'};

    public static void main(String args[]) {

        Example ex = new Example();
        ex.change(ex.str, ex.ch);

        System.out.print(ex.str + " and");
        System.out.print(ex.ch);

    }

    public void change(String str, char ch[]) {
        str = "test ok";
        ch[0] = 'g';
    }
}
A. good and abc		B. good and gbc		C. test ok and abc		D. test ok and gbc

1.21.下列关于继承的描述正确的是(C)

A. 在Java中允许定义一个子类的引用,指向父类的对象
B. 在Java中一个子类可以继承多个抽象类,在extends关键字后依次列出,用逗号隔开
C. 在Java中继承是通过extends关键字来描述的,而且只允许继承自一个直接父类
D. 在Java中抽象类之间不允许出现继承关系,所有的抽象类都相互独立

1.22.以下关于Object类的说法正确的是(A)

A. Java中所有的类都直接或间接继承自Object,无论是否明确的指明,无论其是否是抽象类
B. Java中的接口(interface)也继承了Object类
C. 利用"=="比较两个对象时,Java调用继承自Object的equals方法,判断是否相等
D. 如果类的定义中没有重新定义toString()方法,则该类创建的对象无法使用toStrig()方法

1.23.在某个类A中存在一个方法: void set(int x),以下不能作为这个方法的重载的声明的是(A)

A. void set(int y)				B. int set(int x, double y)
C. double set(int x,int y)		D. void set(int x,int y)

1.24.下述代码返回结果为(C)

public static void main(String[] args) {

    Integer a = new Integer(3);
    Integer b = 3;
    int c = 3;
    Integer d = 500;
    Integer e = 500;

    System.out.println(a == b);
    System.out.println(b == c);
    System.out.println(d == e);

}
A. truetruetrue				B. falsetruetrue
C. falsetruefalse			D. truefalsefalse

1.25.计算机操作系统出现死锁的原因是什么(D)

A. 资源数大大少于进程数,或进程同时申请的资源数大大超过资源总数
B. 有多个封锁的进程同时存在
C. 一个进程进入死循环
D. 若干进程因竞争资源而无休止的等待着其他进程释放已占有的资源

1.26.现有两个表department、employee,department表中有12条数据,employee中有200条数据,执行以下SQL:

department: departmentId, departmentName
employee: employeeId,departmentId,employeeName

select count(*), 'departmentName','employeeName' 
from employee e inner join department d on e.'departmentId' = d.'departmentId'

查询结果中有多少条记录?(A)

A. 1		B. 12		C. 200		D. 无法确定

1.27.having子句的作用是(B)

A. 查询结果的分组条件		B. 组的筛选条件
C. 限定返回的行的判断条件	D. 对结果集进行排序

1.28.关于MySQL索引的说法,不对的是(C)

A. 500万数据的用户表user在性别字段sex上建立了索引,语句 "select * from user where sex=1"并不会提速多少
B. 一般情况下不鼓励使用like操作,类似的'like "abc%"'可以使用到索引
C. 唯一索引允许空值,而主键索引不允许为空值,除此之外它们是相同的
D. 对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度

1.29.有关数据冗余说法错误的是(C)

A. 数据库中,数据存在副本的现象,就是数据冗余
B. 通过分类存储,可以有效减少数据冗余,但是会增加数据查找的复杂性
C. 在数据库设计阶段,一定要尽最大可能避免数据冗余,最好做到无数据冗余
D. 数据冗余通常是由于数据库设计引起的

1.30.关于抽象类和接口叙述正确的是(D)

A. 抽象类和接口都能实例化
B. 抽象类不能实现接口
C. 抽象类方法的访问权限默认都是public
D. 接口方法的访问权限默认都是public

2.多项选择题

2.1.下列关于if-else if选择结构的说法正确的是(B,D)

A. 多个else if块之间的顺序可以改变,改变之后对程序的执行结果没有影响
B. 多个else if块之间的顺序可以改变,改变之后可能对程序的执行结果有影响
C. 多个else if块之间的顺序不可以改变,改变后程序编译不通过
D. 多个else if块之间的顺序可以改变,改变后程序编译可以通过

2.2.关于子查询,以下说法正确的是(A,C)

A. 一般来说,表连接都可以用子查询替换					B. 一般来说,子查询都可以用表连接替换
C. 相对于表连接,子查询适合于作为查询的筛选条件		D. 相对于表连接,子查询适合于查看多表的数据

2.3.关于线程的叙述(B,C,D)是对的

A. 一旦一个线程被创建,它就立即开始运行
B. 使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行
C. 如果复用一个线程,可以通过再次调用start方法,使已经结束的线程复活
D. join方法,可使当前线程阻塞,直到thread线程运行结束

2.4.有关单例模式的说法中正确的是(A,B,C)

A. 用户无法通过new方式实例化单例类	B. 单例模式属于创建型模式
C. 单例模式用于多线程应用程序			D. 违背了单一职责原则

2.5.在(A,D)的列上更适合创建索引

A. 需要对数据进行排序	B. 具有默认值
C. 频繁更改				D. 频繁搜索

3.填空题

3.1.SQL中,连接表的三种方式left、join、right。

3.2.Spring注入参数方式分为基于注解、构造器、Setter。

3.3.SQL中,创建索引的语句是create [索引类型] index 索引名称 on 表名(列名) with fillfactor = (填充因子值0~100) go;虽然索引可以加快查询速度,但如果是联合索引,需注意满足最左前缀原则,否则无法覆盖索引使其生效

3.4.List接口下面的三个实现类ArrayList、LinkedList、Vector

3.5.Mybatis SQL映射文件中获取参数的方式有#{}、${}。

3.6.Spring MVC中从url中获取参数的注解为@PathVariable,从url后获取查询参数的注解为@RequestParam。

3.7.子类对父类继承来的属性重新定义称为重写,子类对自身拥有的同名方法的重新定义称为重载。

3.8.创建线程有三种,其中Runnable、Callable这两个接口,其中Callable接口可以帮助我们获取到线程执行完后的返回结果

3.9.队列和堆栈有些相似,不同之处在于在队列里第一个插入的元素也是第一个被删除的元素(即是先进先出)。

3.10.java.util包中提供了一个专门用来操作集合的工具类,例如排序、二分查找、创建空列表等,这个类是Collections,还提供了一个专门操作数组的工具类,例如排序、转换为字符串、转换为列表等,这个类是Arrays。