我有一个方法可以构建LinkedHashMap
,这样我就可以保留顺序。这是我的方法:
public class MyClass {
public Map<String,MyObj> buildMap() {
Map<String,MyObj> myMap = new LinkedHashMap<>();
//perform logic and add objects to myMap
...
return myMap;
}
}
当我从另一个班级调用我的buildMap()
函数时,我是否会得到一张仍然有序的地图?像:
MyClass myClass = new MyClass();
Map<String, MyObj> returnedMap = myClass.buildMap();
我的returnedMap
仍然是LinkedHashMap
吗?
或者我是否必须将buildMap
功能更改为始终返回LinkedHashMap
?
答案 0 :(得分:3)
返回什么类型或接口无关紧要。但是,对象实例类型确实很重要。如果它是LinkedHashMap
那么它将保留实现,所以你的情况下的顺序。
此实现通常会将客户从未指定的客户端中删除 由
HashMap
(和Hashtable
)提供的混乱排序,没有 导致与TreeMap
相关的成本增加。它可以使用 生成与原始订单具有相同顺序的地图副本, 无论原始地图的实施如何:void foo(Map m) { Map copy = new LinkedHashMap(m); ... }
答案 1 :(得分:2)
另一个答案是正确的 - 您在源代码中使用的返回类型无关紧要,以表达您的想法。
在运行时,对象的本质唯一重要的是它具体的特定类。
但要考虑的一个方面是:如果“保持广告订单顺序”是您提供给用户的API的核心元素,则可能会更改你的方法:
public LinkedHashMap<String,MyObj> buildMap() {
简单地向该方法的所有未来用户清除该方法正在做什么。
你看,LinkedHashMap和HashMap有略微不同的performance特征。根据您的上下文,可能对于未来的调用者来说非常重要,以便了解该方法实际上将返回此特殊的Map实现。
但是在mos情况下,这种差异并不重要,然后返回更抽象的接口类型而不是特定的实现类是“好习惯”。有关为何更喜欢 interface 类型的原因,请参阅here。