-
用原生Servlet+JDBC+JSP可构建最小可行博客系统,需手写路由、SQL防注入、Session鉴权等核心逻辑,避免过早引入SpringBoot等框架掩盖关键链路。
-
ReentrantReadWriteLock通过读锁共享、写锁独占机制显著提升高读低写场景性能;适合配置中心等读多写少场景,支持重入和锁降级,但不可读锁升级写锁,非公平模式默认吞吐更高。
-
首先选择EclipseAdoptium等OpenJDK版本,在官网下载macOS对应架构的.pkg安装包,双击安装后JDK会自动存放到/Library/Java/JavaVirtualMachines/目录,通过终端运行java-version验证安装是否成功,随后推荐配置JAVA_HOME环境变量:编辑~/.zshrc文件,添加exportJAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home及PATH引用,保存后
-
HashMap基本声明需配对泛型,推荐用Map<String,User>userMap=newHashMap<>();,避免类型擦除导致ClassCastException;支持一个null键和多个null值;遍历时优先entrySet()提升性能;初始化时预估容量可减少扩容开销。
-
Stream.concat()按输入顺序拼接流,但处理顺序需依赖串行流+forEachOrdered等有序操作保障;多流合并应显式sequential()、避免并行化及无序中间操作。
-
首选传统for循环(需索引或中途跳出)、增强for循环(只读值且非空)、Arrays.stream()(需链式操作);三者依需求选,不盲目追新。
-
Java中wait、notify、notifyAll是Object类提供的线程协作方法,必须在synchronized块中调用,分别实现线程等待、随机唤醒一个线程、唤醒所有等待线程,且需配合while循环、状态更新后通知、同一锁对象使用以确保正确性。
-
final修饰的变量必须在声明时或构造中完成初始化,它表示“只能赋值一次”,而非“声明即冻结”;实例变量需在声明处、实例初始化块或每个构造函数中赋值,静态常量用publicstaticfinal,局部final变量可延迟赋值但须确保使用前已初始化。
-
throw用于方法体内抛出异常对象,throws用于方法签名声明可能抛出的受检异常类型;前者后接异常实例,后者后接异常类名,且仅受检异常强制要求声明。
-
TransferQueue是强制“手递手”交付的队列,适用于RPC绑定、任务委派等需零缓冲低延迟场景;非必需时勿替代BlockingQueue,否则易致阻塞和吞吐暴跌。
-
default方法是向后兼容的契约演进机制,用于在不破坏现有实现类的前提下为接口新增行为,但需设计时预留扩展意识,且无法解决参数或返回类型变更等破坏性改动。
-
在SpringBoot控制器中,可通过CompletableFuture或@Async轻松实现“立即响应+后台执行”的分离模式,无需引入Kafka等消息中间件,适用于非关键、低耦合的异步逻辑(如社交账号探测、日志埋点、缓存预热等)。
-
AtomicStampedReference不自动解决ABA,而是通过版本号使ABA可检测;必须用get(int[])原子获取最新引用与stamp,每次compareAndSet前重读,不可硬编码或缓存stamp,否则CAS因stamp不匹配而失败。
-
扩容无需重算hash值,因容量恒为2的幂次方,新索引仅取决于原hash在新增bit位的值;JDK1.8用e.hash&oldCap快速提取该位,0则留原索引,非0则原索引+oldCap。
-
CopyOnWriteArraySet不适合配置热更新,因其读取存在延迟、写入开销大、不保证原子性与一致性,且缺乏版本控制和监听机制;推荐用不可变配置+AtomicReference原子切换。