栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java中的HashMap和Map对象之间有什么区别?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中的HashMap和Map对象之间有什么区别?

对象之间没有区别;

HashMap<String, Object>
在两种情况下,你都有一个。你与对象之间的接口有所不同。在第一种情况下,接口为
HashMap<String, Object>
,而在第二种情况下为
Map<String, Object>
。但是底层对象是相同的。

使用

Map<String, Object>
它的好处是你可以将基础对象更改为另一种类型的映射,而不会与使用它的任何代码破坏合同。如果将其声明为
HashMap<String, Object>
,则要更改基础实现,则必须更改合同。

示例:假设我编写了此类:

class Foo {    private HashMap<String, Object> things;    private HashMap<String, Object> moreThings;    protected HashMap<String, Object> getThings() {        return this.things;    }    protected HashMap<String, Object> getMoreThings() {        return this.moreThings;    }    public Foo() {        this.things = new HashMap<String, Object>();        this.moreThings = new HashMap<String, Object>();    }    // ...more...}

该类有一些

string-> object
的内部映射,它与子类共享(通过访问器方法)。假设我以
HashMaps
开头,因为我认为这是编写类时要使用的适当结构。

后来,玛丽编写了将其子类化的代码。她与

thingsand
都需要做一些事情
moreThings
,因此自然而然地将它放在一个通用方法中,并且在定义她的方法时使用与
getThings/
上使用的类型相同的类型
getMoreThings

class SpecialFoo extends Foo {    private void doSomething(HashMap<String, Object> t) {        // ...    }    public void whatever() {        this.doSomething(this.getThings());        this.doSomething(this.getMoreThings());    }    // ...more...}

后来,我决定实际上,最好使用

TreeMap
而不是
HashMapin Foo
。我更新
Foo
,更改
HashMap
TreeMap
。现在,
SpecialFoo
不再编译了,因为我违反了合同:Foo曾经说它提供了HashMaps,但是现在提供了
TreeMaps
。因此,我们必须立即修复
SpecialFoo
(这种情况可能会在代码库中引起涟漪)。

除非我有一个很好的理由要分享我的实现正在使用HashMap(并且确实发生了),否则我应该做的就是声明,

getThings
然后
getMoreThings
返回
Map<String, Object>
而没有任何更具体的说明。实际上,除非有充分的理由做其他事情,甚至在Foo我可能应该将things和声明
moreThings
as Map
,而不是
HashMap/ TreeMap

class Foo {    private Map<String, Object> things;  // <== Changed    private Map<String, Object> moreThings;         // <== Changed    protected Map<String, Object> getThings() {     // <== Changed        return this.things;    }    protected Map<String, Object> getMoreThings() { // <== Changed        return this.moreThings;    }    public Foo() {        this.things = new HashMap<String, Object>();        this.moreThings = new HashMap<String, Object>();    }    // ...more...}

请注意,我现在正在如何尽可能地使用

Map<String, Object>
它,仅在创建实际对象时才具体说明。

如果我这样做了,那么玛丽就会做到这一点:

class SpecialFoo extends Foo {    private void doSomething(Map<String, Object> t) { // <== Changed        // ...    }    public void whatever() {        this.doSomething(this.getThings());        this.doSomething(this.getMoreThings());    }}

…而且更改

Foo
不会使
SpecialFoo
编译停止。

接口(和基类)使我们仅显示必要的内容,因此可以灵活地进行更改。总的来说,我们希望参考文献尽可能基本。如果我们不需要知道它是

a HashMap
,则称它为
a Map

这不是盲目的规则,但总的来说,与最特定的接口编码相比,对最通用的接口进行编码将不那么困难。如果我还记得这一点,那我就不会创建一个Foo将Mary设置为失败的

SpecialFoo
。如果Mary记得这一点,那么即使我搞砸了
Foo
,她也会用
Map
而不是声明自己的私有方法,而
HashMap
我更改
Foo
的合同不会影响她的代码。

有时候你做不到,有时候你必须要具体。但是除非有理由,否则请偏向最不具体的界面。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/456490.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号