Java中子类返回字符串字面量与常量字符串哪个效率更高?
问题
我刚接触Java,但有过类似编程语言开发经验,本应知晓答案,但Java存在泛型这类反直觉特性,希望有人能解惑。
若我有一个基类和两个实现类,通过重写方法返回不同字符串,请问在每个子类中定义类常量,与在重写方法中直接返回字符串字面量相比,哪种方式性能更优?下方示例中,"run"的情况会为每个实例分配新字符串吗?
代码示例:
public abstract class OpBase { protected abstract String getOpType(); public OpBase(){ Logger.info(getOpType()); } }
public class WalkOperation extends OpBase { protected String getOpType() { return "walk"; } }
或
public class RunOperation extends OpBase { private static final String OP_TYPE_RUN = "run"; protected String getOpType() { return OP_TYPE_RUN; } }
解答
- 性能上无实质差异:两种写法在运行时性能几乎完全一致。Java的字符串常量池机制会自动缓存所有字符串字面量,不管是直接返回
"walk",还是返回静态常量引用的"run",最终指向的都是常量池中的同一个字符串实例,不会产生额外的对象创建开销。 - 不会为每个实例分配新字符串:示例中返回
"run"的场景,绝对不会重复分配字符串。"run"作为字面量会在类加载阶段被存入字符串常量池,静态常量OP_TYPE_RUN只是对这个池内实例的引用;直接返回"walk"时,同样是引用常量池中的已有实例,每次调用getOpType()都不会创建新对象。 - 写法选择看场景:如果这个字符串需要在类的多个地方复用,或者想明确标记它是一个业务常量,用静态常量的写法更具可读性和维护性;如果只是方法内唯一的返回值,直接返回字面量会更简洁。二者的性能成本没有本质区别。
内容的提问来源于stack exchange,提问作者Colm
相关产品推荐
相关产品推荐

