存储字符串:来自外部存储的最终类与文件

时间:2014-02-09 04:40:53

标签: java file

我正在构建一个Java程序。我有一个人名列表,用于检查一个单词是否是一个名字。我不知道是否应该将这些名称存储在外部文件中,或者将它们作为最终类中的公共静态字段放置? 现在我的名单只有1000个名字,但如果它达到100.000项呢? 谢谢你的帮助!

编辑 - 我真的不想使用类似数据库的东西,因为在其他机器上执行时需要其他安装。一个简单的txt文件听起来不错但是为了检查单词名称,我仍然需要将所有列表项(比如10,000个名字)加载到我的程序中并搜索名称,这让我有点困惑:如果它比上述方式更好预定义的最终类中的常量数组。你能帮我找出一种有效的方法吗?

3 个答案:

答案 0 :(得分:1)

在代码中使用字符串没有编程好处,因此将数据外部化到数据库。

然而,即使是一个平面文件也是一个“数据库”或排序,所以我会把加载名称的任务放在一个接口后面,并让实现决定如何加载数据:

一些实施选项是:

  • 返回硬编码值
  • 从文件中读取值
  • 从SQL数据库中读取
  • 从NoSQL数据库中读取
  • 从网络服务中读取

选择最适合您的实施 - 如果您以后需要,可以轻松更改。

示例界面:

public interface NameLoader {
    public List<String> getNames();
}

让您的主程序使用其中一个并使用工厂方法提供实现:

public class NameLoader() {
    public NameLoader createNameLoader() {
        // code the implementation you're currently using here
        return new FileBasedNameLoader();
    }
}

您可以进一步将该类外部化,以通过Spring或属性文件等使用。

答案 1 :(得分:0)

任何超过100个或更多字符串的东西我会建议某种形式的数据库或其他存储数据的方法..如果当前1000的名称数组可能会增大或缩小大小..那么你最好想要一个数据库所以每次输入/查询/编辑完成后,您不必修改程序。

如果您试图保持应用程序本身非常基本,并且不希望产生类似SQL或其他数据库的东西..您可能希望查看平面文件数据库或沿着这些行。

编辑 - 即使像* .txt文件一样简单,如果做得正确,也可以简单有效地使用逗号分隔的数组及其中的所有名称。

答案 2 :(得分:0)

使用某种外部持久性机制;例如文件,数据库等。有很多方法可以做到这一点,最好的方法取决于您(完整)应用程序的要求。

  

现在我的名单只有1000个名字,但如果它最多可达10万件呢?

嗯,现在,它会起作用(有点)。但是当你扩展时,你将开始遇到JVM规范强加的硬限制。例如:

  • 常量池中的常量数(例如字符串文字)存在硬性限制。
  • 单个方法或构造函数的大小存在硬性限制。 (这包括执行类静态初始化的合成方法。)

“代码中的硬连线列表”方法的另一个问题是,每次更改列表时都需要编辑源代码并重新编译它。这对于生产质量体系来说是不切实际的。


  

一个简单的txt文件听起来不错....

如果你不需要数据库的力量;见下文。

  

...但是为了检查单词名称,我仍然需要将所有列表项(比如10,000个名字)加载到我的程序中......

这是正确的。但这几乎不是问题!您应该能够在10行左右的代码中实现文件加载。并且它不应该比在类文件中嵌入数据慢得多。 (毕竟,类加载器必须读取整个类文件并将所有嵌入数据转换为实际的String对象。)

  

...并搜索姓名

但是,如果您将名称列表硬连接,则没有什么不同。您必须在列表中搜索它是从文件加载到数组/列表中,还是从代码中的一堆字符串文字创建并初始化数组/列表。

  

这让我有点困惑:如果它比上面提到的最终类中预定义的常量数组的方式更好

是的。由于上面列出的原因以及其他答案。


记录:

  • 如果您需要重复搜索您的长名单,那么将它们加载到HashSet会更好(更有效)。这样可以缩短搜索时间。

  • 如果您只需要进行少量搜索和/或如果列表真的大,那么数据库就更有效率了。它将具有快速搜索时间,并且它将避免将整个数据集读入内存。