Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这两种实践中哪一种在Java中更有效?_Java_Arrays_String_Performance - Fatal编程技术网

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

这两种实践中哪一种在Java中更有效?,java,arrays,string,performance,Java,Arrays,String,Performance,我有一个对象数组,我知道元素是String类型的,比如说我需要多次访问它们 练习1:通过数组索引访问元素,并在每次需要时将其转换为字符串 实践2:创建本地字符串实例并访问每个元素一次 哪个跑得更快?如果是在内存有限的移动设备上,哪一种做法会更好?谢谢。你问错问题了。在知道需要优化的内容之前不要进行优化。相反,编写最清晰、最容易理解的代码,然后在知道存在问题(并且确定了问题是什么)时进行重构 在这种情况下,我认为维护一个数组并根据需要将它们转换为字符串要容易得多。如果这是一个问题,我会重构(可

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

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

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

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

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

String s = (String)myarray[myelem_id];
不会生成本地字符串实例,而是对现有元素的引用——不会创建字符串的副本。因此,问题归结为:不断重复
(String)myarray[myelem\u id]
还是编写一次来初始化本地引用更好


第二个更容易阅读-只要引用有一个有意义的名称,即
curItem
。一般来说,我怀疑是否存在任何显著的性能差异,除非我有非常非常严重的性能问题(强制转换不是零时间操作,因为VM必须进行类型检查,但速度并不慢)。

如果您知道要多次访问同一数据,最好避免对字符串进行强制转换和重新强制转换。

如果您知道所有元素都是
String
,为什么不首先创建一个
String
数组呢


如果这些来自不受您控制的地方,请检查所讨论的类是否支持泛型;您可以让它以这种方式返回一个
字符串
数组。

假设您不能使数组成为字符串[]而不是对象[]

如果您将循环一次,然后多次使用每个元素,我将编写如下内容

for (int x=0; x<whatever.length; ++x)
{
  String whatever1=(String)whatever[x];
(你能写“System.arraycopy(oWhatever,0,sWhatever,0,oWhatever.length)”吗?我想这会管用的,尽管我还没试过。)


复制是否需要比强制转换更长的时间取决于必须强制转换每个元素的频率。我的猜测是,这几乎不值得,但这是可能的。

如果您知道类型是“始终”字符串,那么为什么不调用toString()方法呢。它将始终为您提供实际价值

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

for(intx=0;x假设您正在使用javame,根据我的经验,这一切都归结为

  • 可以访问阵列的多少个元素
  • 原始阵列的大小是多少
  • 请记住,通过强制转换所有元素来创建另一个数组,如果访问的元素很少,则会产生负面影响。
    另外,如果您编写代码的方式使数组中的一个元素只需要转换一次,那么一次转换所有元素是没有用的。

    您对其进行了基准测试吗?您发现了什么?在100000次迭代的循环中进行测试应该会很快。我想您会发现这并没有显著的区别。转换很昂贵,但不会有太大的差别除非非常极端,否则性能上可能存在差异。(数组中的2个对象每个需要调用10亿次或数组中的10亿个对象,并且只需要调用2次)如果您有一个对象数组,并且知道元素是字符串类型,是否有(好的)为什么你没有一个字符串数组呢?我不同意,在移动世界中,像这样的优化可以延长电池寿命。提高了多少?如果编写一个复杂的、难以维护的、有缺陷的优化程序可以在运行一个多小时时节省1秒的电池电量,这值得吗?一旦你完成了应用程序,那么是时候看看运行了什么了我也不同意,但原因完全不同——你应该始终对如何创建真正好的代码有一个问心无愧的想法。了解哪些实践更有效非常有用,这样可以提供两个同样可维护/清晰的实现选项你选对了。这不是过早的优化,只是很好的编码。
    for (int x=0; x<whatever.length; ++x)
    {
        System.out.println(whatever[x].toString());
    }