我是一个学习Java的C++人.我正在阅读Effective Java,有些事让我很困惑.它说从不写这样的代码:
String s = new String("silly");
Run Code Online (Sandbox Code Playgroud)
因为它会创建不必要的String对象 但相反它应该写成这样:
String s = "No longer silly";
Run Code Online (Sandbox Code Playgroud)
好吧到目前为止......但是,鉴于这个课:
public final class CaseInsensitiveString {
private String s;
public CaseInsensitiveString(String s) {
if (s == null) {
throw new NullPointerException();
}
this.s = s;
}
:
:
}
CaseInsensitiveString cis = new CaseInsensitiveString("Polish");
String s = "polish";
Run Code Online (Sandbox Code Playgroud)
为什么第一个陈述好吗?不应该
CaseInsensitiveString cis = "Polish";
我如何使CaseInsensitiveString行为String如此上述声明是可以的(有和没有扩展String)?它是什么让它能够传递像这样的文字?根据我的理解,Java中没有"复制构造函数"概念?
我目前有一个电子表格类型程序,它将数据保存在HashMaps的ArrayList中.当我告诉你这没有被证明是理想的时候,你无疑会感到震惊.开销似乎比数据本身多5倍的内存.
这个问题询问有效的集合库,答案是使用Google Collections. 我的跟进是" 哪一部分? ".我一直在阅读文档,但不觉得它非常好地了解哪个类适合这个.(我也对其他图书馆或建议开放).
所以我正在寻找能够以最小的内存开销存储密集的电子表格类型数据的东西.
我知道H2和Derby等选项,但在这种情况下我不打算使用嵌入式数据库.
编辑:如果你建议图书馆,我也很感激你,如果你能指出我在这里适用的特定的一两节课.虽然Sun的文档通常包含哪些操作是O(1)的信息,哪些是O(N)等,但我在第三方库中没有看到太多,也没有真正描述哪些类最适合什么类.
如果你有两个String实例,并且它们是相同的,那么在Java中它们将共享相同的内存.这是如何在引擎盖下实施的?
编辑:我的应用程序使用大量的String对象,其中许多是相同的.使用Java String常量池的最佳方法是什么,以避免创建自定义flyweight实现?
我的应用程序是多线程的,具有密集的字符串处理.我们正在经历过多的内存消耗,并且分析已经证明这是由于String数据.我认为使用某种flyweight模式实现甚至缓存可以大大节省内存消耗(我知道Strings经常是重复的,尽管我在这方面没有任何硬数据).
我查看了Java Constant Pool和String.intern,但它似乎可能引发一些PermGen问题.
在java中实现应用程序范围的多线程字符串池的最佳替代方法是什么?
编辑:另见我以前的相关问题:java如何实现引擎盖下的字符串的flyweight模式?
由于Java的默认字符串实习已经有很多坏消息,我正在寻找替代方案.
你能建议一个API,它是Java字符串实习的一个很好的替代品吗?我的应用程序使用Java 6.我的要求主要是通过实习来避免重复的字符串.