-
类是模板,不占内存也不执行操作;对象是类的实例,占用内存并能调用方法执行具体动作。一个类可创建多个独立状态的对象,类定义结构,对象体现具体值与行为。
-
Timer+TimerTask适合轻量单次闹钟但线程不安全,应改用ScheduledExecutorService;时间计算用Java8+API避免时区误差;UI操作须切回EDT,音频播放需注意线程安全与平台兼容性。
-
MarkWord的锁标志位位于对象头前8字节(64位JVM)中一个4-bit字段,与GC年龄、哈希码、偏向线程ID共用同一内存区域,通过位运算动态复用,其值需用jol工具或JVM诊断参数实时观测。
-
2026年初国内高质量Java自学网站包括:入门选how2j.cn与自学精灵(way2j.com);查文档用Oracle官方教程和StackOverflow;练手用LeetCode力扣与LintCode;拓展选并发编程网与Baeldung。
-
Java成品形态取决于技术栈与部署环境:桌面端可用JavaFX/Swing打包为exe/dmg/deb,后端多为SpringBoot可执行jar,AndroidApp底层仍依赖Java,嵌入式场景需适配JVM限制与信创环境。
-
Java7+的switch对String不是语法糖,而是编译器生成查找表并结合hashCode()与equals()双重校验;所有case必须是编译期常量,null值仍抛NPE,性能优于if-else但弱于intswitch。
-
静态方法不能被覆盖,只能被隐藏Java里没有“静态方法覆盖”这回事——override只适用于实例方法。子类声明同名、同参数、同返回类型的static方法时,实际是**隐藏(hiding)**了父类方法,不是重写。关键区别在于:调用哪个版本,取决于**引用类型**(编译时类型),而不是对象实际类型(运行时类型)。如果用Parentp=newChild();,再调用p.staticMethod(),执行的是Parent.staticMethod()如果用Childc=newChil
-
ConcurrentHashMap的get不加锁也能安全,是因为Node的val和next字段为volatile,借助JVM内存模型的happens-before保证可见性,单次读取原子且无需锁;全程仅三次内存访问,遇扩容自动查新表。
-
可见性是指线程修改共享变量后其他线程能否立即看到该修改;因JMM中线程工作内存与主内存分离,且存在缓存、优化和重排序,导致修改未及时同步,从而引发可见性问题。
-
retainAll本质是原地保留交集,直接修改调用方集合;需浅拷贝保原集合、确保equals/hashCode正确实现;参数为null抛NPE;性能优化关键在于将参数转HashSet以使contains达O(1)。
-
Future.get()默认阻塞,需用超时重载或isDone()判断;抛出InterruptedException、ExecutionException、TimeoutException须分别处理;禁在UI/Servlet主线程调用;cancel()不保证资源清理,任务需自行响应中断。
-
SpringBoot应用部署后大文件(>100MB)上传返回503错误,请求甚至未到达控制器——根本原因常是multipart功能未显式启用,而非仅配置大小限制。
-
逻辑运算符用于布尔操作,包括逻辑与(&&)、或(||)、非(!)。&&要求两边均为true结果才为true,具有短路特性,左侧为false时右侧不执行;||只要一边为true结果即为true,左侧为true时短路;!用于取反,优先级最高。注意区分&与&&,避免副作用操作,混合使用时加括号确保优先级正确。
-
不可变类通过final修饰类和字段确保状态不可变,如Person类;需对可变对象进行防御性拷贝,如ImmutableDate中复制Date对象;不提供setter或修改方法,仅保留getter;构造函数避免this引用泄露,保证初始化安全。String和Integer是典型示例。
-
Collections.copy()方法将源列表元素复制到目标列表,要求目标列表长度不小于源列表。示例中使用Arrays.asList初始化目标列表大小,避免IndexOutOfBoundsException。关键点:目标列表必须预先具备足够容量,否则抛异常;元素被覆盖但长度不变。常见错误是目标列表为空或过短,需通过初始化占位符修正。适用于ArrayList等List实现,不适合Set、Map。性能好但依赖目标列表就绪,适合固定结构列表的批量更新。