-
File.setLastModified返回false主因是底层限制:文件不存在、无写权限、文件系统禁用时间戳更新、Windows链接异常或文件被独占占用;需确保exists()、isFile()、canWrite()均为true且时间值合法。
-
ConcurrentModificationException是Java集合的fail-fast机制抛出的异常,用于检测单线程中遍历时非法修改结构(如for-each中直接调remove),其根源是迭代器的expectedModCount与集合modCount不一致;正确做法是用Iterator.remove()(需先next())、removeIf()(JDK8+,注意Predicate纯函数性)或线程安全容器。
-
抽象类必须用abstract修饰且不能被实例化,本质是“不完整的类”,用于被继承而非创建对象;含抽象方法的类必须声明为abstract,抽象方法无方法体、不可用private/static/final修饰;子类非abstract则须实现全部抽象方法。
-
final成员变量必须在构造方法结束前完成初始化,否则编译报错;只能在声明处、构造器内或初始化块中赋值,且每个构造路径都必须覆盖所有final字段。
-
Java中自增(++)和自减(--)运算符的核心区别在于前置与后置的执行顺序:前置先改值后参与计算,后置先用原值再改值;单独使用时等价;不可用于常量或表达式。
-
安装JDK是搭建Java开发环境的第一步,可通过包管理器或手动安装。首先选择OpenJDK或OracleJDK,Ubuntu用户使用aptinstallopenjdk-17-jdk,CentOS用户使用yuminstalljava-17-openjdk-devel进行安装;若手动安装OracleJDK,需下载tar.gz包并解压至指定目录(如/opt/jdk),然后配置环境变量:在/etc/profile中添加JAVA_HOME、PATH和CLASSPATH,并执行source/etc/profile使配
-
flatMapToInt用于将字符串集合转为Unicode码点整数流,推荐用String::codePoints正确处理代理对;需过滤null,禁用chars()以防增补字符错误拆分。
-
this能解决变量名冲突,因为它明确指向当前对象的成员变量,避免被同名局部变量遮蔽;在构造函数中必须用this.name=name来正确赋值,否则会导致自赋值错误。
-
信号量(Semaphore)用于控制并发访问资源的线程数量,通过acquire()获取许可、release()释放许可,确保最多指定数量的线程可同时执行,适用于限流与资源池管理。
-
当XML字符串被连续多次转义(如<)时,StringEscapeUtils.unescapeXml()仅执行单层解码;需循环调用直至无变化,或根据预期转义层数精确调用多次。
-
containsKey比get()+null判断更合适,因其能准确区分“键不存在”和“键存在但值为null”,避免误判缓存未命中;且不触发值构造或反序列化,线程安全,语义清晰。
-
Collectors.averagingInt()可在一次遍历中计算整型流平均值并返回double,需配合mapToInt()使用,空流返回Double.NaN,内部用long累加防int溢出,比手动两次遍历更高效安全。
-
Java对象生命周期始于类加载而非new,经历加载、链接、初始化三阶段;new仅分配内存并设默认值,实例构造器才完成初始化;对象存活取决于GCRoots可达性分析;GC不负责资源释放,需显式关闭。
-
默认RoundRobinLoadBalancer不支持灰度发布,因其仅依据健康状态和注册顺序轮询,无视元数据、版本号及权重;需重写choose()方法提取请求头(如X-Gray-Tag)并匹配实例元数据,再结合weight实现加权随机路由。
-
普通ThreadLocal无法在父子线程间传递值是因为其值仅绑定当前线程的ThreadLocalMap,子线程为新实例且不复制父线程值;InheritableThreadLocal通过重写createInheritedMap()和childValue(),在子线程init时浅拷贝父线程值,但仅限直接创建的子线程,不适用于线程池等复用场景。