-
Java处理文件压缩与解压的核心是使用java.util.zip包,支持ZIP和GZIP格式;1.压缩文件或文件夹使用ZipOutputStream,遍历文件并通过addToZip方法写入压缩流;2.解压使用ZipInputStream逐个读取ZipEntry并写入目标路径;3.GZIP格式通过GZIPOutputStream和GZIPInputStream实现单个文件的压缩与解压;4.处理大文件时优化缓冲区大小(如8KB-64KB)、使用Buffered流、合理利用多线程和NIO;5.TAR格式需借助A
-
LockSupport.unpark能精准唤醒指定线程,关键在于其基于permit机制:unpark发放许可,park消费许可,许可可预存不丢失;而notify/notifyAll依赖同步块和等待队列,易信号丢失且无法指定目标。
-
CarrierThread是JVM复用的OS平台线程,用于承载多个虚拟线程执行;虚拟线程仅在运行时临时挂载其上,遇I/O等阻塞即卸载并复用该线程,非一对一绑定。
-
实现轻量级IoC容器自动发现Bean的核心是准确扫描包下所有类:先用线程上下文类加载器获取file/jar资源,解码路径,再分别通过File或JarFile遍历.class文件,过滤内部类/接口/枚举,识别@Component及其派生注解,生成BeanDefinition并注册;最后实例化与依赖注入完成闭环。
-
SpringBoot应用需要配置HTTP安全头部来增强浏览器端的安全策略,有效防御XSS、点击劫持、MIME嗅探等常见Web攻击。1.X-Content-Type-Options:nosniff防止浏览器猜测MIME类型,避免恶意脚本执行;2.X-Frame-Options:DENY或SAMEORIGIN阻止页面被嵌入iframe,防范点击劫持;3.X-XSS-Protection启用浏览器内置XSS过滤;4.HSTS强制HTTPS访问,防止SSL剥离;5.CSP通过白名单机制阻止非法资源加载,是防御XS
-
String.length()返回char个数,String.codePointCount()返回Unicode码点数;因UTF-16中代理对(如emoji、部分汉字)占2个char,故二者结果可能不同。
-
标记清除算法导致老年代内存碎片的核心原因是只回收垃圾对象而不移动存活对象,使空闲空间离散分布;老年代对象长期存活、数量多且体积大,无法采用复制算法,只能就地标记清除,最终因缺乏连续空间而频繁触发FullGC甚至OOM。
-
重写clone()仍为浅拷贝,因Object.clone()仅复制字段值,对引用类型不递归拷贝;需手动深拷贝可变引用字段,否则修改副本会影响原对象。
-
volatile通过强制每次读取从主内存加载、每次写入立即刷回并使其他缓存失效,解决“修改不可见”问题;但它不保证复合操作原子性,也不能替代synchronized处理多步逻辑或状态协同。
-
字符串转数字前必须先校验合法性,避免直接解析抛异常;推荐用正则粗筛或ApacheCommonsNumberUtils等成熟工具,并注意各语言特性差异。
-
getDeclaredConstructor()找不到私有构造函数最常见的原因是参数类型不匹配(如int.class与Integer.class混淆)或目标构造器不在当前类声明中;必须用setAccessible(true)才能调用,且需注意Java9+模块封装和Android兼容性问题。
-
CompressedClassSpace是JVM中专用于存储压缩Klass指针的固定大小内存区域(默认1G),与Metaspace分离;其OOM表明该区域耗尽,常见于动态代理频繁、类加载器泄漏场景。
-
浮点数比较必须用带精度的断言,裸写==几乎总是错的,因IEEE754二进制表示存在固有精度损失(如0.1+0.2≠0.3),且编译器优化、平台差异等会放大偏差;iOS应使用XCTAssertEqualWithAccuracy,Pytest用pytest.approx,JUnit需借助AssertJ等第三方库;误差值须为正、匹配数值量级,避免整数隐式转换、单位混淆或未mock随机源。
-
groupingBy嵌套summarizingInt不能直接两层因后者返回IntSummaryStatistics而非Collector;正确做法是外层groupingBy分组、内层summarizingInt统计,结果为Map<String,IntSummaryStatistics>。
-
new出来的对象不一定在堆上,因逃逸分析可判定其是否逃逸:未逃逸时JVM可栈上分配或标量替换;方法逃逸或线程逃逸则必须堆分配。