Java中Map与Optional的性能
我对这两件事之间的性能差异有疑问,直接从带有键的哈希映射中获取对象,而不是从 ArrayList 中的 Optional 中获取它。我将使用这些来保存大量数据。
注意:下面的例子只是为了说明我的意思;除了在实用程序或特定事物中,我不使用静态,我这样说是为了防止对静态进行评论。
public class Main {
private static final List<User> users = Arrays.asList(new User(UUID.randomUUID()), new User(UUID.randomUUID()), new User(UUID.randomUUID()));
public static Optional<User> getUserByUUID(final UUID uuid){
return users.stream().filter(user -> user.getUuid().equals(uuid)).findFirst();
}
@RequiredArgsConstructor
@Getter@Setter
private static class User{
private final UUID uuid;
private int points;
private int gems;
}
}
对比
public class Main {
private static final Map<UUID, User> users = new HashMap<UUID, User>(){{
put(UUID.randomUUID(), new User());
put(UUID.randomUUID(), new User());
}};
public static User getUserByUUID(final UUID uuid){
if(users.containsKey(uuid))
return users.get(uuid);
return null;
}
@RequiredArgsConstructor
@Getter@Setter
private static class User{
private int points;
private int gems;
}
}
我的观点是,如果在性能方面一个比另一个好,它是微不足道的吗?
回答
Map#get总是比Stream从 a创建aList并寻找特定条目的性能更高。
Map#get会给你一个O(1)基本上的时间复杂度
List#stream相反会给你一个O(n)额外的空间复杂度的时间复杂度:a的创建和a的Stream创建Optional
也就是说,如果您在内存中加载了大量数据,这可能会导致性能问题/ OutOfMemoryErrors
进一步挖掘问题并看看是否没有另一种方法来处理这个特定问题而不直接在 JVM 的内存中加载大量数据会很有趣