-
CopyOnWriteArrayList.iterator()返回不可变快照,遍历基于创建时的数组副本,无法感知后续增删改操作;不支持remove()/set(),调用抛UnsupportedOperationException;读无锁、写加锁并复制数组,适用于读多写少场景。
-
能,但需满足接口定义稳定、实现类可独立打包、服务发现路径被正确扫描三个条件;JavaSPI仅支持本地classpath静态加载,不解决微服务远程发现与版本冲突问题。
-
Math.sqrt(-1)不会抛出异常或导致编译失败,而是返回NaN——这是一个符合IEEE754和Java规范的合法浮点值,因此既非语法错误,也非运行时异常;是否构成逻辑错误,取决于程序预期行为与上下文语义。
-
Queue接口是约定行为的契约,不保证FIFO但标准实现默认遵循;add()失败抛异常,offer()返回false更安全;poll()/peek()空时返回null,remove()/element()则抛异常;ArrayDeque适合单线程高性能,LinkedBlockingQueue和queue.Queue才用于多线程。
-
因为Cipher是抽象类,必须通过Cipher.getInstance()指定算法、模式和填充方式才能获取实例,直接new会因未初始化关键字段而抛NullPointerException。
-
String.regionMatches()是Java中高效局部字符串比较方法,跳过子串创建、直接字符数组比对,支持区分/忽略大小写两种重载,时间复杂度O(len)、空间复杂度O(1),需手动校验索引边界,性能显著优于substring+equals。
-
答案:比较对象时应使用equals而非==,因为==比较引用地址,equals比较内容。例如str1和str2内容相同但地址不同,==返回false,equals返回true;基本类型用==比较值,对象类型优先用equals判断逻辑相等。
-
StringTable不扩容——这是最关键的事实。它从JVM启动那一刻起就固定大小,由-XX:StringTableSize决定,后续任何阶段都不会自动增长或收缩。所谓“内存脉冲抖动”在海量配置加载场景中若与StringTable相关,根源几乎一定是哈希冲突激增导致的intern()阻塞和GC标记开销飙升,而非StringTable自身内存膨胀。
-
newThread()一用就卡,因每次创建都触发系统调用、分配8MB内核栈、切换态,1000次即耗时百毫秒且占8GB虚拟内存;CachedThreadPool无上限更危险;应使用有界ThreadPoolExecutor并合理配置参数。
-
AQS共享模式中state语义因同步器而异:Semaphore的state表示剩余许可数(越大越空闲),CountDownLatch的state表示待完成任务数(越小越接近释放线程),该差异决定tryAcquireShared返回逻辑及阻塞/放行时机。
-
本文详解如何在ApacheSpark(JavaAPI)中对嵌套数组字段(如response.indicator)执行explode操作,同时完整保留其余所有列(包括同级字段与嵌套结构),避免因展开导致数据丢失或结构坍塌。
-
类是描述一类东西的声明而非实体,它不占运行时内存,仅作为模板定义共性;实例化则分配独立状态空间,每个对象拥有独立字段但共享方法代码。
-
HashMap底层是数组+链表+红黑树的混合结构:哈希值经扰动运算后与(长度-1)按位与得索引;冲突时用链表,满足≥8节点且数组≥64则转红黑树;null键固定存于tab[0];重写equals必须重写hashCode以保证哈希一致;非线程安全,并发下易出错。
-
containsAll只检查被调用集合是否包含参数集合中每个元素,不关心顺序、重复次数或大小;适用于权限校验等存在性判断,不适用于频次一致或完全相等场景。
-
只有有向无环图(DAG)才有拓扑排序,所谓“集合的拓扑排序”实为对顶点集合V按有向边关系进行的排序;需用邻接表或Map构建图并运行Kahn或DFS算法,因邻接表空间高效、支持非连续/字符串顶点名、便于动态更新;Kahn算法中须显式初始化所有顶点入度,用merge或get-default方式安全更新,结果长度小于顶点数即表明存在环。