admin管理员组

文章数量:1579086

王道训练营 Java 部分测试
第一部分 选择题 (20*2 共 40 分)

  1. 下列说法正确的是()
    A.Java 程序经编译后会产生 machine code
    B.Java 程序经编译后会产生 byte code
    C.Java 程序经编译后会产生 DLL
    D.以上都不正确
  2. 设 x = 1 , y = 2 , z = 3,则表达式 y+=z--/++x 的值是( )。
    A. 3 B. 3. 5
    C. 4 D. 5
  3. 0.6332 的数据类型是()

A float B double C Float D Double
4. 下列说法正确的有()
A.class 中的 constructor 不可省略
B.constructor 必须与 class 同名,但方法不能与 class 同名
C.constructor 在一个对象被 new 时执行
D.一个 class 只能定义一个 constructor
5. 以下关于继承的叙述正确的是()
A.在 Java 中类只允许单一继承
B.在 Java 中一个类只能实现一个接口
C.在 Java 中一个类不能同时继承一个类和实现一个接口
D.在 Java 中接口只允许单一继承
6. 构造方法名必须与( )相同,它没有返回值,用户不能直接调用它,只能
通过 new 调用。
A.类名 B.对象名 C.包名 D.变量名
7. 下列说法中,( )是正确的。
A.子类拥有的成员数目大于父类拥有的成员数目
B.父类代表的对象范围比子类广
C.子类要调用父类的方法,必须使用 super 关键字
D.一个 Java 类可以有多个父类
8. 下列哪种异常是检查型异常,需要在编写程序时声明 ()

A NullPointerException B ClassCastException
C FileNotFoundException D IndexOutOfBoundsException

  1. 下面哪个流类属于面向字符的输入流( )

A BufferedWriter B FileInputStream
C ObjectInputStream D InputStreamReader
10.阅读如下代码:
1)class Super{
2) public float getNum(){return 3.0f;}
3) }
4)
5) public class Sub extends Super{
6)
7) }
which method, placed at line 6, will cause a compiler error?()
A. public float getNum(){return 4.0f;}
B. public void getNum(){}
C. public void getNum(double d){}
D. public double getNum(float d){return 4.0d;}
11. 阅读代码
public class Equals{
public static void add3(Integer i){
int val = i.intValue();
val += 3;
i = new Integer(val);
}
public static void main(String args[]){
Integer i=new Integer(0);
add3(i);
System.out.println(i.intValue());
} }
what is the result?()
A. compile fail B.print out “0”
C.print out “3” Dpile succeded but exception at line 3
12.下面的集合中,()不可以存储重复元素。
A.Set
B.Collection
C.Vector
D.List
13. 下面代码的运行结果为:()
import java.io.;
import java.util.
;
public class foo{

public static void main (String[] args){
String s;
System.out.println(“s=” + s);
}
}

A 输出“s=”
B “s=null”
C 编译失败
D NullPointException 异常
14.以下对接口描述错误的有()
A) 接口没有提供构造方法
B) 接口中的方法默认使用 public、abstract 修饰
C) 接口中的属性默认使用 public、static、final 修饰
D) 接口不允许多继承
15.下面有关 JVM 内存,说法错误( )
A. 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码
执行到了第几行,是线程隔离的
B. Java 方法执行内存模型(stack),用于存储局部变量,操作数栈,动态
链接,方法出口等信息,是线程隔离的
C. 方法区用于存储 JVM 加载的类信息、常量、静态变量、即使编译器编译后
的代码等数据,是线程隔离的
D. 原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的
16.关于守护线程的说法,正确的是:()
A. 所有非守护线程终止,即使存在守护线程,进程运行终止
B. 所有守护线程终止,即使存在非守护线程,进程运行终止
C. 只要有守护线程或者非守护进程其中之一存在,进程就不会终止
D. 只要所有的守护线程和非守护线程终止运行之后,进程才会终止
17.下列方法被调用后,一定使调用线程改变当前状态的是()
A.notify() B.run() C.sleep() D.isAlive()
18.有如下程序
1)public class X{
2) public Object m(){
3) Object o=new Float(3.14F);
4) Object[] oa=new Object[1];
5) oa[0]=o;
6) o=null;
7) oa[0]=null;
8) System.out.println(oa[0]);
9) }
10) }
对象 o 最早可以被垃圾回收器回收的位置是:()
A. After line 4
B. After line 6
C. After line 7
D. After line 9(that is,as the method returns)
19.JAVA 语言对象状态的持久化是通过( )实现的。
A. 文件 B.管道 C.序列化 D.过滤器
20.在 TCP/IP 中,解决计算机到计算机之间通信问题的层次是()。
A. 网络接口层 B.网际层 C.传输层 D. 应用层
二 程序填空(10*2 共 20 分)
(注:答案包括编译失败 或运行异常。请说明结果的同时注明原因)

  1. 如下程序打印的结果是什么呢?
    public class InTheLoop {
    public static final int END = Integer.MAX_VALUE;
    public static final int START = END - 100;
    public static void main(String[] args) {
    int count = 0;
    for (int i = START; i <= END; i++)
    count++;
    System.out.println(count);
    }}
  2. 如下程序打印的结果是?
    public class IfElse{
    public static void main(String args[]){
    if(odd(5))
    System.out.println(“odd”);
    else
    System.out.println(“even”);
    }
    public static int odd(int x){return x%2;}
    }
    what is output?
  3. 下面程序的运行结果是:
    public class AnimalFarm{
    public static void main(String[] args){
    final String pig = “length: 10”;
    final String dog = "length: " + pig.length();
    System.out. println("Animals are equal: " + pig == dog);
    }
    }
  4. 下面程序的运行结果是:
    String str1 = “hello”;
    String str2 = “he” + new String(“llo”);
    System.err.println(str1 == str2);
  5. 如下程序打印的结果是:
    class Dog {
    public static void bark()
    {
    System.out.print("woof ");
    }
    }
    class Basenji extends Dog
    {

public static void bark()
{} }
public class Bark {
public static void main(String args[]) {
Dog woofer = new Dog();
Dog nipper = new Basenji();
woofer.bark();
nipper.bark();
}
}
6. 下面这的小程序输出结果为:
public class Indecisive {
public static void main(String[] args) {
System.out.println(decision());
}
static boolean decision() {
try {
return true;
} finally {
return false;
}
}
}
7. 下列代码的执行结果是()。
public class Test{
public static void main(String[]args){
int[]x={0,1,2,3};
for{int i=0;i<3;i+=2){
try{
systcm.out.println(x[i+2]/x[i]+x[i+1]);
}catch(ArithmeticException e){
System.out.println(“errorl”):
}catch(Exception e){
System.out.println(“error2”): }}
} }
8. 如下代码执行后打印的结果是:
public class TestMain {
static {
System.out.println(“C”);
}
{
System.out.println(“B”);
}
public TestMain(){
System.out.println(“A”);
}
public static void main(String[] args) {
TestMain testMain = new TestMain();
} }
9. 如下代码执行的结果是:
public class Bground extends Thread{
public static void main(String[] args){
Bground bground=new Bground();
bground.run();
}
public void start(){
for (int i = 0; i < 10; i++) {
System.out.println(“Bground.start()”+i);
} } }
10. 如下代码执行的结果是:
public class Reluctant {
private Reluctant internalInstance = new Reluctant();
public Reluctant() throws Exception {
throw new Exception(“I’m not coming out”);
}
public static void main(String[] args) {
try {
Reluctant b = new Reluctant();
System.out.println(“Surprise!”);
} catch (Exception ex)
{
System.out.println(“I told you so”);
}
}
}第三部分 问答题(10*2 共 20 分)

  1. 引用类型和原始类型有何区别?
  2. Java 语言多线程设计中,为什么 wait, notify 和 notifyAll 这些线程
    同步的方法不在 thread 类里面?
  3. 方法重载 和方法重写 的区别。
  4. HashSet 的特点是无法插入重复的元素。那么它是怎么判断两个元素是否
    相同的?
  5. 同步和异步有何异同,在什么情况下分别使用他们?
  6. "=="和 equals 方法有何异同?
  7. 写 clone()方法时,该方法题通常都有一行代码,是什么?为什么?
  8. java 中实现多态的机制是什么?
  9. Java 多线程中调用 wait() 和 sleep()方法有什么不同?
    10.集合里的迭代器是什么?这样设计有何好处?
    第四部分编程题(10*2 共 20 分) 1.设计一个字符串哈希算法。(不能直接调用系统 API) 2. 输入一个整型数组,数组里面有正数也有负数,数组中连续的一个或多个整
    数组成子数组,每个子数组都有一个和。求所有子数组的和的最大值。例如,输
    入的数字为:1,-2,3,10,-4,7,2,-5,则和最大的子数组为 3,10,-4,7,2 和 为 18。 (时间复杂度越低越好)

答案解析:
第一题:
BABCA ABCDB BDCDC ACCCB
第二题:
1.程序无限循环,先打印出从Integer.MAX_VALUE-100到Integer.MAX_VALUE
的这100个数,然后,从Integer.MIN_VALUE开始接着打印,直到Integer.MAX_VALUE,并重复
2.打印结果为0,父类方法被子类覆盖,即使在父类中调用,调用到的也是子类方法,而此时父类对象还在初始化过程中,子类对象更是还未开始初始化,其成员变量的值还是默认值。
3.false 先拼接"Animals are equal: " + pig得到新的字符串,然后在比较==
4.false
5.woof woof 静态方法不能被覆盖
6.false
7.error1 error2
8.C B A 静态代码块先于构造代码块,构造代码块先于构造方法
9.正常结束没有任何输出 Thread 的run方法源代码
10. Stackoverflow error 在创建对象,给成员变量赋值时,无限递归,且没有递归出口
第三题:简答题(列出的只是关键点,表达的意思到位即可)
1.基本数据类型包括:byte,short,char, int,long,float,double,boolean
引用数据类型主要包括:类,接口等
基本数据类型的变量存储的是该类型变量的值,而引用数据类型的变量存储的是
地址(比如堆中对象的地址)。

2.线程通信,其实是依靠锁对象,来完成的(对于wait方法而言,调用wait方法的对象,首相必须被当前线程,作为锁对象持有),而java语言中的锁对象,可以是任意对象,因此这些方法被定义在Object中

3.方法重载是指在同一个类中定义同名方法,而这些方法名称相同,但方法签名不同。
方法重写,是指在子类中,修改父类中定义的方法的实现。因此,他们发生的范围是不同的,方法重载发生在一个任意类中,而方法重写,发生在子类中,而且发生方法重写和方法覆盖的条件也不相同(这里不再赘述),同时,方法重载是编译时多态,而方法重写是运行时多态的前提条件之一

4.字节流和字符流最主要的区别是,流中数据的逻辑单位不同,字节流中数据的逻辑单位是二进制的字节数据,而字符流中,数据的逻辑单位是单个字符。

a)字符数据在内存中还是以二进制(字符的在编码表中对应的编码值)的形式保存和传输
b)而对于二进制的字节数据的写和读,字节流就已经能够很好的完成了
c) 但为了保证字符流中的数据是一个一个的完整字符,所以字符流在字节流的基础上,添加了编解码器,即在使用底层字节流写数据前,先利用编码器,对字符数据进行编码得到字符数据对应的二进制编码序列,然后利用底层字节流传输它们,同时,在读取数据的时候,先用解码器,将由底层字节流传输的字节数据,解码成一个一个的字符。

所以字符流的功能实现是字节流 + 编码表(基于编码表的编解码操作)
5.异步简单来说就是,线程之间,各自独立运行,互不影响,就好像线程之间“同时”,在各自做自己的事情,简单来说,就是我走你也走
同步和异步相对,同步是指线程之间不能在各自为政,自己运行自己的,而是在某些情况下等待其他线程。简单来说,就是我走你不走

线程天生就是异步执行的,而当多线程异步访问同一个共享数据的时候,为了保证共享数据访问的正确性,必须保证同时只有一个线程,能访问并修改共享变量的值,这意味着,如果一个线程正在,访问某共享变量,则其他所有要访问该共享变量的线程都需要等待,直到,该线程访问完毕。

6.== 对于基本数据类型的数据而言,比较的是内容,对于引用数据类型的数据而言,比较的引用变量,所指向的内存地址。
equals方法是Object类的方法,其默认实现是比较两个对象的内存地址是否相同,若想:要比较量对象的内容是否相同,则需要在子类中覆盖Object的equals方法

7.super.clone(),因为该方法其实是在调用Object的clone方法,首先实现对该对象自身的浅克隆,然后在针对,该对象的引用变量做进一步的处理

8.java中实现运行时多态,有3个前提条件: 继承,方法覆盖,父类引用指向子类实例

9.sleep方法的唤醒条件是时间,而wait()方法的唤醒条件是,必须被在同一个锁对象上调用notify()或notifyAll()方法。
sleep方法是Thread类的静态方法,而wait()方法是Object类的方法
sleep方法在导致当前线程休眠时,当前线程不会释放所有有的锁,而wait()方法导致当前线程休眠时,当前线程会释放锁对象

10.缓冲流可以从一定程度上改善Java程序的IO效率。因为,IO的底层实现,是要依靠操作系统内核的功能来实现的,而我们的java程序每次请求操作系统内核的功能完成IO的时候,都需要付出额外的代价。既然,每次完成IO操作,都需要付出一次通信代价,那么意味着,一次IO操作如果读写的数据越多,那么平均到每个字节(字符)的数据,所付出的额外代价就会越小。
而缓冲流,本身维护了一个较大的缓冲区,能够在和操作系统内核交互的过程中,一次读写较多的字节(字符)数据,从而在整个数据传输过程中,减少java程序和操作系统内核通信的次数。从而减少了,应用程序为了完成功能,所需要付出的额外代价
第四题编程题
1)第一题,只要给一个字符串,根据该字符串的内容,自己给个映射规则,实现将该字符串转化成一个对应整数即可
比如简单的:把字符串对应的字节数值累加,得到一个整数(这就是一种简单的字符串到整数的hash映射),当然这种映射可以有很多很多,这里不再一一赘述
2)该题目,其实有对应的o(n)时间复杂度的实现,即一次遍历,得到结果


本文标签: 王道训练营测试Java