-
完成Java基础后应通过项目实践巩固知识,学生信息管理系统涵盖面向对象、集合与异常处理;2.系统功能包括增删改查学生信息;3.设计Student类封装属性并重写toString方法;4.使用ArrayList存储学生数据,Scanner接收用户输入;5.主逻辑在StudentManager中实现菜单循环与功能分支;6.添加学生时创建对象并存入列表;7.删除学生需遍历列表匹配学号并移除;8.修改与查询均基于学号定位目标对象;9.项目帮助理解代码真实运行流程,强化知识点串联。
-
普通ThreadLocal无法在父子线程间传递值是因为其值仅绑定当前线程的ThreadLocalMap,子线程为新实例且不复制父线程值;InheritableThreadLocal通过重写createInheritedMap()和childValue(),在子线程init时浅拷贝父线程值,但仅限直接创建的子线程,不适用于线程池等复用场景。
-
Record类是Java16为DTO场景设计的不可变扁平数据载体,自动生成字段、构造器、getter、equals、hashCode和toString;组件名即访问器名(无get前缀);仅支持紧凑构造器校验,不支持继承。
-
当需元素唯一且按插入顺序遍历时应选LinkedHashSet;它用哈希表+双向链表实现,遍历稳定O(n),顺序可预测,而HashSet无序、TreeSet按自然序排序。
-
必须在main方法第一行调用System.setOut(),早于SpringApplication.run(),否则Banner、Actuator等组件及静态块中的System.out::println已固化输出流,重定向失效。
-
InputStreamReader是字节流到字符流的解码桥,仅在需将InputStream按字符处理时使用;必须显式指定编码(如StandardCharsets.UTF_8)并套BufferedReader以避免乱码和性能问题。
-
Java线程有六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED;它们是Thread类中可直接通过getState()读取的真实枚举值,反映线程在JVM和操作系统调度下的真实行为。
-
Java读取文件乱码的根本原因是程序字符编码与文件实际编码不一致,需明确文件真实编码并显式指定,禁用系统默认编码,处理BOM,统一项目UTF-8规范。
-
fail-fast的核心是检测集合结构被意外修改而非并发;ArrayList的modCount在结构性修改时自增,迭代器构造时复制为expectedModCount,next()/hasNext()前比对二者,不等则抛ConcurrentModificationException。
-
BitSet比boolean[]节省8倍内存因其按位存储,1字节存8个布尔值;但存在线程不安全、无泛型、随机访问有位运算开销、大索引可能OOM等问题。
-
答案:Collectors.summingInt用于对集合中对象的int属性求和,需配合StreamAPI使用,通过ToIntFunction提取值并累加。示例中统计Product列表的price总和为45,适用于List、Set等集合类型,仅支持int类型,null值需提前处理,性能良好,适合数据聚合。
-
应使用BufferedReader包裹System.in进行控制台输入,因其readLine()总读完整行、行为确定;写日记用Files.write()配合APPEND/CREATE和UTF-8编码;读日记用Files.readAllLines()但需捕获NoSuchFileException并判空;路径应封装为静态常量并优先使用用户主目录。
-
应只捕获具体异常类型,避免捕获Throwable或泛型Exception;受检异常须显式处理而非静默吞掉;finally中勿覆盖原始异常;自定义异常需依场景选择继承RuntimeException或Exception。
-
单一职责原则要求一个类只负责一项职责,以降低耦合和提高可维护性。在Java中,若类承担多个功能(如用户注册与邮件发送),应拆分为独立类(如UserService和EmailService),使每个类仅处理单一业务逻辑,从而提升代码可读性、可测试性和团队协作效率,避免因一处变更影响其他功能。
-
Collectors.summarizingLong用于统计集合中long值的汇总信息,返回LongSummaryStatistics对象,可获取数量、总和、最值及平均值。