全部来自 AI 原创生成并经逐题审校的题目,带 精品 标记的为 AI 复审通过。整卷生成请去组卷。
某学生编写图形界面程序,需要监听鼠标移动事件,但只关心 MouseMotionListener 接口中的 mouseDragged 方法,不关心 mouseMoved 方法。他声称:由于适配器类(如 MouseMotionAdapter)对接口方法作了空实现,因此继承适配器类后,即使一个方法也不重写,程序编译运行也能正常进行,且拖动事件发生时同样会执行他自定义的处理逻辑。请判断该说法是否正确。
登录后查看答案
某类中有两个同步方法 m1() 和 m2(),均用 synchronized(this) 修饰,且都修改同一共享变量 data。程序运行时创建了该类的两个不同实例 obj1 和 obj2,线程 t1 调用 obj1.m1(),线程 t2 调用 obj2.m2()。请判断:由于 m1() 和 m2() 都带有 synchronized 修饰,t1 与 t2 对 data 的访问必然是互斥安全的。
某类中有共享变量 balance(余额)。线程 t1 与 t2 都调用同一对象的方法 withdraw(),该方法体内使用 synchronized(obj) 同步代码块修改 balance,但 t1 所在类实例持有的锁对象是 obj1,t2 所在类实例持有的锁对象是 obj2,且 obj1 != obj2。判断:即使两个线程访问的是同一份数据 balance,由于二者使用的锁对象不同,同步失效,仍可能出现数据不一致。
判断:某程序用 BufferedOutputStream 向文件写入数据,由于缓冲流会在内存中缓存数据、减少对底层流的读写次数,因此只要使用了缓冲流,即使从未调用 flush() 或 close(),所有数据也一定会完整写入磁盘。
判断:在循环中反复执行 result = result + str 进行字符串拼接时,由于 String 是不可变对象,每次拼接都会创建新的 String 对象,因此大数据量拼接应改用 StringBuilder 的 append 方法以提高效率。即便某些编译器会自动将循环内的字符串拼接优化为 StringBuilder 实现,这一优化也并非语言规范所保证,良好实践仍应显式使用 StringBuilder。
判断:某程序员认为,只要把集合声明为泛型类型如 List<Integer>,编译器就会在程序运行时持续检查每个元素类型,从而在运行时完全杜绝 ClassCastException 的发生。
某类中定义了共享变量 count,方法 inc() 写成:void inc(){ synchronized(lockA){ count++; } },其中 lockA 是实例字段。现有线程 t1 与 t2,t1 操作对象 obj1,t2 操作另一个新建对象 obj2,两个对象各自的 lockA 均指向同一静态共享对象 LOCK,且 count 声明为静态共享变量。请判断:由于 t1 与 t2 操作的是不同对象,二者必然无法互斥,count 仍会出现线程安全问题。
判断:某类实现了 Serializable 接口,其中字段 score 未被 transient 修饰。将一个该类对象用 ObjectOutputStream 序列化写入文件后,再用 ObjectInputStream 反序列化恢复该对象,则恢复出的对象中 score 字段的值与序列化时该对象的 score 值相同;若将 score 改为 transient 修饰后重复上述过程,则恢复出的对象中 score 字段的值为该类型的默认值(如 int 型为 0)。
判断:小张需要逐行统计一个 UTF-8 编码中文文本文件中的内容并进行字符串比对。为了提升读取速度,他先用 FileInputStream(字节流)配合 8KB 缓冲区逐字节读出,再按单个字节直接转成 char 进行处理。因为缓冲区很大、速度很快,所以这种做法既能保证中文不被截断乱码,又是处理该文本任务的最佳选择。
判断:设类 Device 定义了方法 start(),类 Printer 继承 Device 并重写了 start(),同时 Printer 新增了特有方法 print()。执行语句 Device d = new Printer(); 后,通过引用 d 可以直接调用 print() 方法,且 d.start() 在运行时执行的是 Printer 中重写后的版本。
线程 t 已通过 new 创建并调用了 start() 方法,当前处于等待 CPU 调度的状态。某同学分析如下:(1) 此时 t 处于就绪状态;(2) 若 t 抢到 CPU 开始执行 run() 方法,则进入运行状态,从就绪到运行的转变是由程序显式调用某个方法触发的;(3) 在运行中若 t 调用 sleep(1000),将主动释放 CPU 并进入阻塞状态,1000 毫秒后重新进入就绪状态等待调度;(4) run() 方法执行完毕后,t 进入死亡状态,再次调用 start() 可使其重新运行。以上四条分析全部正确的判断为正确,否则为错误。
某学生编写程序读取一个仅含中文和英文字符的 UTF-8 编码文本文件,逐字节读取后按字节拼接输出,结果出现乱码。他因此断言:凡是出现乱码就说明字节流不能用于读取文件,必须改用字符流才能读取任何文件。请判断该说法是否正确。
判断下列说法的正误:在 Java 集合框架中,ArrayList 底层为数组、LinkedList 底层为双向链表,因此任何场景下 ArrayList 的增删操作都比 LinkedList 慢;又因为 ArrayList 支持随机访问,所以对于以尾部追加和按下标访问为主、极少在中间位置插入删除的场景,选用 ArrayList 比 LinkedList 更合适。
判断:在 Java 中,ArrayList 底层是数组,随机访问效率高,但在尾部追加元素也很高效;而 LinkedList 底层是链表,在头部插入元素比 ArrayList 更高效。因此无论何种使用场景,ArrayList 的增删操作都一定比 LinkedList 慢。
判断下列说法是否正确:在 Java 中,NullPointerException 和 ArrayIndexOutOfBoundsException 都继承自 RuntimeException,属于非受检异常,因此方法中可能抛出这两类异常的代码即使不被 try-catch 捕获、方法签名中也不用 throws 声明,编译仍能通过;而 FileNotFoundException 属于受检异常,编译器强制要求对其进行捕获处理或用 throws 声明,否则编译报错。
判断:若父类 P 中只定义了构造方法 P(int n),未定义无参构造方法,则子类 Q extends P 的构造方法若首行未显式写 super(...),编译将报错。
判断下列说法的正误:在 Java 中,构造方法内使用 this(参数列表) 可以调用本类的另一个构造方法,但该语句必须位于构造方法的第一行,因此以下代码能够正确编译并运行: class Student { String name; Student() { this("默认"); } Student(String name) { this(); this.name = name; } }
判断:在 Java 中执行 int[][] b = new int[2][]; b[0] = new int[3]; b[1] = new int[5]; 后,b.length 的值为 2,且 b[0].length 与 b[1].length 的值可以不同,因此语句 System.out.println(b[0][3]); 会抛出 ArrayIndexOutOfBoundsException。
在 Java 中,某同学依据“容量大小由字节多少决定”得出如下结论:long 类型占 8 个字节,float 类型只占 4 个字节,因此把 long 型变量赋值给 float 型变量属于大容量向小容量转换,必须使用强制转换语法 (float),而把 float 型变量赋值给 long 型变量则可以自动类型转换。请判断该结论是否正确。
有如下代码片段: int p = 7, q = 2; boolean r = (p % q == 1) | (++q > 0) && (p < 0); 某同学判断:由于 (p % q == 1) 为 true,整个表达式用普通或开头仍会短路,右侧全部不执行,因此 q 的值执行后仍为 2。请判断该同学的说法是否正确。