-
泛型在编译期提供类型安全,通过类型参数提升代码复用性;定义泛型类如Box<T>后需指定具体类型如Box<String>来调用;泛型方法可自动推断类型,也可显式指定;由于类型擦除,无法直接实例化T,需借助Class对象或Supplier工厂;禁止创建泛型数组如newBox<String>[],建议用ArrayList替代;核心是编译期检查与合理使用通配符、边界。
-
在Spring应用中,若将AccountValidator等有状态对象通过new实例化,会导致其依赖不可见、难以测试和管理;正确做法是将其声明为Spring管理的Bean(如prototype作用域),并通过ObjectProvider按需获取,兼顾可测性、解耦性与生命周期可控性。
-
Collections.disjoint方法用于判断两个集合是否无交集,无交集返回true。它接收两个Collection类型参数,内部通过遍历较小集合并调用contains方法检查元素是否存在,因此性能受集合实现影响,建议至少一个为HashSet等高效contains结构。空集合与其他集合视为无交集,null则抛出NullPointerException。常用于权限校验、任务分配等需数据隔离的场景,使用时需注意集合类型选择以优化效率。
-
RandomAccess是标记接口,用于标识支持高效随机访问的集合,如ArrayList,可通过索引在O(1)时间访问元素;而LinkedList不实现该接口,遍历需O(n)时间。算法根据是否实现RandomAccess选择遍历方式:实现类适合for循环索引访问,未实现类推荐迭代器遍历,从而提升性能。常见实现类有ArrayList、Vector、CopyOnWriteArrayList,未实现的有LinkedList、Stack。该接口在通用库中用于优化决策,指导高效集合操作。
-
switch分支难维护因硬编码逻辑、违反开闭原则、可读性差;策略模式通过分离算法选择与实现、每种行为独立成类来解决,新增类型只需添加实现类并注册,调用处无需修改。
-
线上压测需用CountDownLatch实现齐发式并发、CyclicBarrier支持多轮脉冲爆发、Semaphore控制瞬时并发上限,并须绕开直连生产库、未标识流量、监控缺失及无熔断等风险。
-
LocalDate.plusDays计算订单过期时间完全可靠,前提是业务规则明确且不涉及时区、时间点或跨日营业逻辑;它仅做确定性日历天加法,适合“下单后N日内有效”场景,但需注意计时起点、节假日排除及过期判断时机等业务语义。
-
synchronized通过monitorenter/monitorexit指令实现,锁信息存于对象头MarkWord;ReentrantLock依赖AQS和Unsafe的CAS/park等native方法,字节码仅体现为普通方法调用。
-
使用StringWriter+PrintWriter是捕获异常堆栈为字符串最稳妥的方式,JDK1.4+兼容,自动处理cause链和suppressed异常,且不依赖第三方库。
-
不能只用instanceof判断类型,因其破坏equals对称性;应使用getClass()确保同一具体类;ID为null时须用Objects.equals安全比较;忽略其他字段需严格依据业务契约;equals与hashCode必须一致且仅基于id。
-
default方法是向后兼容的契约演进机制,用于在不破坏现有实现类的前提下为接口新增行为,但需设计时预留扩展意识,且无法解决参数或返回类型变更等破坏性改动。
-
配置Java环境后需验证java和javac版本一致、JAVA_HOME指向JDK根目录、手动编译运行Main.java成功,再通过VSCode过渡理解classpath与package机制。
-
Class.getResourceAsStream路径以/开头才从classpath根查找,否则按当前类包路径相对查找;文件需在src/main/resources下且构建后存在于jar顶层;返回null主因是路径错误、资源未进classpath或IDE缓存未刷新。
-
SynchronousQueue无存储结构,size()恒为0,任务必须即时移交:有空闲线程则交付,否则立即创建新线程;offer()失败触发扩容,put()则阻塞等待配对线程。
-
是的,TreeSet底层基于TreeMap实现,而TreeMap使用自平衡红黑树,保证有序性和O(logn)时间复杂度,但要求元素可比较且compareTo与equals逻辑一致。