ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

Java SE 17认证考试核心考点与易错点复习指南

Java SE 17认证考试核心考点与易错点复习指南 简介这份 PDF 面向备战 Oracle Java SE 17 开发者认证Exam 1Z0-829的考生由 Jeanne Boyarsky 与 Scott Selikoff 编写把考试大纲中的知识点转化为可直接演练的模拟测试题适合已有一定 Java 基础、希望在上考场前检验薄弱环节的中高级开发者。压缩包内为 1 个 PDF 文件约 20.96MB由 Wiley 出版发行内容围绕官方考试范围编排覆盖语言基础、面向对象设计与实现、异常处理、集合与泛型、Stream 与 Lambda、模块化系统、并发编程、I/O 与 JDBC 等模块题目后附有解析与实用的复习策略便于理解考点原理而不只是死记答案。读者可借助成套练习模拟真实考试节奏用错题反查知识盲区据此安排冲刺阶段的复习顺序解析侧重考点辨析也方便培训讲师挑选课后练习。目前已有 268 人学习下载适合考前自测、查漏补缺与二轮强化。1. 一张地图Java SE 17 认证考试到底在考什么先说一个反直觉的结论这门 Java SE 17 认证考试不考你写不写得出业务代码考的是你能不能在两分钟内判断一段代码是「编译不过」「运行才炸」还是「看着别扭其实完全合法」。正因为如此市面上那套 1Z0-829 的实战练习和模拟测试题才会显得刁钻题面短、选项近、错误藏在一行注释后面。很多人做完整套题才发现自己真正丢分的地方不是不会写类而是漏看了访问修饰符、看错了格式化模式字母的大小写。把这十块考纲摊开再叠起来其实只有四层语言地基日期时间、文本、数值、控制流、对象模型继承、接口、记录类、密封类、异常与断言、数据结构与流水线集合、泛型、Stream、并发、工程域I/O、模块化、本地化。前两层决定你能不能读懂题后两层决定你能不能排掉干扰项。适合已经能写 Java、想用一套系统复习策略把知识点串成地图的人。2. 语言地基日期时间、文本、数值与控制流的复习重点2.1 日期时间不可变对象与 Period、Duration 的分工java.time这一族的题八成的失分不在 API 记不住而在忘了它们全是不可变对象。LocalDate.plusDays(1)返回的是新实例原对象纹丝不动代码里写date.plusDays(1);而不接返回值编译能过、运行不报错、结果就是没变——这种题专治「我以为它在原地改」。类型表示什么常用场景LocalDate/LocalTime/LocalDateTime不带时区的日期、时间、日期时间大多数本地计算ZonedDateTime带时区规则的完整时间跨时区、夏令时Instant时间线上的一个点UTC 纪元秒时间戳、机器时间Period年、月、日只能作用于日期类Duration时、分、秒、纳秒作用于时间、Instant最容易混的是Period和Duration的作用范围给LocalDate加Duration编译就不过给LocalTime加Period也一样。Duration.ofHours(30).toHours()是 30但toMinutes()得到的是 1800toMinutesPart()才是 0截断和取余的区别在题里经常只差一个词。// 注意大小写MM 是月mm 是分HH 是 24 小时制hh 是 12 小时制dd 是日DD 是一年中的第几天 DateTimeFormatter fmt DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss); LocalDateTime dt LocalDateTime.of(2023, 3, 1, 9, 5, 0); System.out.println(fmt.format(dt)); // 2023-03-01 09:05:00 System.out.println(dt.plusDays(1).format(fmt)); // 原对象不变plusDays 返回新实例 // 解析失败抛 DateTimeParseException它是 RuntimeException 的子类catch 写成 IOException 会编译不过 LocalDate parsed LocalDate.parse(2023-03-01, DateTimeFormatter.ISO_LOCAL_DATE);yyyy和YYYY不是同一个东西前者是纪元年后者是「基于周的年份」跨年那一周用YYYY会得到下一年的数字。同理MM和mm、HH和hh、ss和SSS这类字母大小写在考察里几乎是必出写代码时随手用 IDE 的格式化提示反而察觉不到。2.2 文本块与 String 新 API规则比方法更需要记文本块有三条硬规则开头的后面必须换行否则编译不过内容里的双引号不需要转义但连续三个引号要转义收尾定界符的位置决定公共缩进被裁掉多少。第三条是重灾区——把结束的顶格写缩进就全保留和最后一行内容对齐缩进就被裁掉。String sql SELECT id, name FROM demo_table WHERE id %d .formatted(7); // 反斜杠放在行尾表示「这一行不换行」\s 表示一个不会被裁掉的行尾空格 String joined a\ b; System.out.println(joined); // ab方法层面strip()和trim()的差别在于前者认 Unicode 空白后者只处理 ASCII 码小于等于 32 的字符indent(int)传正数是加空格传负数只负责移除空白而不补齐isBlank()判的是「是否只有空白」空串返回 true。String.repeat(0)返回空串而不是异常lines()返回的是StreamString这些细节单独看都很小凑在四个选项里就能筛掉一半人。2.3 数值、包装类与类型提升的玄学都在这包装类的缓存机制是经典翻车点Integer在 -128 到 127 之间复用同一批对象用比较得到 true超出范围就是 false。Long、Short、Character有类似机制Float和Double则根本没有缓存两个Double.valueOf(1.0)用永远是 false。Integer a 127, b 127; System.out.println(a b); // true包装类缓存 -128~127 Integer c 128, d 128; System.out.println(c d); // false超出缓存范围 // BigDecimal 的 equals 连精度一起比compareTo 只比数值 System.out.println(new BigDecimal(1.0).equals(new BigDecimal(1.00))); // false System.out.println(new BigDecimal(1.0).compareTo(new BigDecimal(1.00))); // 0字面量里的下划线只能放在数字之间1_000合法_1000、1000_、1._0、0x_1全都不合法。三元运算符的类型提升也常考boolean ? 1 : 2L的结果类型是long把int和double混在一起会提升成double而两边是包装类时又要考虑拆箱true ? Integer.valueOf(1) : 1这种写法在题里出现就得先想清楚会不会 NPE。2.4 控制流switch 表达式与标签跳转switch能接受的类型有限byte、short、char、int、对应的包装类、String、枚举。long、float、double、boolean一律不允许case标签必须是编译期常量。Java 17 的箭头形式不会穿透一段代码块要返回值时必须显式写yield作为表达式的switch还要求穷尽枚举少写一个常量又没default就是编译错误。// switch 表达式必须穷尽箭头形式不穿透代码块里用 yield 交出值 String size switch (code) { case 1, 2 - small; case 3 - { String r medium; yield r; } default - unknown; };instanceof的模式匹配变量作用域要看清if (!(o instanceof String s)) return;之后的s是有效的但把条件写成与||混合时变量的可用范围会跟着短路逻辑走。标签跳转outer:只能贴在最外层循环前break outer跳出整个循环continue outer只结束当前这轮。至于不可达代码while (false) { }后面的语句是编译错误而if (false) { }后面的语句合法——同样是常量条件一个报错一个不报凭直觉猜很容易错。3. 对象模型继承、接口、记录类、密封类与异常的判定题3.1 访问修饰符与重写规则访问控制是这类题的第一道筛子四个修饰符的范围必须闭着眼都能画出来。修饰符同一个类同一个包子类任意位置private可见不可见不可见不可见默认无修饰符可见可见不可见不可见protected可见可见可见不可见public可见可见可见可见重写要同时满足四条方法签名一致、返回类型协变或相同、不能降低可见性、不能抛出更宽的受检异常。static方法不能被重写子类写同名同参只是隐藏private方法同理子类里写一个「看起来像重写」的方法完全合法只是不构成多态。变量则根本没有重写这回事父类引用指向子类对象时取到的是父类那份字段值。class Parent { static { System.out.print(1); } // 父类静态块类初始化时执行且只一次 { System.out.print(2); } // 父类实例块按声明顺序 Parent() { System.out.print(3); } // 父类构造器体 } class Child extends Parent { static { System.out.print(4); } { System.out.print(5); } Child() { System.out.print(6); } } new Child(); // 输出 142356这个顺序值得背下来父类静态块 → 子类静态块 → 父类实例块与字段 → 父类构造器 → 子类实例块与字段 → 子类构造器。this()和super()不能同时出现而且必须是构造器的第一条语句所以题里那种「先打印一行再调super()」的写法必然是编译错误。3.2 接口、记录类与密封类接口的三类方法要分清default方法可被继承也可被重写static方法属于接口本身、不被继承私有方法只能给接口内部的default方法调用。两个接口给出同签名的default方法时实现类必须重写否则编译不过——这条几乎是必考。接口里的字段隐式为public static final写int X 1;之后想再赋值就是编译错误。记录类是 Java 17 的高频考点规则密集但都很好记隐式final不能声明实例字段组件访问器是x()而不是getX()可以带静态字段和静态方法可以实现接口不能继承别的类。紧凑构造器不写参数列表用来做校验如果要写普通构造器第一条语句必须委托给规范构造器。record Point(int x, int y) { Point { // 紧凑构造器不写参数列表 if (x 0) throw new IllegalArgumentException(x 0); } Point(int v) { this(v, v); } // 其他构造器必须委托给规范构造器 }密封类看两点permits列出的子类必须存在且每个子类必须标注final、sealed或non-sealed三者之一如果都在同一个模块里可以省掉permits让编译器从同一个文件里推断。子类和父类不在同一个包未命名模块时就编译不过这条在选择题里通常被包装成「跨包继承」的样子。sealed interface Shape permits Circle, Square {} // 子类必须 final / sealed / non-sealed record Circle(double r) implements Shape {} final class Square implements Shape {}3.3 异常与断言三层结构与执行顺序异常体系先分三层Throwable之下是Error和ExceptionException之下再分RuntimeException非受检和其他受检异常。题里最爱考的是「哪些是受检」NullPointerException、IllegalArgumentException、NumberFormatException、ClassCastException、ArithmeticException全是非受检IOException、SQLException、InterruptedException是受检。捕获顺序上子类异常必须写在父类前面否则编译错误多重捕获catch (A | B e)里的e隐式final不能再赋值。try-with-resources的两个细节关闭顺序与声明顺序相反如果try块和close()都抛异常close()的异常会作为 suppressed 挂在主异常上用getSuppressed()取。资源变量隐式final在try块里重新赋值是编译错误。finally里写return会覆盖try里的返回值和异常这属于「编译器不拦、运行结果反直觉」的典型。class R implements AutoCloseable { private final String name; R(String n) { name n; } public void close() { System.out.print(name); } } try (R a new R(A); R b new R(B)) { } // 输出 BA关闭顺序与声明顺序相反断言要单独记assert默认关闭必须用-ea打开才生效失败时抛的是AssertionError而不是异常assert x 0 : msg;里的冒号后面是消息表达式。重写方法时抛出的受检异常不能比父类版本更宽但可以更窄甚至不抛非受检异常则不受这条限制。4. 数据结构与流水线集合、泛型、Stream 与并发的题眼4.1 集合实现类的选择与代价集合题的套路是先看「能不能存 null」再看「是不是有序」最后看「并发下会不会炸」。实现类允许 null 元素有序性典型考点ArrayList允许插入顺序随机访问快中间删除慢LinkedList允许插入顺序同时实现List与DequeArrayDeque不允许插入顺序作栈或队列用push(null)抛 NPEHashSet/HashMap允许HashMap允许一个 null 键无序依赖hashCode与equalsTreeSet/TreeMap不允许排序元素必须可比较否则ClassCastExceptionConcurrentHashMap不允许无序键值都不能为 nullList.of()、Set.of()、Map.of()返回的都是不可变集合传 null 直接 NPESet.of()里放重复元素抛IllegalArgumentException。Arrays.asList()是固定长度而非不可变add和remove抛UnsupportedOperationException但set可以改。遍历时删除元素要用Iterator.remove()或removeIf直接list.remove()会得到ConcurrentModificationException。4.2 泛型与比较器PECS 别背反泛型擦除决定了new ArrayListString().getClass() new ArrayListInteger().getClass()为 true也决定了不能写new T[]、不能写new ListString[10]。通配符的方向按 PECS 记List? extends Number是生产者只能读不能写List? super Integer是消费者能写但读出来只能是Object。题里常把这两个写反让你判断哪一行编译不过。比较器则有两条主线Comparable是「自己和自己比」compareTo返回 0 表示相等Comparator是外部比较器可以链式组合。Comparator.comparing(Person::name).thenComparingInt(Person::age)是先按名字再按年龄.reversed()只反转紧挨着的那一段写在整个链子末尾和写在中间结果完全不同。用TreeSet装没实现Comparable又没给Comparator的对象第一次add就抛ClassCastException而不是在编译期报错。4.3 Stream 管道的惰性与终止操作Stream 题的核心只有一句话中间操作是惰性的终止操作才触发执行而且一条流只能消费一次。map是一对一flatMap是一对多再摊平peek是中间操作只该用来观察count()这类终止操作在元素个数已知时可能压根不遍历peek一行都不打印。ListString names List.of(Amy, Bob, Ada); MapInteger, ListString byLen names.stream() .collect(Collectors.groupingBy(String::length)); // 长度 - 名字列表 // peek 是中间操作只用于观察流水线不能当 forEach 用 long n names.stream().peek(System.out::println).count();Collectors.toMap遇到重复键抛IllegalStateException需要传合并函数才不炸partitioningBy返回的 Map 一定有两个键true和falsefindFirst在并行流里仍保证取第一个findAny则不保证。Optional的orElse无论是否为空都会求值orElseGet才惰性这一条在带副作用的例子里经常被拿来出题。4.4 并发的四个必考点并发部分先分清Runnable和Callable前者run()无返回值不能抛受检异常后者call()有返回值可以抛。ExecutorService.execute提交任务无返回submit返回Futureget()阻塞并可能抛ExecutionException、InterruptedException、TimeoutException。shutdown()只是不再接新任务、不阻塞awaitTermination才阻塞等待忘记关闭线程池JVM 就不退出。线程状态六个值、synchronized与wait/notify必须在同步块内调用、AtomicInteger保证单变量原子性、CountDownLatch一次性而CyclicBarrier可重用这几条属于「记了就能拿分」。并行流用的是公共 ForkJoin 池lambda 里改共享的可变状态结果顺序和数值都不确定要保证顺序得用forEachOrdered。5. 易错点五个反复翻车的判定盲区5.1 格式化与本地化模式字母和资源文件命名易漏点yyyy与YYYY、MM与mm、HH与hh混用以及ResourceBundle的基名拼写。资源文件的查找顺序是「基名_语言_国家 → 基名_语言 → 基名 → 默认 locale 的对应文件」少一级就落到别的文件上程序不报错只是取到了错误的文案。为什么漏这些字符串长得太像写代码时 IDE 不校验模式字母只有在运行时才发现输出多了或少了几个小时资源文件的命名错误也不会抛异常回退机制把它悄悄兜住了。怎么补把模式字母抄成一张对照表贴在错题本第一页本地化部分固定用ResourceBundle.getBundle(messages, locale)加三个层级的属性文件做一次实测看清楚每一级命中的是哪个文件再回头做模拟测试里的同类题。5.2 泛型通配符与重载解析易漏点List? extends T里add编译不过List? super T里get只能拿到Object两个重载方法一个收List?、一个收ListString调用时选哪个。为什么漏方向背反了也能跑通大部分日常代码因为平时写的都是具体类型重载解析则牵涉泛型擦除ListString和ListInteger擦除后是同一个类型编译器会挑「最具体」的那个。怎么补准备一段五行以内的小程序把上界、下界、无界三种写法的读写操作各试一遍看编译器在哪一行报错重载那类题不要靠推理直接在 jshell 里敲一遍记住了报错信息比记住结论更管用。5.3 资源关闭顺序与 finally 的覆盖易漏点try-with-resources的关闭顺序是声明的逆序close()抛出的异常会成为 suppressedfinally里的return会吞掉try中的异常。为什么漏正常路径下顺序无关紧要只有异常路径才暴露差异而练习题恰恰专挑异常路径finally的覆盖行为编译器完全不提示。怎么补写一个实现AutoCloseable的小类声明两个实例并在try块里抛异常把getSuppressed()的内容打印出来凡是看到finally里带return或赋值语句的题直接判定为反例。5.4 模块路径与类路径的混用易漏点module-info.java里的requires、exports、opens语义搞混把模块化的 jar 丢到类路径上模块描述符被忽略。为什么漏模块系统在实际项目里用得少光是「能编译能运行」就不容易触发边界exports与opens的差别前者是编译期可访问后者是运行期反射可访问在单模块场景里体现不出来。怎么补手动建两个模块一个导出包、一个requires它先跑通再把exports改成opens观察编译期和反射访问分别在何时失败。比起背定义失败一次记得牢。5.5 并行流与线程池的状态泄漏易漏点并行流里修改共享集合线程池创建后不shutdown程序跑完不退出submit返回的Future不get异常被静默吞掉。为什么漏小数据量下并行流往往按顺序执行看不出问题异常藏在Future里不在主线程栈上控制台一片安静。怎么补写一个IntStream.range(0, 10_000).parallel()往ArrayList里add的 Demo跑几次看看结果长度是否稳定线程池的练习一律加try/finally包住shutdown()和awaitTermination把这条当成肌肉记忆。6. 复习清单把十个考点域压成一张自测表复习到中后段最怕的是「每块都看过、每块都不敢说会」。我自己的做法是把十个考点域压成一张表每行只填三件事这一域的必背结论、最容易错的那一条、用什么方式自测。表格填不满的地方就是下一轮该重点补的地方。考点域必背结论自测方式日期时间全部不可变Period归日期、Duration归时间手写三种格式化模式并预测输出文本与数值文本块三条规则、包装类缓存区间改一行代码看是否编译过控制流switch支持的类型与穷尽性把if/else改写成switch表达式面向对象重写四条件、初始化顺序数一遍打印顺序再运行记录类与密封类紧凑构造器、子类三选一故意漏写final看报错异常与断言受检非受检分类、关闭逆序造 suppressed 异常打印链集合null 支持与有序性对照表换实现类跑同一段代码泛型与比较器PECS 方向、thenComparing顺序写上下界各一次读写Stream惰性、只能消费一次、toMap冲突加peek看是否被跳过并发与 I/O线程池关闭、Path与Files分工跑一遍-ea打开断言自测环节有两件事必须亲自动手别在脑子里推。第一件是断言默认关闭不打开就等于没写第二件是语法点猜错一次比看十遍定义有用。# 断言默认关闭必须显式打开否则 assert 语句等于不存在 javac SelfCheck.java java -ea SelfCheck # 语法点直接在 jshell 里试比翻笔记快 jshell --class-path out做完一套模拟测试后的归因也要固定流程错题只分三类——没记住的结论、看漏的关键字、理解偏的语义。第一类补记忆卡第二类练审题把修饰符、返回值、异常类型用铅笔圈出来第三类才值得回炉重看。前两类占多数的时候继续刷题收益最高第三类一多就该停下来把整章重新梳理一遍而不是硬刷下一套。从那以后我每次做完一套实战练习都会强制走一遍这套归因流程先把错题的错因写成一个短句再对回表格里的某一行最后只复习那一行涉及的知识点绝不整章重看。坚持几套下来错题会明显收敛到固定的两三个域上那时候再集中补效率比平均用力高得多。希望帮到你。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表