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

解析:

  1. Java中虚方法的特性

    • Java默认所有非final、非static的非静态方法均为虚方法(即支持动态绑定),子类可通过@Override重写。
    • 虚方法在父类中可以有实现,子类可覆盖或扩展。
  2. 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

解析:

java 复制代码
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

解析:

  1. Animal a = new Animal();

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

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

    • 输出动物可以移动

  2. Animal b = new Dog();

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

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

    • 调用 b.move()

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

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

      • 输出狗可以跑和走

  3. 尝试调用 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包中。

相关推荐
lendsomething1 小时前
graalvm使用实战:在java中执行js脚本
java·开发语言·javascript·graalvm
期待のcode1 小时前
性能监控工具
java·开发语言·jvm
Chan162 小时前
【 微服务SpringCloud | 方案设计 】
java·spring boot·微服务·云原生·架构·intellij-idea
小屁猪qAq2 小时前
设计模式总纲
开发语言·c++·设计模式
不绝1912 小时前
C#核心:多态
开发语言·c#
Howrun7772 小时前
C++标准线程库-全面讲解
开发语言·c++
浪扼飞舟2 小时前
C#(多线程和同步异步)
java·开发语言
万行2 小时前
机器人系统SLAM讲解
开发语言·python·决策树·机器学习·机器人
我的xiaodoujiao2 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 40--完善优化 Allure 测试报告显示内容
python·学习·测试工具·pytest