云计算百科
云计算领域专业知识百科平台

java进阶--刷题与详解-2

下面关于 Java 中 List 集合的说法正确的是()

A LinkedLIst内部采用单向链表实现,所以只能从前向后遍历,不能反向遍历

B LinkedList随机查询快,随机插入慢

C ArrayList随机查询快,随机插入慢

D ArrayList和LinkedList是线程安全的类

正确答案:C

解析:LinkedList 采用双向链表实现,可以反向遍历,A错误。 链表随机查询慢,插入快,B错误。  ArrayList 和LinkedList 都是非线程安全的类,D错误。

子类要调用继承自父类的方法,必须使用super关键字()

A 正确   B错误

正确答案:B

解析:子类调用父类的方法时,并不是必须使用super关键字。因为子类会自动继承父类的所有非私有方法,可以直接使用父类方法名调用。
只有在以下特殊情况下才需要使用super关键字:
1. 子类重写了父类方法,但在重写方法中需要调用父类的原始实现时
2. 在子类构造方法中调用父类的构造方法时
3. 当子类和父类存在同名的成员时,想要明确调用父类成员时

关于LinkedBlockingDeque和LinkedBlockingQueue的说法错误的是哪个选项?

A  LinkedBlockingDeque和LinkedBlockingQueue都是BlockingQueue的子类

B  LinkedBlockingDeque和LinkedBlockingQueue都是通过ReentrantLock实现锁,线程安全的集合

C  LinkedBlockingDeque是基于链表的、线程安全的双端阻塞队列;LinkedBlockingQueue是基于链表的先进先出的阻塞队列

D  LinkedBlockingDeque和LinkedBlockingQueue都是无界的阻塞队列

正确答案:D

解析:

LinkedBlockingQueue(单向阻塞队列)

特点:

  • 单向队列:只能在队尾插入,队头取出(FIFO)

  • 两个锁分离:使用两个ReentrantLock(putLock 和 takeLock),分别控制入队和出队

  • 容量可选:可指定容量,默认为 Integer.MAX_VALUE(实际无界)

  • 阻塞操作:

    • put():队列满时阻塞

    • take():队列空时阻塞

LinkedBlockingDeque(双向阻塞队列)

特点:

  • 双向队列:可在队头/队尾进行插入和删除

  • 单个锁:使用一个ReentrantLock控制所有操作

  • 容量可选:同样可指定容量

  • 更丰富的API:支持栈和队列两种操作模式

Java 中,下面哪些异常类属于运行期异常()

A  NullPointerException

B  IOException

C  ArithmeticException

D  NoSuchMethodException

正确答案:AC

解析:NullPointerException空指针异常      IOException输入输出异常      ArithmeticException算数异常      NoSuchMethodException没有这个方法异常

NullPointerException和ArithmeticException是运行时异常

NoSuchMethodException和IOException是检查型异常

对于一个已经不被任何变量引用的对象,当垃圾回收器准备回收该对象所占用的内存时,将自动调用该对象的哪个方法()

A finalize  B notify  C notifyAll  D hashCode

正确答案:A

解析:finalize是一个特殊方法,会在垃圾回收器准备回收对象所占用的内存之前被自动调用,当一个对象变得不可达时,垃圾回收器会在回收该对象之前调用其方法,给对象发最后一次机会处理必要的清理工作

notify()是Object类的方法,用于唤醒在该对象上等待的单个线程,与垃圾回收无关。

 notifyAll()也是Object类的方法,用于唤醒在该对象上等待的所有线程,同样与垃圾回收无关。

hashCode()是Object类的方法,用于返回对象的哈希码值,主要用于确定该对象在哈希表中的索引位置,与垃圾回收无关。

在 JAVA 编程中, Java 编译器会将 Java 程序转换为( )

A 字节码   B 执行代码   C 机器代码   D 以上都不对

正确答案:A

解析:Java编译器会将Java源代码(.java文件)转换为字节码(.class文件),只有当JVM执行字节码时,才会将字节码转换为相应平台的机器码。

如下代码的输出是

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

package Test;

public class Test {

    private static void test(int[] arr) {

        for (int i = 0; i < arr.length; i++) {

            try {

                if (arr[i] % 2 == 0) {

                    throw new NullPointerException();

                } else {

                    System.out.print(i);

                }

            } finally {

                System.out.print("e");

            }

        }

    }

    public static void main(String[]args) {

        try {

            test(new int[] {0, 1, 2, 3, 4, 5});

        } catch (Exception e) {

            System.out.print("E");

        }

    }

}

可以得到的结论是( )

A 编译出错  B eE  C Ee  D eE1eE3eE5  E Ee1Ee3Ee5

正确答案:B

解析:finally一定会执行,在catch()块中有着throw exception这样的语句才会向上抛出问题,中止程序往下执行

关于Java里的虚方法、抽象方法描述不正确的是?

A 虚方法可以被子类继承并重写方法  B 抽象方法不可以带实现  C 抽象方法非抽象子类必须实现  D 抽象方法可以被子类实现成虚方法

正确答案:D

解析:

  • Java中虚方法的特性:

    • Java默认所有非final、非static的非静态方法均为虚方法(即支持动态绑定),子类可通过@Override重写。
    • 虚方法在父类中可以有实现,子类可覆盖或扩展。
  • Java中抽象方法的特性:

    • 抽象方法无方法体,必须由子类实现(若子类非抽象类)。
    • 抽象方法只能存在于抽象类中,且子类必须实现所有抽象方法。
  • 要使对象具有序列化能力,则其类应该实现如下哪个接口()。

    A java.io.Serializable  B java.lang.Cloneable  C java.lang.CharSequence  D java.lang.Comparable

    正确答案:A

    解析:在Java中要实现对象的序列化功能,类必须实现java.io.Serializable接口。Serializable是一个标记接口(marker interface),它没有任何方法需要实现,仅仅是标识这个类可以被序列化。当一个类实现了Serializable接口后,该类的对象就能够被转换为字节流,用于网络传输或持久化存储。
    分析其他选项:
    B选项 Cloneable:这是用于对象克隆的标记接口,与序列化无关。实现此接口的类可以使用Object.clone()方法创建对象副本。
    C选项 CharSequence:这是一个字符序列的接口,主要用于字符串相关操作,如String、StringBuilder等类都实现了这个接口,与对象序列化无关。
    D选项 Comparable:这个接口用于实现对象的比较功能,通过实现compareTo方法来定义对象之间的自然顺序,与序列化功能无关。

    1、序列化是干什么的? 为了保存在内存中的各种对象的状态,并且把Java给你提供一种保存的对象状态再读出来就是序列化。 2、什么情况下需要序列化 a)把内存中的对象保存到一个文件中或者数据库中时候; b)用套接字在网络上传送对象的时候; c)通过RMI传输对象的时候

    以下Java程序运行的结果是:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    public class Tester{

    public static void main(String[] args){

       Integer var1=new Integer(1);

       Integer var2=var1;

       doSomething(var2);

       System.out.print(var1.intValue());

       System.out.print(var1==var2);

    }

    public static void doSomething(Integer integer){

        integer=new Integer(2);

        }

    }

    A 1true  B 2true  C 1false  D 2false

    正确答案:A

    解析:

    public class Tester {
    public static void main(String[] args) {
    // 创建一个新的Integer对象,值为1,var1引用指向这个对象
    Integer var1 = new Integer(1);
    // var2引用指向同一个对象(var1和var2都指向堆中同一个Integer实例)
    Integer var2 = var1;

    // 调用doSomething方法,传入var2的引用副本
    doSomething(var2);

    // 输出var1指向的Integer对象的值(仍然是1)
    System.out.print(var1.intValue());
    // 比较var1和var2是否指向同一个对象(输出true)
    System.out.print(var1 == var2);
    }

    // doSomething方法:接收一个Integer对象的引用作为参数
    public static void doSomething(Integer integer) {
    // 这里创建了一个新的Integer对象(值为2)
    // 并将局部参数变量integer指向这个新对象
    // 注意:这不会影响main方法中的var2引用
    integer = new Integer(2);
    }
    }

    dosomething

    • 实际作用:尝试修改传入的 Integer 参数,但由于 Java 是值传递(传递的是引用的副本),这里的修改不会影响调用方的原始变量

    • 关键点:该方法创建了一个新的 Integer 对象,但只修改了方法内部的局部引用变量,对外部变量没有影响

    下列代码输出结果为()

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    class Animal{

        public void move(){

            System.out.println("动物可以移动");

        }

    }

    class Dog extends Animal{

        public void move(){

            System.out.println("狗可以跑和走");

        }

        public void bark(){

            System.out.println("狗可以吠叫");

        }

    }

    public class TestDog{

        public static void main(String args[]){

            Animal a = new Animal();

            Animal b = new Dog(); 

            a.move();

            b.move();

            b.bark();

        }

    }

    A 动物可以移动
    狗可以跑和走
    狗可以吠叫

    B 动物可以移动
    动物可以移动
    狗可以吠叫

    C 运行错误

    D 编译错误

    正确答案:D

    解析:

  • Animal a = new Animal();

    • 创建对象:一个真正的 Animal 类实例。

    • 调用 a.move():执行 Animal 类自身的 move 方法。

    •  输出:动物可以移动

  • Animal b = new Dog();

    • 创建对象:一个 Dog 类实例,但将其向上转型为 Animal 类型的引用 b 来指向它。

    • 内存中的实际情况:对象本质是 Dog,拥有 Dog 的所有方法(move, bark)。但编译器看待它的“视角”是 Animal。

    • 调用 b.move():

      • 编译阶段:编译器检查 b 的类型 (Animal),确认 Animal 有 move 方法,允许通过。

      • 运行阶段:JVM 发现 b 实际指向的是 Dog 对象,于是调用 Dog 类中重写的 move 方法。这是多态的体现。

      •  输出:狗可以跑和走

  • 尝试调用 b.bark():

    • 编译阶段:编译器检查 b 的类型 (Animal),发现 Animal 类中没有定义 bark 方法。

    • 结果:编译器立即报错,程序无法进入运行阶段。错误信息通常类似于:找不到符号 或 Animal 类中没有 bark 方法。

  • 下面有关JDK中的包和他们的基本功能,描述错误的是?

    A java.awt: 包含构成抽象窗口工具集的多个类,用来构建和管理应用程序的图形用户界面

    B java.io:  包含提供多种输出输入功能的类

    C java.lang: 包含执行与网络有关的类,如URL,SCOKET,SEVERSOCKET

    D java.util:  包含一些实用性的类

    正确答案:B

    解析:java.lang包是Java语言的基础包,包含了最基本的类,它不需要import就可以使用,网络相关的类实际上是在java.net包中。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » java进阶--刷题与详解-2
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!