-
浅拷贝只复制顶层结构,嵌套对象共享引用;深拷贝递归复制所有层级,完全独立互不影响。核心差异在于是否切断引用链,浅拷贝修改嵌套内容会同步影响原对象,深拷贝则不会。
-
首先检查java.io.tmpdir系统属性指向的临时目录是否存在且可写,通过System.getProperty("java.io.tmpdir")确认路径有效性;若路径无效或权限不足,需在启动时用-Djava.io.tmpdir指定有效目录,并确保该目录具备读写权限;其次验证操作系统默认临时目录(Windows为C:\Windows\Temp或用户Temp,Linux/macOS为/tmp)是否存在且权限正确,Linux下应为1777权限,可通过sudochmod1777/tmp修复;同时检查Wind
-
StringTokenizer通过传入含所有分隔符的字符串,将每个字符视为独立分隔符,适合解析混用分隔符的遗留文本;默认跳过空字段,需保留时应改用split;遍历时应先获取countTokens再循环以避免竞态。
-
最可靠的方式是通过类的ProtectionDomain获取CodeSource再提取getLocation(),因其由JVM加载时明确记录来源,语义严谨稳定;Class.getResource("/")易受classloader、fatjar或模块化影响而返回null或不准确。
-
本文详解Javasynchronized的锁作用域本质:它仅作用于被显式指定的单个对象实例的内在锁(intrinsiclock),绝不会递归或隐式地锁定该对象内部持有的其他引用对象;理解这一点是避免并发误用和设计正确线程安全类的关键。
-
containsAll只检查被调用集合是否包含参数集合中每个元素,不关心顺序、重复次数或大小;适用于权限校验等存在性判断,不适用于频次一致或完全相等场景。
-
Unsafe不适合做本地内存缓存,因其不管理生命周期、无并发安全、无地址校验,易致崩溃、泄漏及JVM兼容性问题;应选用ByteBuffer.allocateDirect、VarHandle、MemorySegment或Chronicle-Bytes等安全方案。
-
abstract类必须被继承才能实例化,不能直接用new创建对象;它可含普通方法、静态方法、构造器等,但抽象方法无方法体且不能为private/final/static;子类须实现全部抽象方法或声明为abstract;与interface相比,abstract类支持代码复用和“is-a”关系,而interface适合“can-do”能力及多实现。
-
类初始化先于对象初始化,静态成员和静态代码块在类加载时执行且仅一次;创建对象时,先父类后子类,依次执行静态初始化、实例初始化和构造函数。实例初始化块用于共用逻辑,构造函数处理参数化初始化,合理使用可避免重复代码和状态错误。
-
是,调用私有方法前必须调用setAccessible(true),否则抛IllegalAccessException;这是JVM访问控制检查所致,与类加载器和模块系统无关。
-
LockSupport的线程挂起与唤醒依赖线程私有的permit状态(0或1),unpark设为1可预发,park检查并消耗;permit由JVM在native层维护,非public变量,原子且天然可见,但不保证共享变量同步。
-
Future.get()必须带超时参数,否则会无限阻塞;cancel(true)仅对可中断任务有效;CompletableFuture回调需避免同步阻塞;异常需显式调用get()或handle()才能捕获。
-
答案:预防NullPointerException需从主动判空、使用Optional、参数校验和工具辅助入手。1.使用前判断对象是否为null,尤其针对外部传入数据;2.优先用常量调用equals避免空指针;3.利用Java8Optional类优雅处理可能为空的对象;4.通过Objects.requireNonNull进行方法参数校验;5.借助IDE警告和静态分析工具如SpotBugs提前发现隐患。养成良好编码习惯可有效避免程序因空指针异常而崩溃。
-
Collectors.partitioningBy用于内存中轻量级黑名单预筛,通过分组快速分离拦截与放行请求;需配合显式拦截动作(如抛异常、记日志),不替代网关或风控系统。
-
Stream.iterate()的终止条件在Java9+中通过三参数重载(seed,Predicate,UnaryOperator)显式指定,Predicate判断当前值是否继续;Java8中无此重载,只能用limit()预设次数或手动截断。