You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中object与companion对象内存使用差异及Android性能对比

Android平台下两种Kotlin常量存储方案的内存对比

先明确核心前提:const val是编译期常量,编译阶段就会把所有引用它的代码替换成对应字面量,所以常量本身不会在运行时占用额外内存。两者的内存差异只来自于它们所在容器(companion object和object)的初始化与加载逻辑。

两种容器的内存特性

  • class B的companion object:
    它是B类的静态内部类,只有当B类被JVM加载时,这个companion object才会被初始化并创建单例实例。如果代码中从未使用过B类,该companion object根本不会被加载,自然不占用内存。一旦加载,它的实例就是一个空的单例对象(内部仅存的const val已被编译替换),占用内存极小。

  • object C:
    这是Kotlin的顶级单例对象,遵循懒加载规则——第一次访问C或VALUE_TWO时才会初始化。初始化后,单例实例会一直驻留内存直到进程结束。同样,若从未访问过C或VALUE_TWO,它也不会被加载,不占内存。

内存性能与占用对比

  1. 仅访问其中一个常量的场景:
    无论访问VALUE_ONE还是VALUE_TWO,对应的容器都会被加载并创建单例实例,两者的内存占用几乎无差异——都是一个空单例对象的内存开销,在Android平台上可忽略不计。

  2. 两个常量都被访问的场景:
    此时B类的companion object和object C都会被加载,总内存开销是两个单例实例的大小,但依然属于极小量级,不会对应用性能产生影响。

  3. 从未访问某个常量的场景:
    未被访问的常量对应的容器不会被加载,完全不占用内存。

关于你的判断

你认为VALUE_TWO的表现优于VALUE_ONE,其实在内存层面两者没有本质优劣。如果B类本身还有其他业务用途,那companion object的内存开销是附带的,无需额外顾虑;如果B类仅为存放这个常量而存在,object C的写法更简洁直观,但内存上没有优势。

内容的提问来源于stack exchange,提问作者Mason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:17:16