这两种实践中的哪一种在Java中更有效?

时间:2010-06-24 15:39:12

标签: java arrays string performance

我有一个对象数组,我知道这些元素是String类型,比如我需要多次访问它们。

  • 练习1:通过数组索引访问元素,并在每次需要时将其强制转换为String。
  • 练习2:创建本地String实例并访问每个元素一次。

哪个会运行得更快?如果它是在一个内存有限的移动设备上,这将是一个更好的做法?谢谢。

7 个答案:

答案 0 :(得分:19)

你问的是错误的问题。在知道需要优化的内容之前不要进行优化。相反,编写最清晰,最容易理解的代码,然后在知道存在问题时进行重构(并确定问题是什么)。

在这种情况下,我认为维护一个数组并根据需要将它们转换为String要容易得多。如果这是一个问题,我会重构(可能通过创建一个String数组并将对象复制到其中一次)。

答案 1 :(得分:2)

如果你知道所有元素都是String,为什么不只是创建一个String数组开始?

如果这些来自不受您控制的地方,请检查相关课程是否支持Generics;你也许可以让它以这种方式返回String数组。

答案 2 :(得分:0)

...

String s = (String)myarray[myelem_id];

不会产生本地字符串实例,而是对现有元素的引用 - 不会创建字符串的副本。所以问题归结为:不断重复(String)myarray[myelem_id]或者写一次以初始化本地参考是否更好?

第二个更容易阅读 - 只要引用具有有意义的名称,即curItem。我怀疑总体上有任何显着的性能差异,除非我有真正的,非常强大的性能问题,否则我不会对其进行基准测试(由于VM被迫进行类型检查,因此不会进行零时操作,但它不是)。

答案 3 :(得分:0)

如果您知道要多次访问相同的数据,最好避免强制转换和重新构建字符串。

答案 4 :(得分:0)

假设你不能使数组成为String []而不是Object [] ......

如果你会循环一次然后多次使用每个元素,我会写一些像......

for (int x=0; x<whatever.length; ++x)
{
  String whatever1=(String)whatever[x];

然后在整个循环体中使用what1。这意味着您只进行一次数组查找和强制转换,而不是重复进行。

(如果你没有真正循环但使用其他方法找到所需的条目,但仍然只使用每个条目一次,这同样适用。)

如果你必须多次使用其他元素处理数组的每个元素,那么将Object []复制到String []可能是有益的,例如:

String[] sWhatever=new String[oWhatever.length];
for (int x=oWhatever.length-1; x>=0; --x)
  sWhatever[x]=(String)oWhatever[x];

(你能写“System.arraycopy(oWhatever,0,sWhatever,0,oWhatever.length)”吗?我认为这样可行,但我还没试过。)

副本是否需要比演员表更长的时间取决于你必须投射每个元素的频率。我的猜测很少值得,但这是可能的。

答案 5 :(得分:0)

如果你知道类型是'always'字符串那么为什么不调用toString()方法。它总会给你实际价值......

for (int x=0; x<whatever.length; ++x)
{
    System.out.println(whatever[x].toString());
}

答案 6 :(得分:0)

假设您正在使用Java ME,根据我的经验,这一切都归结为

  1. 访问了多少个数组元素?
  2. 原始数组的大小是多少?
  3. 请记住,通过强制转换所有元素来创建另一个数组会产生负面影响(如果只访问其中的少数几个)。 另外,如果你编写代码的方式是一个数组元素只需要一次转换,那么就不会同时使用全部转换。