据我所知,如果在字符串池中找到字符串,intern方法应该从字符串池返回字符串,否则将在字符串池中添加一个新字符串对象
,并返回该字符串的引用。
String s = "a";
s = "b";
String str = new String("a").intern();
在这种情况下会发生什么。。。是否存在两种情况
String str=new String(“a”)。实习生()
执行str将引用此“a”
或者“a”永远不符合垃圾收集的条件?
Java规范没有正式禁止String
常量的垃圾回收机制,当它们包含的类超出范围时,但是任何两个内容相同的String
文字必须引用相同的String
对象,返回值的String#intern()
必须是由具有相同内容的文字所引用的相同对象。
给定的JVM是否真的从运行时常量池中垃圾收集String
对象是一个实现细节,但是,给定这些要求的String
实例的可访问性规则是,如果任何可访问变量持有对其的引用,或者如果加载了具有该文本的任何类,则常量池中的String
是可访问的。
在您的特定场景中,当:
s
和str
的第一个值,它们引用同一个对象,该对象位于常量池中)和String
常量且内容为"a"
的类都将被卸载。这在不同的JVM中是不同的。例如,
OpenJDK/Hotspot Java 6:字符串文本位于PermGen和AFAIK中,仅在完整GC上清理(而不仅仅是永久空间的主要集合)
OpenJDK/Hotspot Java 7:字符串文本位于堆中,可以随时收集它们,但我怀疑它们是由代码中使用的PermGen持有的。
OpenJDK/Hotspot Java 8:没有PermGen,所以字符串应该更自由地清理,即使由现在将在堆中的类持有。
1)只有一个字符串文字,它不会被GC'ed,直到没有引用它,也可能在cde中,这可能是当ClassLoader卸载时,如果它曾经卸载过。
2) 如果你创建的第一个“a”
和第二个“a”
和第三个都是不同的字符串,那么它们可能是不同的字符串。
问题内容: Python是否有所有字符串的池,并且在那里它们(字符串)单例? 更准确地说,在下面的代码中,是在内存中创建一个还是两个字符串? 问题答案: 字符串在Python中是不可变的,因此实现可以决定是否进行内部(这通常与C#相关联,这意味着某些字符串存储在池中)这个字符串。 在您的示例中,您正在动态创建字符串。CPython并不 总是 查看池以检测字符串是否已经存在- 这也没有意义,因为您首
问题内容: 确定字符串是否为函数结果的最佳方法是什么? https://www.php.net/manual/zh/function.serialize 问题答案: 我会说,尝试一下;-) 引用手册: 如果传递的字符串不是不可序列化的,则返回FALSE并发出E_NOTICE。 所以,你必须检查返回值是或不是 (有或,以确保不会有任何问题或或任何等于,我会说)。 只是当心通知:您可能希望/需要使用@
问题内容: 我的字符串中有双引号,因为我会这样做: 我将如何用Java做到这一点? 问题答案: 否。此类功能在Java中不可用。 从Sun 文档: 当在打印语句中遇到转义序列时,编译器将对其进行相应的解释。例如,如果要将引号放在引号内,则必须在内部引号上使用转义序列\“。要打印句子 你会写
问题内容: 但 为什么仅在分配字符串时才获得相同的id()结果? 编辑:我用“字符串”代替“ ASCII字符串”。感谢您的反馈 问题答案: 这与ASCII与非ASCII无关(您的“非ASCII”仍然是ASCII,只是标点符号,而不是字母数字)。CPython作为实现细节,将仅包含“名称字符”的字符串常量进行实习。在这种情况下,“名称字符”与正则表达式转义的含义相同:字母数字加下划线。 注意:这可以
但是 为什么只有在赋值字符串时才能得到相同的id()结果? 编辑:我将“ascii字符串”替换为“字符串”。感谢您的反馈
问题内容: 如何检查是否是那里的? 我想分配给是否有结果,否则。 我当前的代码是: 问题答案: