-
接口回调通过定义接口并传递实现,实现事件触发时的逻辑通知。步骤包括:定义含回调方法的接口;在目标类中持有接口引用并在事件发生时调用其方法;调用方实现接口并注册实例。例如,DataProvider通过OnDataListener通知数据就绪,Button利用OnClickListener响应点击事件。Java8后可用Lambda简化单方法接口,如setOnClickListener(btn->println(...))。结合泛型可设计通用监听器EventListener<T>提升复用性。关
-
应优先使用组合而非继承,因继承仅适用于“是”关系(如Car是Vehicle),而“有”关系(如Car有Engine)须用组合;滥用继承导致ClassCastException、空实现、维护困难等问题,且易违反Liskov替换原则。
-
DISTINCT是SQL中用于返回唯一不同值的关键字,作用于SELECT子句中所有指定列的整行组合去重,而非单列独立去重;基本语法为SELECTDISTINCTcolumn1,column2FROMtable_name;支持与WHERE、COUNT等结合使用,但忽略NULL值且可能影响查询性能。
-
StringTable是哈希表,不自动去重,仅通过字面量加载或显式调用intern()才插入条目;intern()在JDK7+存引用而非复制对象,滥用会导致哈希冲突、内存泄漏及性能下降。
-
Collections.addAll()不能初始化空集合,只能向已创建的可变集合(如ArrayList)批量添加元素;正确做法是先创建集合实例,再调用该方法。
-
ZGC采用彩色指针而非“深色指针”,其核心目标是实现亚毫秒级暂停,回收对象堆内存而非“变量”,不追求“秒级回收”。
-
Java中不能靠抛异常实现优雅退出,因为异常机制非流程控制工具,会掩盖错误、破坏调用栈、干扰监控;应使用System.exit(int)明确退出意图,或采用分层返回与外部信号协调。
-
Java字节码增强不能直接为已有对象添加属性,只能在类级别新增字段,使新创建对象拥有该字段;因对象内存布局由Class结构在加载时固定,运行时无法扩展单个对象内存块。
-
循环中调用remove()会跳过元素,因为ArrayList基于数组实现,删除时后续元素前移导致索引偏移;正向for循环需倒序遍历或使用Iterator.remove()、removeIf()等安全方式。
-
Java8引入默认方法允许接口定义具体实现,使用default关键字声明,默认方法可被实现类继承或重写。例如:publicinterfaceMyInterface{voiddoSomething();defaultvoidprintInfo(){System.out.println("这是接口的默认实现");}}实现类MyClass可直接调用printInfo()而无需重写。当类实现多个含同名默认方法的接口时,必须显式重写以解决冲突,如Impl类需重写hello()并指定A.super.hello()或B
-
Linux文件权限八进制表示(如755)本质是三个3位二进制数拼接,每位对应r=4、w=2、x=1的开关状态,天然适配位运算;755即111101101,分别表示用户rwx、组r-x、其他r-x,位或(|)添加权限、位与加取反(&~)清除权限才是安全操作方式。
-
AtomicLongFieldUpdater可用于原子更新volatilelong字段,避免对象封装开销,适用于高并发场景下的计数器、状态标志等细粒度控制,需注意字段可见性、非静态及正确初始化。
-
子线程崩溃导致应用无响应,因其静默退出使依赖状态未更新、回调未发出、资源未释放;setUncaughtExceptionHandler仅对调用它的线程实例生效,须在start()前设置,且不可捕获主线程异常。
-
ArrayList的elementData声明为transient是为了跳过JVM默认序列化,仅序列化size及有效元素,避免冗余null占位导致体积膨胀、语义失真及兼容性风险,并为自定义writeObject/readObject提供前提。
-
用StreamAPI对轨迹点距离聚合的核心是reduce滑动配对:以double[]{0.0}为累加器,每次计算a.distanceTo(b)后返回b推进链式处理;并行需慎用,仅多轨迹场景适用;预处理建议filter去噪、map转单位;可封装为Collector复用。