如果我正在构建一个linkhashmap并返回一个地图,我的调用函数是否会有一个linkedhashmap

时间:2017-05-22 10:57:58

标签: java polymorphism linkedhashmap

我有一个方法可以构建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

2 个答案:

答案 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