首页 / JAVA / Java字符串池相关的疑问
Java字符串池相关的疑问
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java字符串池相关的疑问,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1715字,纯文字阅读大概需要3分钟。
内容图文
我试图了解字符串池是如何工作的.我已经浏览了许多站点,最后我现在更加困惑了.让我在这里放下我的怀疑.有人帮助我了解它们.
1)字符串池在哪里存在?在堆还是在方法区域?
2)字符串s =“ Hello world”; -这足以创建一个字符串.由于字符串是不可变的,一旦创建了字符串就无法更改,那么使用
String s = new String(“ Hello World”)吗?
虽然它会强制JVM在堆中而不是在字符串池中创建一个新的String对象,但是对新的String对象强制JVM有什么要求呢?
3)何时以及如何收集垃圾字符串?
提前致谢.
解决方法:
在Java中,字符串管理的实际实现不应该是必然的,除非保证:
>字符串x =“ hi”;字符串y =“ hi”; //保证x == y
>字符串x =“ hi”;字符串y =新的String(“ hi”); //虽然=!虽然没有可能保证!=
>字符串x =新的String(“ hi”);字符串y =新的String(“ hi”); //保证!=但x.equals(y)
>字符串x =“ hi”;字符串y =新的String(“ hi”).intern(); //保证x == y
这些是字符串的规则.
过去(这将随Java8改变),在内存模型的PermGen空间上分配了String.intern()和String常量(String x =“ hi”).
结果,它们具有不同的GC机制,即使您有很多可用的堆空间(PermGen通常小于或小于128MB),使用String.intern()仍可能耗尽内存.
否则,使用新String(….)分配的字符串在常规堆上,并且具有标准的GC机制.
至于为什么您/我们使用新的String(“ …”)创建String的新实例,我只能想到一个地方只有这样做才有意义,也就是说,如果有人想使用结果对象作为同步锁.这在调试事物时可能是有意义的…..但意义不大.您必须使用“ new”,以便您不会无意中使用与其他一些用于同步的代码相同的String对象.
在一般的Java编码实践中,我通常没有看到人们使用新的String(“ ….”).现实情况是,人们通常只使用字符串连接运算符等.但这并不意味着执行新的String(…)是错误的.
当我查看String的源代码时,我发现代码在很大程度上依赖于String是不可变的.因此,例如,new String(new String(“ hi”));仅创建一个char数组,并且在两个String实例中共享它. (并且内部实例无论如何都会被GC).
内容总结
以上是互联网集市为您收集整理的Java字符串池相关的疑问全部内容,希望文章能够帮你解决Java字符串池相关的疑问所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。