简介:面向备考Oracle Java SE 17开发者认证(1Z0-829)的考生与Java进阶学习者,这份练习测试资料由Jeanne Boyarsky与Scott Selikoff编写,围绕考试可能涉及的主题与概念组织大量模拟题,帮助读者在正式应考前检验知识盲区、熟悉题型节奏,并配合解析与复习策略形成系统化的冲刺方案。资源包共1个文件,为PDF格式电子书,整体约20.96MB,便于在电脑或平板上直接翻阅与检索。目前已有268人学习下载,可作为阶段性自测的参考材料。书中题目覆盖认证考试的核心知识范围,解析深入浅出,既能用于考前限时模拟,也适合按章节逐项巩固语法、API与开发实践要点,帮助读者把零散知识串联为可验证的答题能力,提升备考的针对性与效率。
1. 1Z0-829 到底考什么:先看清考点分布再刷题
很多人备考 Java SE 17 认证的第一反应是打开题库猛刷,刷了两百道题还是心里没底。问题不在题量,在于没先搞清楚这场考试的分值分布和出题逻辑。1Z0-829 是一场纯选择题的机考,题量在 50 道上下,及格线通常按百分比划定,容错空间并不宽裕。它不考你背 API 签名,考的是你能不能在一段有坑的代码面前判断出「编译过不过、运行输出什么、异常抛不抛」。换句话说,这是一场阅读代码行为的考试,不是写代码的考试。适合已经能写 Java、但没系统梳理过语言细节的人,也适合被模块化、并发、流式处理这些高频考点反复绊倒的老手。这份练习测试的价值就在于:它把考点按真实考试的权重铺开,让你在正式上场前把该翻的车都翻一遍。
2. 高频考点拆解:五类必考模块与答题模板
2.1 基础语法与类型系统:那些「看起来能编译」的陷阱
1Z0-829 里最容易被低估的就是基础语法题。题目往往给你一段十几行的代码,问编译结果或运行输出,坑埋在自动装箱、类型提升、var 的使用限制、switch 表达式的穷尽性上。这类题的正确率直接决定你能不能稳过及格线,因为它们在卷面里占比高、单题耗时短,是拿分的基本盘。
先看一道典型题:
public class Box { public static void main(String[] args) { Integer a = 127; Integer b = 127; Integer c = 128; Integer d = 128; System.out.println((a == b) + " " + (c == d)); } }这段代码的输出是true false。原因在于Integer的缓存范围是 -128 到 127,a和b落在缓存内,指向同一个对象;c和d超出范围,各自新建对象,==比较的是引用地址,所以为false。答题时不要急着算值,先问自己三个问题:这里比较的是值还是引用?有没有自动装箱介入?装箱有没有走缓存?这三问能覆盖大部分包装类比较题。
再看var的考点。考试喜欢在var后面接一个 lambda 或者数组初始化,比如var x = {1, 2, 3};这种写法编译不过,因为var不能用于数组初始化器,必须写成var x = new int[]{1, 2, 3};。还有var不能作为方法参数、不能声明为字段、不能赋null后不初始化。这类题的错误选项往往长得很像合法代码,答题模板是:先确认var出现的位置是否合法,再看右侧表达式能否推断出唯一类型,两步筛完基本不会错。
类型提升也是高频失分点。byte b = 10; b = b + 1;编译失败,因为b + 1提升为int,赋回byte需要强制转换。而b += 1;能编译,复合赋值隐含了强制转换。考试就爱在这两个写法之间做文章,看到复合赋值先想「隐式转换」,看到普通赋值先想「类型是否匹配」。
2.2 面向对象与设计:继承、接口、密封类的判断套路
面向对象部分的题量稳定,出题方式集中在「这段继承关系合不合法」「这个重写有没有问题」「密封类允许哪些子类」。这类题不需要你写完整类,只需要你判断一行声明是否成立,所以答题速度可以很快,但前提是把规则记准。
一道常见的重写判断题:
class Parent { protected Number getValue() throws Exception { return 1; } } class Child extends Parent { @Override public Integer getValue() { return 2; } }这段代码能编译。判断重写是否合法,看三条:访问修饰符不能更严格(protected到public是放宽,合法);返回类型必须是协变(Integer是Number的子类,合法);受检异常不能更宽(子类没抛异常,合法)。答题时按「访问权限、返回类型、异常」三列逐一核对,任何一列不满足就是编译错误。面试官最想听的是你能说出「协变返回」这个词,而不是笼统地说「子类可以改返回类型」。
密封类是 Java 17 的新考点,出题方式通常是给一个sealed接口和几个permits子类,问哪个子类声明不合法。规则是:被permits的子类必须用final、sealed或non-sealed三者之一修饰,缺一不可。如果子类和父类在同一个文件里,permits可以省略,但子类修饰符不能省。这类题的错误选项经常是「子类什么都没写」,看到这种直接判错。
接口的默认方法冲突也是老考点了。一个类实现两个接口,两个接口有同签名的默认方法,类必须重写,否则编译失败。如果类继承了一个父类方法,父类方法优先于接口默认方法。答题模板:先看类自己有没有重写,再看父类有没有具体实现,最后才看接口默认方法,优先级从高到低。
2.3 集合与流式处理:从「能跑」到「跑对」的分水岭
集合和 Stream 是整张卷子里区分度最高的模块。集合题考的是底层行为和不可变集合的边界,Stream 题考的是惰性求值、短路操作和Collectors的返回类型。这部分答不好,及格线会很悬。
先看一道集合题:
var list = List.of("a", "b", "c"); list.add("d");这行代码在运行时抛UnsupportedOperationException。List.of返回的是不可变集合,编译期不报错,运行期才炸。考试特别喜欢这种「编译通过、运行异常」的题,因为它在考你是否知道哪些工厂方法返回不可变对象。List.of、Set.of、Map.of全部不可变,且不允许null元素。答题时看到这些工厂方法,先标记「不可变」,再判断后续操作是否合法。
Stream 的惰性求值是另一个高频坑:
Stream<String> stream = Stream.of("a", "b", "c"); stream.map(String::toUpperCase); long count = stream.count();这段代码抛IllegalStateException,因为 Stream 已经被消费过。中间操作map返回新的 Stream,但原 Stream 一旦执行终端操作就不能再用。考试喜欢把中间操作和终端操作混在一起,问「输出什么」或者「抛什么异常」。答题模板:先圈出终端操作的位置,终端操作之前的所有中间操作都是惰性的,终端操作之后流关闭,任何复用都是异常。
Collectors的返回类型也常考。Collectors.partitioningBy返回Map<Boolean, List<T>>,键只有true和false两个;Collectors.groupingBy返回Map<K, List<T>>,键是分类函数的结果。题目经常给一个partitioningBy的结果让你取map.get("true"),字符串键当然取不到,因为键是Boolean类型。这类题错一次就该记住:分区只有布尔键,分组才是任意键。
2.4 并发与异常:多线程题的「顺序思维」和异常表的核对法
并发部分题量不算最大,但单题难度高,容易拉开差距。出题方式集中在ExecutorService的提交与关闭、Future的获取、synchronized与Lock的行为差异,以及并发集合的线程安全性。异常部分则考try-with-resources的关闭顺序、多重catch的匹配顺序、自定义异常的继承位置。
一道典型的并发题:
var pool = Executors.newSingleThreadExecutor(); Future<Integer> future = pool.submit(() -> 42); pool.shutdown(); System.out.println(future.get());这段代码能正常输出42。shutdown()不会中断已提交的任务,只是不再接受新任务,future.get()仍然能拿到结果。如果换成shutdownNow(),已提交但未开始的任务会被取消,get()可能抛CancellationException。答题时先看关闭方法,再看任务是否已经开始执行,两个条件决定结果。面试官想听的是你能区分「关闭」和「立即关闭」的语义差别。
异常题的高频套路是try-with-resources的关闭顺序:
try (var a = new Res("a"); var b = new Res("b")) { throw new RuntimeException("body"); }资源按声明的逆序关闭,先关b再关a。如果close()也抛异常,close的异常会被抑制(suppressed),主异常仍然是body抛出的那个。题目经常问「最终抛出哪个异常」或者「被抑制的异常怎么取」,答案是主异常,抑制异常通过getSuppressed()拿。答题模板:先确定主异常,再按逆序列关闭顺序,最后看有没有抑制异常。
多重catch的顺序也常考。子类异常必须写在父类异常前面,否则编译失败。比如catch (Exception e)写在catch (IOException e)前面,编译器直接报「已被捕获」。这类题看到 catch 块就从窄到宽排一遍,顺序不对就是编译错误。
2.5 模块化系统:exports、requires 与反射的边界
模块化是 Java 9 之后的新考点,1Z0-829 里占比不大但几乎必出。题目通常给一个module-info.java和几行使用代码,问「能不能访问」「编译还是运行时报错」。核心规则只有几条:exports控制包对外可见,requires声明依赖,opens允许反射访问,未导出的包在编译期就不可见。
一道典型题:
module com.example.app { requires java.base; exports com.example.api; }如果另一个模块想用com.example.internal包里的类,编译直接失败,因为该包没有exports。注意java.base是隐式依赖,写不写requires都一样,题目如果拿这个做文章,问「去掉requires java.base会不会编译失败」,答案是不会。这类题的错误选项往往把「编译期不可见」说成「运行期异常」,看到这种表述直接排除。
opens和exports的区别也是高频点。exports让包在编译期和运行期都可见,opens只允许运行期通过反射访问,编译期仍然不可见。题目如果给一个框架反射调用某个包,问需要exports还是opens,答案是opens。答题模板:普通代码调用看exports,反射调用看opens,两者都要求模块被requires。
3. 易错题复盘:五类最常见的失分点
3.1 包装类比较:把==当成值比较
错在哪:看到两个Integer变量就直接比大小,忽略引用比较和缓存范围。为什么错:==对引用类型比地址,只有缓存范围内的装箱对象才共享实例。怎么答对:先判断是否装箱、是否在 -128 到 127 之间,超出范围一律按引用不同处理,值比较用equals。
3.2 不可变集合:编译通过就以为能改
错在哪:对List.of的结果调用add,以为和ArrayList一样。为什么错:工厂方法返回的是不可变实现,修改操作运行期抛异常。怎么答对:看到of、copyOf、toList先标记不可变,任何增删改都判运行期异常,除非题目明确说包了一层new ArrayList<>(...)。
3.3 Stream 复用:终端操作后再用原流
错在哪:中间操作之后又拿原 Stream 变量做终端操作,以为中间操作是原地修改。为什么错:Stream 是一次性消费的,终端操作后流关闭。怎么答对:圈出终端操作,之后任何对同一流变量的引用都判IllegalStateException,除非重新创建流。
3.4 重写规则:只看方法名不看三要素
错在哪:两个方法签名一样就认为是合法重写,忽略访问权限和异常声明。为什么错:重写要求访问权限不收紧、返回类型协变、受检异常不扩大。怎么答对:按「权限、返回、异常」三列逐项核对,任何一列不满足就是编译错误,不要凭感觉。
3.5 模块可见性:把编译错误当成运行异常
错在哪:未导出包的访问问题答成「运行期抛异常」。为什么错:模块系统在编译期就做可见性检查,未exports的包根本编译不过。怎么答对:先看目标包有没有exports,没有就是编译失败;反射场景再看有没有opens,没有才是运行期异常。
4. 刷题节奏与答题技巧:把练习测试用成「错题驱动」的闭环
刷这份练习测试,最忌讳的是从头到尾按顺序做完对答案。有效的做法是分三轮。第一轮按模块做,每个模块限时完成,做完立刻对答案,把错题按「知识点」而不是「题号」归类,比如「包装类缓存」「Stream 复用」「模块 exports」各建一个错题桶。第二轮只做错题桶里的题,做之前先不看解析,自己写一句「这题考什么、我上次为什么错」,写不出来说明还没真懂。第三轮做整套限时模拟,重点练答题节奏:1Z0-829 单题平均时间不到两分钟,遇到长代码题先看问题问什么,再回头读代码,能省一半时间。
答题时的通用技巧有三条。第一,先判断「编译还是运行」,大部分题的选项里同时有编译错误和运行异常,先定这一层能排除一半干扰项。第二,代码题从「最后一行」倒着看,最后一行往往是输出或赋值,决定了你要关注哪个变量。第三,拿不准的题标记后跳过,机考可以回头改,卡在一道题上超过三分钟就是亏。
下面这张表可以贴在错题本首页,每错一道就归一次类:
| 错题类型 | 典型信号 | 复盘动作 |
|---|---|---|
| 编译 vs 运行 | 选项同时出现编译错误和异常 | 先定错误发生的阶段 |
| 引用 vs 值 | 出现==、equals、装箱 | 判断是否超出缓存范围 |
| 惰性 vs 终端 | 出现 Stream 链式调用 | 圈出终端操作位置 |
| 权限 vs 异常 | 出现@Override | 按三要素逐列核对 |
| 导出 vs 打开 | 出现module-info | 区分编译可见与反射可见 |
我自己的血泪经验是:第一遍做模拟时错题只标了题号,没写错因,结果第二遍遇到同类题照样翻车。后来改成每道错题强制写一行「错因 + 正确判断路径」,正确率才稳住。从那以后我每次刷题都强制走一遍「归类、写错因、隔天重做」的流程,不再追求刷了多少道。这份练习测试的题目覆盖了上面所有高频模块,按这个节奏走三轮,考场上遇到同类题基本能条件反射出判断路径。希望帮到你。
本文还有配套的精品资源,点击获取