哪个更快:
a
Set
每个元素都是CustomObject
的一个实例定义如下:public class CustomObject{ private static String A; private static String B; private static String C; public static String getA(){ return A; } public static getB(){ return B; } public static getC(){ return C; } }
a
Set
每个元素都是Map<String, String>
的一个实例其中每个 Map 的格式为{"A" : Avalue, "B" : Bvalue, "C" : Cvalue}
?或您能想到的任何其他可以更好地捕获此数据的数据结构
如果我想获取所有具有属性/键 A == "somevalue"的对象/ map 的子集?
您可以使用 .filter ,或任何其他库。另外,如果集合很大,答案会改变吗?
编辑:我的一位同事告诉我,自定义类的运行时间比散列图快——那么为什么有人会使用散列图呢?
最佳答案
我假设我们正在比较 Map<String, String>
到这样的等效自定义类型:
public class CustomObject {
private String a, b, c;
public CustomObject(String a, String b, String c) {
this.a = a; this.b = b; this.c = c;
}
public String getA() { return a; }
public String getB() { return b; }
public String getC() { return c; }
}
如果我们比较的操作是obj.getA()
与 map.get("A")
,那么自定义 map 会更快,大概快1到2个数量级。是的……快了很多。
另一方面,如果我们把 CustomObject
实例到一组“混合类型”对象中,我们对其字段一无所知,然后调用 getA
变得更加困难/昂贵,Map
解决方案当然更简单,也可能更快。 (这取决于您可以做出的假设。)
Also, does the answer change if the set is large?
没有。它不会显着改变性能特征。
Why would anyone ever use a hashmap, then?
更好/必须使用 Map
的用例是当可能的键集在编译时未知。这意味着你不能写 CustomClass
作为带有手写源代码的常规类。
事实上,在大多数情况下,应根据两种方法的相对代码简单性和稳健性来决定您采用的方法。如果 key 是静态的,则 obj.getA()
方法不仅更快。它也更健壮,因为你不会不小心写出类似 map.get("a")
的东西而不是 map.get("A")
...这将返回意外的 null
并可能导致 NPE。如果 key 是动态的/在编译时未知,则 map.get("A")
更简单,可能更健壮。
关于java - 自定义 Java 类与映射的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32192416/