-
CGLIB必须生成子类因其基于字节码继承机制,通过ASM动态创建目标类的非final子类并重写方法;JDK代理仅实现接口,不依赖目标类结构,故无需继承且不受final限制。
-
答案:PriorityQueue是基于堆的优先级队列,默认为最小堆,用于高效获取极值,适用于任务调度、TopK等问题;它不保证全局有序,允许重复元素,添加和删除操作时间复杂度为O(logN),但remove(Object)效率低,遍历时无序,需用poll()按序取出;自定义排序可通过Comparator实现,如最大堆或对象字段排序;注意初始容量设置、不可变排序字段、非线程安全及禁止null元素,与TreeSet相比更适用于仅关注极值的场景。
-
首先设计Order和OrderItem等核心类,再通过OrderService实现订单的创建、查询与状态更新,结合业务流程计算总价并处理数据持久化,最后扩展数据库支持与异常处理。
-
必须用volatile修饰静态实例变量,否则多线程下可能拿到未初始化完成的对象;因为JVM创建对象的三步(分配内存、调用构造函数、赋值引用)可能重排序,导致其他线程看到半初始化状态。
-
MixedGC触发需先满足堆占用超InitiatingHeapOccupancyPercent(默认45%)以启动并发标记,完成后才可能执行;其回收老年代Region数量由G1MixedGCCountTarget、G1OldCSetRegionThresholdPercent及MaxGCPauseMillis动态调控,非固定或全量清理。
-
重量级锁是线程被操作系统挂起并用MutexLock排队的锁机制,触发用户态到内核态切换,开销达数百纳秒至微秒级;表现为jstack中大量BLOCKED线程停在ObjectMonitor::enter或park,且CPU低、吞吐骤降。
-
Java网络编程中的Socket通信是两台机器或同一机器上进程间通过网络交换数据的方式,其核心在于ServerSocket和Socket两个类。1.服务器端创建ServerSocket对象监听端口,调用accept()等待客户端连接,获取Socket后通过输入输出流传输数据,完成后关闭资源;2.客户端创建Socket连接服务器IP和端口,同样获取流进行数据交换并关闭资源。Socket通信是所有网络协议和框架的基础,提供了直接的网络控制能力,有助于理解上层框架原理,并提升对并发和阻塞的理解。实际项目中可通过
-
extends是Java中声明类单继承的唯一关键字,仅用于类声明且只能继承一个父类;接口用extends支持多继承,类实现接口则用implements。
-
Timestamp转Date会丢失纳秒精度吗不会丢失,但Date本身不存纳秒——它只精确到毫秒。当你调用newDate(timestamp.getTime()),拿到的是截断纳秒后四舍五入到毫秒的值,比如2024-01-0112:00:00.123456789会变成2024-01-0112:00:00.123。实操建议:如果业务只要求毫秒级(比如日志时间、普通报表),直接用timestamp.getTime()构造Date没问题如果下游依赖纳秒(如金融交易流水号生成、分布式事件排序),别转
-
答案:Java中通过NIO.2遍历文件系统并监听变化,结合Lucene建立倒排索引实现高效搜索。首先使用Files.walkFileTree或walk()递归扫描目录,过滤无效文件;利用WatchService监控增删改操作以维护增量索引;接着将文件路径、名称、内容等信息构建成Document写入Lucene索引,选用StandardAnalyzer分词;查询时通过QueryParser解析关键词,用IndexSearcher检索并返回TopDocs结果;建议多线程加速扫描、限制索引范围、区分文本与二进制
-
clone()不一定能防住外部修改,因为其默认为浅拷贝,仅复制引用地址而非实际内容;含可变引用(如ArrayList)时需手动深拷贝,数组宜用Arrays.copyOf(),集合返回应避免直接暴露内部引用。
-
Java二维数组传参传递的是外层数组对象的引用,修改元素或某行引用会影响原数组,但重赋值参数变量无效;需深拷贝才能隔离修改。
-
用纯文本每行存一条记录(如playerName,2450,2024-05-1214:22),追加写入需newFileWriter("scores.txt",true),读取后split解析并try-catch处理异常,排序后截取前10名覆写文件。
-
银行账户应封装为责任明确的实体,余额字段须private,仅通过deposit()和withdraw()校验后修改,构造方法拒绝负初始余额。
-
Java并发编程核心是安全共享状态;start()创建新线程执行run(),直接调用run()仅为普通方法调用;volatile仅保证可见性不保证原子性;synchronized锁的是指定对象实例;submit()返回Future支持结果与异常处理,execute()则不。