1

私はここでジョンの答えを見ていて、それはかなり滑らかだと思いました。ifステートメントでさらに改善できるかどうか疑問に思っていましたが、ifステートメントのパフォーマンスが向上するかどうかはわかりません。

ifステートメントは、文字列の値を変更するよりも「コストがかかる」のでしょうか。

String prefix = "";
for (String serverId : serverIds) {
  sb.append(prefix);
  prefix = ",";
  sb.append(serverId);
}

VS.

String prefix = "";
for (String serverId : serverIds) {
  sb.append(prefix);
  if( prefix.equals( "" ) {
      prefix = ",";
  }
  sb.append(serverId);
}
4

2 に答える 2

2

2 番目のバージョンは明らかに遅くなります。これは単なる if 呼び出しではなく、equals 呼び出しでもあり、ほとんどの場合、比較される 2 つの文字列は異なるため、equals メソッドは早期に返されません。代わりに、単純な代入よりも多くの作業を行います (ソース コードを確認してください)。詳細については、String の equals メソッドの説明を参照してください)。

もちろん、ほとんどの場合、読みやすさは速度よりも重要であり、Guava Joiner は非常に明確なコードを作成するのに役立ちます。

于 2013-01-03T21:08:46.730 に答える
1

その他のバージョン

boolean addPrefix = false;
for (String serverId : serverIds) {
  if (addPrefix) {       // it's better than String.equals
      sb.append(',');    // append char is faster than append String
  } else {
      addPrefix = true;  
  }
  sb.append(serverId);
}

serverIdsが空になることはないと仮定すると、これは代替手段になる可能性があります

for (String serverId : serverIds) {
     sb.append(serverId).append(',');
}
sb.deleteCharAt(sb.length() - 1);

serverIdsがリストの場合、for-eachを使用しないでください-Iterator(オブジェクト)を作成し、Iterator.nextが同時変更をチェックします

for (int i = 0; i < serverIds.size(); i++) {
  if (i > 0) {
      sb.append(',');
  }
  sb.append(serverId.get(i));
}

アレイの場合は

for (int i = 0; i < serverIds.length; i++) {
  if (i > 0) {
      sb.append(',');
  }
  sb.append(serverId[i]);
}
于 2013-01-04T00:44:39.430 に答える