java - 如果与 new 一起使用,intern() 会创建多少个对象?
问题描述
我了解 java 中 intern() 的内部工作。它将开始引用字符串池区域对象。但是当我们将 inter() 与 new 一起使用时,它是否仍然在堆中创建一个对象并且引用现在指向池对象?还是它根本不会创建任何堆对象?
String s1 = new String("hello").intern();
比如上一行,当使用intern时,是不是只在字符串池中创建一个对象并引用它?还是在堆中创建一个对象,在池中创建一个对象,然后开始引用池对象,从而将对象留在堆中进行垃圾回收?
解决方案
在 Oracle/OpenJDK 中,它不会创建任何对象,但是,这取决于实现。
该方法intern()
要么返回现有对象,在这种情况下,原始“Hi”或用于调用的字符串intern
但是当我们将 inter() 与 new 一起使用时,它是否仍然在堆中创建一个对象并且引用现在指向池对象?
字符串文字仍在堆中。没有移动任何内容以将其添加到此池中
比如上一行,当使用intern时,是不是只在字符串池中创建一个对象并引用它?
这只是创建一个对象,包装原始 String 文字的char[]
or byte[]
。将intern
返回原始字符串文字。
还是在堆中创建一个对象,在池中创建一个对象,然后开始引用池对象,从而将对象留在堆中进行垃圾回收?
字符串字面量池是在本机内存中实现的,不是由对象组成的。
为了比较,这个对 intern() 的调用将新字符串添加到concat
在运行时计算的文字池中。
String hi = "h".concat("i").intern();
这没有任何作用,因为+
是在编译时计算的。
String hi = ("h" + "i").intern();
推荐阅读
- reactjs - 反应原生导航到特定帖子的 ID
- python - 确定 Numpy SVD 中奇异值 V 中的对应列
- ruby-on-rails - 故事中的 NoMethodError#show
- android - Android:使用 Firebase 实时数据库跨多个客户端同步 CountDownTimer
- case - modelsim 命令在 Verilog 测试平台中选择特定测试
- django - Django 中有没有办法测试在 request.META 或 request.COOKIES 中发送的 Cookie 是否为 httpOnly?
- python - 通过python将字典附加到EXCEL文件中
- javascript - 从随机文件夹中选择一个随机文件
- python - 如何在python中用epoll()替换select()?
- html - 在 HTML 视图框中缩放 SVG