我有一个静态10K文件,每行都有一个单词。我需要创建一个包含所有单词的String []数组。我有两个选择:
现在,我的问题是,在完成所有这些操作后,正在从数组1中访问一个单词(注意 final 关键字)明显快于数组2中的单词(没有final关键字,因为我们在运行时加载单词)。从理论上讲它有所作为吗?我们在这里谈论的是Android,而不是Java。但我对这两种情况都感兴趣。
答案 0 :(得分:2)
通用Java:
JVM中没有用于数组初始化的字节码,因此编译器最终会为每个数组项生成单独的赋值语句,这会使代码膨胀。有关详细信息,请参阅here。
根据您拥有的数据量,从文件加载值是最有效的方案。数组是否被声明为final是无关紧要的,因为字符串本身是不可变的。
<强>机器人:强>
DVM通过添加初始化数组的指令改进了JVM。所以你没有相同的代码膨胀问题。
也就是说,从文件加载东西可能是最灵活的方法。如果正确完成,您可以在必要时加载来自多个文件的值,甚至可以通过Internet加载。
答案 1 :(得分:0)
我认为没有明显的区别。当你访问它们时,它们中的两个将只是2个String数组,所以......
答案 2 :(得分:0)
如果您在构造函数中指定关键字,我相信您可以将关键字标记为static或final。因此,请确保您在静态类的构造函数中读取该文件。 (我不是100%确定Java有静态构造函数,但在C#中它可以工作,而且两者通常非常相似)。
即使你不能做到这一点,我仍然会阅读10k文件。读取字符串[]永远不会真的很贵。编译器通常会对标记为final的成员执行的任何优化技巧都可以在Java JITTER运行时在注意到字符串[]不再被更改时完成。
答案 3 :(得分:0)
使数组最终不会使其元素成为最终。与C ++相比,这是Java的缺点之一。唯一的实际效果是优化器和混淆器。根据你的描述,我很确定没有明显的区别。