Java におけるコードの最適化
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
空間計算量と時間計算量について学びました。
この知識をどう活かせば、より効率的なコードを書けるのでしょうか?
適切なデータ構造を選ぶことです。
ユーザー管理システムを構築しています
特定のユーザー名について、ユーザーが存在するかを確認する必要があります
リストを使う場合の計算量: $O(n)$
public boolean usernameExists(ArrayList<String> users, String newUsername) {
for (String username : users) {
if (username.equals(newUsername)) {
return true;
}
}
return false;
}
改善したユーザー管理システムの解決策:
public class UserRegistry {
private HashSet<String> users = new HashSet<>();
public boolean userExists(String username) {
return users.contains(username); // O(1) average time
}
}
HashMap: 操作の平均計算量は $O(1)$ ですpublic class UserCache {
private HashMap<String, UserProfile> userProfiles = new HashMap<>();
public UserProfile getUser(String username) {
return userProfiles.get(username); // O(1) average time
}
}
hashCode()ArrayList の例では、検索するユーザー名のインデックスが分かりませんでしたhashcode() メソッドを使うと、オブジェクトを検索可能なインデックスに変換できますpavlos.2020 -> 35189
HashMap と HashSet は内部的に配列を使っていますhashCode() を呼び出し、整数を取得します例:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
"optimizingCodeInJava" -> 1406313774 // Implemented by Java
1406313774 % 16 = 14 <- that's our bucket!
LinkedList を使いますデータ構造の選択は、作業に適した道具を選ぶことに似ています。ハンマー(ArrayList)は釘には最適ですが、ネジには不向きです(Set の方が適している場合もあります)。

Java におけるコードの最適化