HashCode 与 Equals 小坑

同事问了一句:「HashMap 的 hashCode 为什么是 0?」

我猜是空 map。果然,他用的就是一个空的 HashMap。于是顺带想到经典面试题 hashCode / equals,以及 Kotlin 的 data class 在这上面容易踩的坑,整理一下。

无感而发

对朋友我一般是问什么说什么。

以前遇到过两个同事,风格很像:会问我一些敏感或技术核心的问题,我基本都说了;反过来我问他们,几乎得不到什么有用信息。从那以后我开始对别人有所保留(虽然也没保留多少),无关紧要的事倒无所谓。

Kotlin/Native 部分枚举类型在 cinterop 导出后消失

背景

腾讯 Kuikly 开源了支持鸿蒙的 Kotlin 编译器,符号导出、字符串优化和鸿蒙 NDK 适配等很有参考价值。我们当时因 Kotlin 2.0.21 的 LLVM 限制用的是 OHOS 3.x SDK,native binding 基于 3.x 头文件生成,新版本能力用不上。借鉴 Kuikly 后想改用 Clang/LLVM 12,sysroot、链接目录等改用 OHOS 5.x SDK,以用到新能力。

KSP 生成 OHOS NAPI 代码

Kotlin/Native 适配鸿蒙,除了改编译器,还有一块很重要:NAPI 桥接代码的自动生成

Kotlin/Native 和 NAPI 的关系

  • Kotlin/Native 的产物是平台二进制,在 OHOS 上就是 Linux ELF。
  • OHOS 上层用 ArkTS 开发,要调 so 里的逻辑,需要一层类似 JNI 的桥,用的就是 Node.js 那套 NAPI
  • 所以「从 ArkTS 调 Kotlin/Native」= 自己写一层 NAPI 桥。

一、为什么需要自动生成 NAPI

先看一个最简例子:K/N 里有个 hello_world(),要在 ArkTS 里调用,就要在 C++ 里注册 NAPI: