我们可以访问或查询 Java 字符串实习生(常量)池吗?

Posted

技术标签:

【中文标题】我们可以访问或查询 Java 字符串实习生(常量)池吗?【英文标题】:Can we access or query the Java String intern (constant) pool? 【发布时间】:2013-10-03 16:40:49 【问题描述】:

有没有办法在我们自己的程序中访问字符串常量池的内容?

假设我有一些基本代码可以做到这一点:

String str1 = "foo";
String str2 = "bar";

现在有 2 个字符串在我们的字符串常量池中浮动。有没有办法访问池并打印出上述值或获取当前池中当前包含的元素总数?

StringConstantPool pool = new StringConstantPool();
System.out.println(pool.getSize()); // etc

【问题讨论】:

常量池中会有很多很多的字符串——那些来自 JDK 类和任何依赖项。请注意,字符串池是在 类加载 时填充的,而不是在运行引用字符串常量的实际代码时。 @MarkoTopolnik 有趣的一点,我不会假设 JDK 类中定义的字符串会被加载到池中。 任何类,包括 JDK 类,一旦加载了类本身,都是如此。 【参考方案1】:

您不能直接访问String intern pool

根据JavadocsString intern pool是:

一个字符串池,最初是空的,由 类字符串。

但是,可以使用 String 的 intern() 方法将 String 对象添加到此池中。

java.lang.String.intern() 返回一个实习字符串,即在全局字符串池中有一个条目的字符串。如果该字符串尚未在全局字符串池中,则将其添加。

以编程方式您可以采用这种方法:

    声明Set<String> StringConstantPool = new HashSet<String>(); 致电String.intern() 将返回的String 值添加到此池中StringConstantPool

【讨论】:

Javadoc 在这一点上一直是错误的并且确实自相矛盾。池“最初是空的”“所有字符串文字和常量值字符串表达式都被保留”都不是真的,而且 String 类负责后者。事实上,将其描述为实习是错误的。 我相信写initially empty的意思是说当JVM加载这个池是空的。 从 OOP 的角度来看,它不仅是私有的,而且实际上是 implemented as a native method。这意味着即使使用反射也无法访问它。

以上是关于我们可以访问或查询 Java 字符串实习生(常量)池吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java访问修饰符的正确使用方式(备战2022春招或暑期实习,每天进步一点点,打卡100天,Day6)

还在频繁定义常量?不试试用枚举代替(备战2022春招或暑期实习,每天进步一点点,打卡100天,Day5)

01.Java关键字,常量,变量,数值类型

Java字符串常量池是什么?为什么要有这种常量池?

Java范例集锦

实习培训——Java基础